Managing stateful resources safely and expressively is a longstanding challenge in programming languages, especially in the presence of aliasing. While scope-based constructs such as Java's synchronized blocks offer ease of reasoning, they restrict expressiveness and parallelism. Conversely, imperative, flow-sensitive management enables fine-grained control but demands sophisticated typestate analyses and often burdens programmers with explicit state tracking.
In this work, we present a novel approach that unifies the strengths of both paradigms by extending flow-insensitive capability mechanisms into flow-sensitive typestate tracking. Our system decouples capability lifetimes from lexical scopes, allowing functions to provide, revoke, and return capabilities in a flow-sensitive manner, based on the existing mechanisms explored for the safety and ergonomics of scoped capability programming.
We implement our approach as an extension to the Scala 3 compiler, leveraging path-dependent types and implicit resolution to enable concise, statically safe, and expressive typestate programming. Our prototype generically supports a wide range of stateful patterns, including file operations, advanced locking protocols, DOM construction, and session types. This work demonstrates that expressive and safe typestate management can be achieved with minimal extensions to existing capability-based languages, paving the way for more robust and ergonomic stateful programming.
āĻĒā§āĻĒāĻžāϰ āĻāĻāĻĄāĻŋ : 2510.08889āĻļāĻŋāϰā§āύāĻžāĻŽ : Typestate via Revocable CapabilitiesāϞā§āĻāĻ : Songlin Jia, Craig Liu, Siyuan He, Haotian Deng, Yuyan Bao, Tiark Rompf (Purdue University & Augusta University)āĻļā§āϰā§āĻŖā§āĻŦāĻŋāĻāĻžāĻ : cs.PL (āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻŋāĻ āĻāĻžāώāĻž)āĻĒā§āϰāĻāĻžāĻļāύāĻžāϰ āϏāĻŽāϝāĻŧ : ⧍ā§Ļ⧍ā§Ģ āϏāĻžāϞā§āϰ ā§§ā§Ļ āĻ
āĻā§āĻā§āĻŦāϰ (arXiv āĻĒā§āϰāĻŋ-āĻĒā§āϰāĻŋāύā§āĻ)āĻĒā§āĻĒāĻžāϰ āϞāĻŋāĻā§āĻ : https://arxiv.org/abs/2510.08889 āĻāĻ āĻĒā§āĻĒāĻžāϰāĻāĻŋ āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰāϝā§āĻā§āϝ āĻā§āώāĻŽāϤāĻž (revocable capabilities) āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻāĻžāĻāĻĒāϏā§āĻā§āĻ (typestate) āĻā§āϰā§āϝāĻžāĻāĻŋāĻ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύā§āϰ āĻāĻāĻāĻŋ āύāϤā§āύ āĻĒāĻĻā§āϧāϤāĻŋ āĻĒā§āϰāϏā§āϤāĻžāĻŦ āĻāϰā§āĨ¤ āĻāĻ āĻĒāĻĻā§āϧāϤāĻŋāĻāĻŋ āϏā§āĻā§āĻĒ-āĻāĻŋāϤā§āϤāĻŋāĻ āύāĻŋāϰāĻžāĻĒāϤā§āϤāĻž āĻāĻŦāĻ āĻāĻĻā§āĻļāĻŽā§āϞāĻ āĻĒā§āϰāĻŦāĻžāĻš-āϏāĻāĻŦā§āĻĻāύāĻļā§āϞ āĻŦā§āϝāĻŦāϏā§āĻĨāĻžāĻĒāύāĻžāϰ āĻĒā§āϰāĻāĻžāĻļāύā§āϝāĻŧāϤāĻžāĻā§ āĻāĻā§āĻā§āϤ āĻāϰā§, āĻĒā§āϰāĻŦāĻžāĻš-āĻ
āϏāĻāĻŦā§āĻĻāύāĻļā§āϞ āĻā§āώāĻŽāϤāĻž āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻā§ āĻĒā§āϰāĻŦāĻžāĻš-āϏāĻāĻŦā§āĻĻāύāĻļā§āϞ āĻāĻžāĻāĻĒāϏā§āĻā§āĻ āĻā§āϰā§āϝāĻžāĻāĻŋāĻāϝāĻŧā§ āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻāϰ⧠āĻ
āĻŦāϏā§āĻĨāĻž āϏāĻŽā§āĻĒāĻĻ āĻŦā§āϝāĻŦāϏā§āĻĨāĻžāĻĒāύāĻžāϰ āĻĻā§āϰā§āĻāϏā§āĻĨāĻžāϝāĻŧā§ āĻā§āϝāĻžāϞā§āĻā§āĻ āϏāĻŽāĻžāϧāĻžāύ āĻāϰā§āĨ¤ āϏāĻŋāϏā§āĻā§āĻŽāĻāĻŋ āĻā§āώāĻŽāϤāĻž āĻā§āĻŦāύāĻāĻā§āϰ āĻāĻŦāĻ āĻļāĻŦā§āĻĻāĻāĻžāĻŖā§āĻĄāĻžāϰ āϏā§āĻā§āĻĒāĻā§ āĻŦāĻŋāĻā§āĻāĻŋāύā§āύ āĻāϰā§, āĻĢāĻžāĻāĻļāύāĻā§āϞāĻŋāĻā§ āĻĒā§āϰāĻŦāĻžāĻš-āϏāĻāĻŦā§āĻĻāύāĻļā§āϞ āĻāĻĒāĻžāϝāĻŧā§ āĻā§āώāĻŽāϤāĻž āĻĒā§āϰāĻĻāĻžāύ, āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāĻŦāĻ āĻĒā§āϰāϤā§āϝāĻžāĻŦāϰā§āϤāύ āĻāϰāϤ⧠āĻ
āύā§āĻŽāϤāĻŋ āĻĻā§āϝāĻŧāĨ¤ āϞā§āĻāĻāϰāĻž Scala 3 āĻāĻŽā§āĻĒāĻžāĻāϞāĻžāϰ⧠āĻāĻ āĻĒāĻĻā§āϧāϤāĻŋāĻāĻŋ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āĻāϰā§āĻā§āύ, āĻĒāĻĨ-āύāĻŋāϰā§āĻāϰ āĻĒā§āϰāĻāĻžāϰ āĻāĻŦāĻ āĻ
āύā§āϤāϰā§āύāĻŋāĻšāĻŋāϤ āϏāĻŽāĻžāϧāĻžāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϏāĻāĻā§āώāĻŋāĻĒā§āϤ, āϏā§āĻā§āϝāĻžāĻāĻŋāĻāĻāĻžāĻŦā§ āύāĻŋāϰāĻžāĻĒāĻĻ āĻāĻŦāĻ āϏāĻŽā§āĻĻā§āϧ āĻĒā§āϰāĻāĻžāĻļāύā§āϝāĻŧ āĻāĻžāĻāĻĒāϏā§āĻā§āĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻŋāĻ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āĻāϰā§āĻā§āύāĨ¤
āĻ
āĻŦāϏā§āĻĨāĻž āϏāĻŽā§āĻĒāĻĻ āĻŦā§āϝāĻŦāϏā§āĻĨāĻžāĻĒāύāĻžāϰ āĻĻā§āĻŦāĻŋāϧāĻž :āϏā§āĻā§āĻĒ-āĻāĻŋāϤā§āϤāĻŋāĻ āύāĻŋāϰā§āĻŽāĻžāĻŖ (āϝā§āĻŽāύ Java āĻāϰ synchronized āĻŦā§āϞāĻ) āϝā§āĻā§āϤāĻŋ āĻāϰāĻž āϏāĻšāĻ āĻāĻŋāύā§āϤ⧠āĻĒā§āϰāĻāĻžāĻļāύā§āϝāĻŧāϤāĻž āĻāĻŦāĻ āϏāĻŽāĻžāύā§āϤāϰāĻžāϞāϤāĻž āϏā§āĻŽāĻžāĻŦāĻĻā§āϧ āĻāϰ⧠āĻāĻĻā§āĻļāĻŽā§āϞāĻ āĻĒā§āϰāĻŦāĻžāĻš-āϏāĻāĻŦā§āĻĻāύāĻļā§āϞ āĻŦā§āϝāĻŦāϏā§āĻĨāĻžāĻĒāύāĻž āϏā§āĻā§āώā§āĻŽ-āĻĻāĻžāύāĻžāĻĻāĻžāϰ āύāĻŋāϝāĻŧāύā§āϤā§āϰāĻŖ āĻĒā§āϰāĻĻāĻžāύ āĻāϰ⧠āĻāĻŋāύā§āϤ⧠āĻāĻāĻŋāϞ āĻāĻžāĻāĻĒāϏā§āĻā§āĻ āĻŦāĻŋāĻļā§āϞā§āώāĻŖ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻĒāĻĻā§āϧāϤāĻŋāϰ āϏā§āĻŽāĻžāĻŦāĻĻā§āϧāϤāĻž :āϏā§āĻā§āĻĒ āĻĒāĻĻā§āϧāϤāĻŋ LIFO (āĻļā§āώ⧠āĻāϏāĻž āĻĒā§āϰāĻĨāĻŽā§ āϝāĻžāĻāϝāĻŧāĻž) āĻā§āĻŦāύāĻāĻā§āϰ āĻā§āϰāĻĒā§āϰā§āĻŦāĻ āĻāϰā§, āĻ
āĻĒā§āĻāĻŋāĻŽāĻžāĻāĻā§āĻļāύ āĻŦāĻžāϧāĻž āĻĻā§āϝāĻŧ āĻĒā§āϰāĻŦāĻžāĻš-āϏāĻāĻŦā§āĻĻāύāĻļā§āϞ āĻĒāĻĻā§āϧāϤāĻŋ āĻāĻāĻŋāϞ āĻāĻĒāύāĻžāĻŽ āĻā§āϰā§āϝāĻžāĻāĻŋāĻ āĻāĻŦāĻ āϏā§āĻĒāώā§āĻ āĻ
āĻŦāϏā§āĻĨāĻž āĻŦā§āϝāĻŦāϏā§āĻĨāĻžāĻĒāύāĻž āĻĒā§āϰāϝāĻŧā§āĻāύ āύāĻŋāϰāĻžāĻĒāϤā§āϤāĻž āĻāĻŦāĻ āĻĒā§āϰāĻāĻžāĻļāύā§āϝāĻŧāϤāĻžāϰ āĻāĻā§āĻā§āϤ āύāĻŋāĻļā§āĻāϝāĻŧāϤāĻžāϰ āĻ
āĻāĻžāĻŦ āĻāĻŦā§āώāĻŖāĻž āĻĒā§āϰā§āϰāĻŖāĻž :āĻāĻŽāύ āĻāĻāĻāĻŋ āĻĒāĻĻā§āϧāϤāĻŋāϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āϝāĻž āϏā§āĻā§āĻĒ āϝā§āĻā§āϤāĻŋāϰ āϏāϰāϞāϤāĻž āĻŦāĻāĻžāϝāĻŧ āϰā§āĻā§ āĻāĻĻā§āĻļāĻŽā§āϞāĻ āĻŦā§āϝāĻŦāϏā§āĻĨāĻžāĻĒāύāĻžāϰ āĻĒā§āϰāĻāĻžāĻļāύā§āϝāĻŧāϤāĻž āĻĒā§āϰāĻĻāĻžāύ āĻāϰ⧠āĻāĻĒāύāĻžāĻŽ āĻāĻĒāϏā§āĻĨāĻŋāϤāĻŋāϤ⧠āύāĻŋāϰāĻžāĻĒāĻĻ āĻ
āĻŦāϏā§āĻĨāĻž āϏāĻŽā§āĻĒāĻĻ āĻŦā§āϝāĻŦāϏā§āĻĨāĻžāĻĒāύāĻž āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āĻāϰāĻž āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻā§āώāĻŽāϤāĻž-āĻāĻŋāϤā§āϤāĻŋāĻ āĻāĻžāώāĻžāϝāĻŧ āĻāĻžāĻāĻĒāϏā§āĻā§āĻ āϏāĻŽāϰā§āĻĨāύā§āϰ āĻāύā§āϝ āύā§āϝā§āύāϤāĻŽ āϏāĻŽā§āĻĒā§āϰāϏāĻžāϰāĻŖ āĻĒā§āϰāĻĻāĻžāύ āĻāϰāĻž āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰāϝā§āĻā§āϝ āĻā§āώāĻŽāϤāĻž āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻĒā§āϰāϏā§āϤāĻžāĻŦ :āĻĒā§āϰāĻŦāĻžāĻš-āĻ
āϏāĻāĻŦā§āĻĻāύāĻļā§āϞ āĻā§āώāĻŽāϤāĻž āϏāĻŋāϏā§āĻā§āĻŽāĻā§ āĻĒā§āϰāĻŦāĻžāĻš-āϏāĻāĻŦā§āĻĻāύāĻļā§āϞ āĻāĻžāĻāĻĒāϏā§āĻā§āĻ āĻā§āϰā§āϝāĻžāĻāĻŋāĻ āϏāĻŽāϰā§āĻĨāύ āĻāϰāĻžāϰ āĻāύā§āϝ āϏāĻŽā§āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻāϰāĻž āϤāĻŋāύāĻāĻŋ āĻŽā§āϞ āĻĒā§āϰāϝā§āĻā§āϤāĻŋāĻāϤ āϏā§āϤāĻŽā§āĻ :āĻĒā§āϰāĻŦāĻžāĻš-āϏāĻāĻŦā§āĻĻāύāĻļā§āϞ āĻŦāĻŋāύāĻžāĻļāĻāĻžāϰ⧠āĻĒā§āϰāĻāĻžāĻŦ āϏāĻŋāϏā§āĻā§āĻŽ (destructive effect system) āĻĒāĻĨ-āύāĻŋāϰā§āĻāϰ āĻĒā§āϰāĻāĻžāϰ-āĻāĻŋāϤā§āϤāĻŋāĻ āĻā§āώāĻŽāϤāĻž-āĻŦāϏā§āϤ⧠āĻĒāϰāĻŋāĻāϝāĻŧ āϏāĻāϝā§āĻ āĻĒā§āϰāĻāĻžāϰ-āύāĻŋāϰā§āĻĻā§āĻļāĻŋāϤ ANF āϰā§āĻĒāĻžāύā§āϤāϰ āĻ
āύā§āϤāϰā§āύāĻŋāĻšāĻŋāϤ āĻā§āώāĻŽāϤāĻž āĻŦā§āϝāĻŦāϏā§āĻĨāĻžāĻĒāύāĻž āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύā§āϰ āĻāύā§āϝ āϏāĻŽā§āĻĒā§āϰā§āĻŖ Scala 3 āĻĒā§āϰā§āĻā§āĻāĻžāĻāĻĒ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ :Scala 3 āĻāĻŽā§āĻĒāĻžāĻāϞāĻžāϰ āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻāϰāĻž, āĻāĻāĻžāϧāĻŋāĻ āĻ
āĻŦāϏā§āĻĨāĻž āĻĒā§āϝāĻžāĻāĻžāϰā§āύ āϏāĻŽāϰā§āĻĨāύ āĻāϰāĻž āĻŦā§āϝāĻžāĻĒāĻ āĻĒā§āϰāϝāĻŧā§āĻ āϝāĻžāĻāĻžāĻāĻāϰāĻŖ :āĻĢāĻžāĻāϞ āĻ
āĻĒāĻžāϰā§āĻļāύ, āĻāύā§āύāϤ āϞāĻ āĻĒā§āϰā§āĻā§āĻāϞ, DOM āύāĻŋāϰā§āĻŽāĻžāĻŖ, āϏā§āĻļāύ āĻĒā§āϰāĻāĻžāϰ āĻāϤā§āϝāĻžāĻĻāĻŋ āĻāĻāĻžāϧāĻŋāĻ āĻā§āώā§āϤā§āϰ⧠āĻā§āϏ āϏā§āĻāĻžāĻĄāĻŋ āĻāĻ āĻĒā§āĻĒāĻžāϰāĻāĻŋ āϝ⧠āĻŽā§āϞ āĻāĻžāĻāĻāĻŋ āϏāĻŽāĻžāϧāĻžāύ āĻāϰ⧠āϤāĻž āĻšāϞ: āĻāĻĒāύāĻžāĻŽ āĻāĻĒāϏā§āĻĨāĻŋāϤāĻŋāϤ⧠āĻāĻā§āĻ-āĻā§āϰāĻŽ āĻĢāĻžāĻāĻļāύāĻžāϞ āĻāĻžāώāĻžāϝāĻŧ, āύāĻŋāϰāĻžāĻĒāĻĻ āĻāĻŦāĻ āϏāĻŽā§āĻĻā§āϧ āĻĒā§āϰāĻāĻžāĻļāύā§āϝāĻŧ āĻ
āĻŦāϏā§āĻĨāĻž āϏāĻŽā§āĻĒāĻĻ āĻŦā§āϝāĻŦāϏā§āĻĨāĻžāĻĒāύāĻž āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻĒā§āϰāĻĻāĻžāύ āĻāϰāĻž, āϝāĻž āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻžāϰāĻĻā§āϰ āϏāĻā§āώāĻŽ āĻāϰā§:
āϏāĻŽā§āĻĒāĻĻ āĻŦā§āϝāĻŦāĻšāĻžāϰā§āϰ āύāĻŋāϰāĻžāĻĒāϤā§āϤāĻž āϏā§āĻā§āϝāĻžāĻāĻŋāĻāĻāĻžāĻŦā§ āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāĻž āύāĻŽāύā§āϝāĻŧ āĻ
-LIFO āϏāĻŽā§āĻĒāĻĻ āĻā§āĻŦāύāĻāĻā§āϰ āĻŦā§āϝāĻŦāϏā§āĻĨāĻžāĻĒāύāĻž āϏāĻŽāϰā§āĻĨāύ āĻāϰāĻž āϏā§āĻĒāώā§āĻ āĻ
āĻŦāϏā§āĻĨāĻž āĻā§āϰā§āϝāĻžāĻāĻŋāĻ āĻŦā§āĻāĻž āĻāĻĄāĻŧāĻžāύ⧠āĻŦāĻŋāύāĻžāĻļāĻāĻžāϰ⧠āĻĒā§āϰāĻāĻžāĻŦ āϏāĻŋāϏā§āĻā§āĻŽ :
def close(f: OpenFile^): ClosedFile^ @kill(f) = ...
@kill(f) āĻā§āĻāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĢāĻžāĻāĻļāύ āϝāĻž āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋ f āĻāϰ āĻā§āώāĻŽāϤāĻž āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰ⧠āϤāĻž āĻāĻŋāĻšā§āύāĻŋāϤ āĻāϰāĻžāĻŽā§āϤ āĻāϞāĻ {k: ...} āĻāϰ āϏāĻāĻā§āĻšā§āϤ āϏā§āĻ āĻŦāĻāĻžāϝāĻŧ āϰāĻžāĻāĻž āĻā§āϰāĻžāύāĻāĻŋāĻāĻŋāĻ āĻŦāĻŋāĻā§āĻāĻŋāύā§āύāϤāĻž āĻĒāϰā§āĻā§āώāĻžāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻĒā§āύāϰā§āĻĻā§āϧā§āϤ āĻā§āώāĻŽāϤāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻĒā§āϰāϤāĻŋāϰā§āϧ āĻāϰāĻž āϤā§āϰ āĻĒā§āϰāĻāĻžāϰ āϏā§āĻŦāϰāϞāĻŋāĻĒāĻŋ :
=!>: āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋ āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰ⧠āĻāĻŽāύ āϤā§āϰ āĻĒā§āϰāĻāĻžāϰ?=!>: āĻ
āύā§āϤāϰā§āύāĻŋāĻšāĻŋāϤ āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āϤā§āϰ āĻĒā§āϰāĻāĻžāϰ?<=>: āĻ
āύā§āϤāϰā§āύāĻŋāĻšāĻŋāϤ āϰāĻŋāĻāĻžāϰā§āύ āϤā§āϰ āĻĒā§āϰāĻāĻžāϰ?=!>?: āϏāĻŽāύā§āĻŦāĻŋāϤ āϤā§āϰ, āĻā§āϰāĻšāĻŖ-āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ-āϰāĻŋāĻāĻžāϰā§āύā§āϰ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻ
āĻŦāϏā§āĻĨāĻž āϰā§āĻĒāĻžāύā§āϤāϰ āĻĒā§āϰāĻāĻžāĻļ āĻāϰā§āϏāĻŽāϏā§āϝāĻž : āĻāϤāĻŋāĻšā§āϝāĻŦāĻžāĻšā§ āĻĒāĻĻā§āϧāϤāĻŋ āĻāĻāĻ āĻŦāϏā§āϤā§āϤ⧠āĻ
āĻŦāϏā§āĻĨāĻž āϰā§āĻĒāĻžāύā§āϤāϰ āĻ
āĻĒāĻžāϰā§āĻļāύ āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āύāĻž
āϏāĻŽāĻžāϧāĻžāύ : āĻĒāĻĨ-āύāĻŋāϰā§āĻāϰ āĻĒā§āϰāĻāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻā§āώāĻŽāϤāĻž āĻŦāϏā§āϤ⧠āĻĒāϰāĻŋāĻāϝāĻŧā§āϰ āϏāĻžāĻĨā§ āϏāĻāϝā§āĻā§āϤ āĻāϰāĻž
class File:
type IsClosed // āĻŦāĻŋāĻŽā§āϰā§āϤ āĻĒā§āϰāĻāĻžāϰ āϏāĻĻāϏā§āϝ
type IsOpen
def openDep(f: File, c: f.IsClosed^): f.IsOpen^ @kill(c) = ...
ÎŖ āĻĒā§āϰāĻāĻžāϰ āϏāĻŽāϰā§āĻĨāύ : āύāĻŋāϰā§āĻāϰ āĻā§āĻĄāĻŧ (dependent pairs) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻāϏāĻžāĻĨā§ āϏāĻŽā§āĻĒāĻĻ āĻāĻŦāĻ āĻā§āώāĻŽāϤāĻž āϰāĻŋāĻāĻžāϰā§āύ āĻāϰāĻž
trait Sigma:
type A
type B
val a: A
val b: B
def newFile(name: String): Sigma { type A = File; type B = a.IsClosed^ } = ...
āĻĒā§āϰāĻāĻžāϰ-āύāĻŋāϰā§āĻĻā§āĻļāĻŋāϤ ANF āϰā§āĻĒāĻžāύā§āϤāϰ :
Sigma āĻĒā§āϰāĻāĻžāϰ āϧāĻžāϰāĻŖāĻāĻžāϰ⧠āĻ
āĻāĻŋāĻŦā§āϝāĻā§āϤāĻŋ āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧāĻāĻžāĻŦā§ āĻĒā§āύāϰā§āĻāĻ āύ āĻāϰāĻž āĻĒā§āϰāĻĨāĻŽ āĻā§āώā§āϤā§āϰ āύāĻŋāώā§āĻāĻžāĻļāύ āĻāĻŦāĻ āĻāĻāĻ āĻĒā§āϰāĻāĻžāϰ āύāĻŋāϰā§āϧāĻžāϰāĻŖ āĻāϰāĻž āĻĻā§āĻŦāĻŋāϤā§āϝāĻŧ āĻā§āώā§āϤā§āϰāĻā§ āĻ
āύā§āϤāϰā§āύāĻŋāĻšāĻŋāϤ āĻĒā§āϰāĻžāϰā§āĻĨā§ āĻšāĻŋāϏāĻžāĻŦā§ āĻā§āώāĻŖāĻž āĻāϰāĻž āĻ
āύā§āϤāϰā§āύāĻŋāĻšāĻŋāϤ ÎŖ āĻāύā§āύāϝāĻŧāύ :
āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧāĻāĻžāĻŦā§ āϰāĻŋāĻāĻžāϰā§āύ āĻŽāĻžāύ Sigma āĻā§āĻĄāĻŧā§āϰ āĻĒā§āϰāĻĨāĻŽ āĻā§āώā§āϤā§āϰ⧠āĻāύā§āύā§āϤ āĻāϰāĻž āĻ
āύā§āϤāϰā§āύāĻŋāĻšāĻŋāϤ āĻāĻšā§āĻŦāĻžāύā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻĻā§āĻŦāĻŋāϤā§āϝāĻŧ āĻā§āώā§āϤā§āϰā§āϰ āĻā§āώāĻŽāϤāĻž āĻĒā§āϰāĻŖ āĻāϰāĻž āĻā§āώāĻŽāϤāĻž āĻā§āĻŦāύāĻāĻā§āϰ āĻāĻŦāĻ āĻļāĻŦā§āĻĻāĻāĻžāĻŖā§āĻĄāĻžāϰ āϏā§āĻā§āĻĒā§āϰ āĻŦāĻŋāĻā§āĻāĻŋāύā§āύāϤāĻž :āĻāϤāĻŋāĻšā§āϝāĻŦāĻžāĻšā§ LIFO āϏā§āĻŽāĻžāĻŦāĻĻā§āϧāϤāĻž āĻ
āϤāĻŋāĻā§āϰāĻŽ āĻāϰāĻž, āύāĻŽāύā§āϝāĻŧ āϏāĻŽā§āĻĒāĻĻ āĻŦā§āϝāĻŦāϏā§āĻĨāĻžāĻĒāύāĻž āĻĒā§āϝāĻžāĻāĻžāϰā§āύ āϏāĻŽāϰā§āĻĨāύ āĻāϰāĻž āĻĒā§āĻāĻāĻžāύā§-āϝā§āĻā§āϝāϤāĻž āĻĒā§āϰāĻāĻžāϰ-āĻāĻŋāϤā§āϤāĻŋāĻ āĻāĻĒāύāĻžāĻŽ āĻā§āϰā§āϝāĻžāĻāĻŋāĻ :āĻāϞāĻ āϏāĻŽā§āĻāĻŦāϤ āĻā§āϝāĻžāĻĒāĻāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āĻāĻŽāύ āϏāĻŽā§āĻĒāĻĻ over-approximate āĻāϰāϤ⧠āϏā§āĻŽāĻžāĻŦāĻĻā§āϧ āϏā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻā§āϰāĻžāύāĻāĻŋāĻāĻŋāĻ āĻŦāĻŋāĻā§āĻāĻŋāύā§āύāϤāĻž āĻĒāϰā§āĻā§āώāĻž āύāĻŋāϰāĻžāĻĒāϤā§āϤāĻž āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāĻž: fC* ⊠k* = â
āύā§āϝā§āύāϤāĻŽ āϏāĻŽā§āĻĒā§āϰāϏāĻžāϰāĻŖ āύā§āϤāĻŋ :āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻā§āώāĻŽāϤāĻž āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āĻāĻĒāϰ āĻāĻŋāϤā§āϤāĻŋ āĻāϰ⧠āĻāĻžāĻāĻĒāϏā§āĻā§āĻ āĻā§āϰā§āϝāĻžāĻāĻŋāĻ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύā§āϰ āĻāύā§āϝ āύā§āϝā§āύāϤāĻŽ āĻāĻžāώāĻž āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āϝā§āĻ āĻāϰāĻž āĻāĻŋāϤā§āϤāĻŋ : Scala 3 āĻāĻŽā§āĻĒāĻžāĻāϞāĻžāϰā§āϰ āĻļāĻžāĻāĻž āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύāĻ
āĻŦāĻāĻžāĻ āĻžāĻŽā§ āĻĒā§āύāϰā§āĻŦā§āϝāĻŦāĻšāĻžāϰ : āĻā§āϝāĻžāĻĒāĻāĻžāϰāĻŋāĻ āĻĒā§āϰāĻāĻžāϰ (capturing types) āĻāϰ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύāĻŽā§āϞ āϏāĻŽā§āĻĒā§āϰāϏāĻžāϰāĻŖ : āĻŦāĻŋāύāĻžāĻļāĻāĻžāϰ⧠āĻĒā§āϰāĻāĻžāĻŦ āĻā§āĻāĻžāϰ + āĻĒā§āϰāĻāĻžāϰ-āύāĻŋāϰā§āĻĻā§āĻļāĻŋāϤ ANF āϰā§āĻĒāĻžāύā§āϤāϰāĻāĻ āĻĒā§āĻĒāĻžāϰāĻāĻŋ āĻāϤāĻŋāĻšā§āϝāĻŦāĻžāĻšā§ āĻāϰā§āĻŽāĻā§āώāĻŽāϤāĻž āĻŦā§āĻā§āĻāĻŽāĻžāϰā§āĻā§āϰ āĻĒāϰāĻŋāĻŦāϰā§āϤ⧠āĻā§āϏ āϏā§āĻāĻžāĻĄāĻŋ āĻĒāĻĻā§āϧāϤāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āĻĒā§āϰāĻāĻžāĻļāύā§āϝāĻŧāϤāĻž āĻāĻŦāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻŋāĻāϤāĻž āϝāĻžāĻāĻžāĻ āĻāϰā§āĨ¤
āĻāϤāĻŋāĻšā§āϝāĻŦāĻžāĻšā§ āϏā§āĻā§āĻĒ āĻĒāĻĻā§āϧāϤāĻŋ (āϝā§āĻŽāύ Java synchronized āĻŦā§āϞāĻ) āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻāĻžāĻāĻĒāϏā§āĻā§āĻ āϏāĻŋāϏā§āĻā§āĻŽ (āϝā§āĻŽāύ Plaid) āϏā§āĻļāύ āĻĒā§āϰāĻāĻžāϰ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āϰā§āĻāĻŋāĻ āĻĒā§āϰāĻāĻžāϰ āϏāĻŋāϏā§āĻā§āĻŽ val f = newFile("a.txt")
val fOpen = open(f)
write(fOpen, "Hello")
val fClosed = close(fOpen)
// write(fOpen, "World") // āϏāĻāĻāϞāύ āϤā§āϰā§āĻāĻŋ: āĻĒā§āύāϰā§āĻĻā§āϧā§āϤ āĻā§āώāĻŽāϤāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ
āϝāĻžāĻāĻžāĻāĻāϰāĻŖ āĻĢāϞāĻžāĻĢāϞ :
āĻĒā§āϰāĻžāύ⧠āĻā§āώāĻŽāϤāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āϏā§āĻā§āϝāĻžāĻāĻŋāĻāĻāĻžāĻŦā§ āϏāύāĻžāĻā§āϤ āĻāϰāĻž āĻ
-LIFO āϏāĻŽā§āĻĒāĻĻ āĻā§āĻŦāύāĻāĻā§āϰ āϏāĻŽāϰā§āĻĨāύ āĻāϰāĻž āϏāĻŽā§āĻĒāĻĻ āĻĒāϰāĻŋāĻāϝāĻŧā§āϰ āϏāĻāϝā§āĻ āĻŦāĻāĻžāϝāĻŧ āϰāĻžāĻāĻž āĻĒā§āĻĒāĻžāϰā§āϰ āĻļā§āϰā§āϤ⧠āĻāϞā§āϞā§āĻ āĻāϰāĻž āĻĄāĻžāĻāĻžāĻŦā§āϏ āϞā§āύāĻĻā§āύ āĻ
āĻĒā§āĻāĻŋāĻŽāĻžāĻāĻā§āĻļāύ āĻĻā§āĻļā§āϝ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āĻāϰāĻž:
table.lock()
val row = locateRow(table)
table.lockRow(row)
table.unlock() // āĻā§āĻŦāĻŋāϞ āϞāĻ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ āϰāĻŋāϞāĻŋāĻ
val result = computeOnRow(row)
row.unlock()
āϏā§āĻŦāĻŋāϧāĻž : āύā§āϏā§āĻā§āĻĄ synchronized āĻŦā§āϞāĻā§āϰ āϤā§āϞāύāĻžāϝāĻŧ, āĻā§āĻŦāĻŋāϞ āϞāĻā§āϰ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ āϰāĻŋāϞāĻŋāĻ āĻ
āύā§āĻŽāϤāĻŋ āĻĻā§āϝāĻŧ, āϏāĻŽāĻžāύā§āϤāϰāĻžāϞāϤāĻž āĻāύā§āύāϤ āĻāϰā§āĨ¤
āĻĒā§āϰāϏāĻā§āĻ-āĻŽā§āĻā§āϤ āĻŦā§āϝāĻžāĻāϰāĻŖā§āϰ āĻāĻžāĻāĻĒāϏā§āĻā§āĻ āĻā§āϰā§āϝāĻžāĻāĻŋāĻ āϏāĻŽāϰā§āĻĨāύ āĻāϰāĻž:
makeDom { tree =>
tree.open(DIV())
tree.open(P())
tree.close(P())
tree.close(DIV())
// tree.close(DIV()) // āϤā§āϰā§āĻāĻŋ: āĻ
āĻŦāϏā§āĻĨāĻž Nil āĻāĻŦāĻ (DIV, ...) āύāϝāĻŧ
}
āĻĻā§āĻŦāĻŋāĻĒāĻā§āώā§āϝāĻŧ āϏā§āĻļāύ āĻĒā§āϰāĻāĻžāϰ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āĻāϰāĻž, āĻĒā§āϰā§āĻā§āĻāϞ āĻĒā§āύāϰāĻžāĻŦā§āϤā§āϤāĻŋ āϏāĻŽāϰā§āĻĨāύ āĻāϰāĻž:
def echoServer(chan: Chan): chan.PCap[EmptyTuple, EchoServer] ?=!> Unit = {
chan.recPush()
// ... āĻĒā§āϰā§āĻā§āĻāϞ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ
}
āĻĒā§āϰāĻāĻžāĻļāύā§āϝāĻŧāϤāĻž āϝāĻžāĻāĻžāĻāĻāϰāĻŖ : āĻāĻāĻžāϧāĻŋāĻ āĻāĻāĻŋāϞ āĻ
āĻŦāϏā§āĻĨāĻž āĻŦā§āϝāĻŦāϏā§āĻĨāĻžāĻĒāύāĻž āĻĒā§āϝāĻžāĻāĻžāϰā§āύ āϏāĻĢāϞāĻāĻžāĻŦā§ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āĻāϰāĻžāύāĻŋāϰāĻžāĻĒāϤā§āϤāĻž āύāĻŋāĻļā§āĻāϝāĻŧāϤāĻž : āĻŦāĻŋāĻāĻŋāύā§āύ āϤā§āϰā§āĻāĻŋāĻĒā§āϰā§āĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻĒā§āϝāĻžāĻāĻžāϰā§āύ āϏāĻāĻāϞāύ āϏāĻŽāϝāĻŧā§ āϏāύāĻžāĻā§āϤ āĻāϰāĻžāĻŽāĻžāύāĻŦ-āĻāĻŽā§āĻĒāĻŋāĻāĻāĻžāϰ āĻāύā§āĻāĻžāϰāĻ
ā§āϝāĻžāĻāĻļāύ : āĻ
āύā§āϤāϰā§āύāĻŋāĻšāĻŋāϤ āϏāĻŽāĻžāϧāĻžāύā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻŦāϝāĻŧāϞāĻžāϰāĻĒā§āϞā§āĻ āĻā§āĻĄ āĻāϞā§āϞā§āĻāϝā§āĻā§āϝāĻāĻžāĻŦā§ āĻšā§āϰāĻžāϏ āĻāϰāĻžāύā§āϝā§āύāϤāĻŽ āĻāĻā§āϰāĻŽāĻŖāĻžāϤā§āĻŽāĻāϤāĻž : āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ Scala āĻā§āĻĄā§āϰ āϏāĻžāĻĨā§ āĻāĻžāϞ āϏāĻžāĻŽāĻā§āĻāϏā§āϝāϤāĻžāĻĒā§āϰāĻŦāĻžāĻš-āϏāĻāĻŦā§āĻĻāύāĻļā§āϞ āĻĒā§āϰāĻāĻžāĻŦ āϏāĻŋāϏā§āĻā§āĻŽ : Gordon (2021) āĻāϰ āĻĒā§āϰāĻāĻžāĻŦ āĻā§āϝāĻŧāĻžāύā§āĻāĻžāĻŽ āĻŦā§āĻāĻāĻŖāĻŋāϤāĻā§āώāĻŽāϤāĻž āϏāĻŋāϏā§āĻā§āĻŽ : Scala āĻāĻā§āϏāĻŋāϏā§āĻā§āĻŽā§ āĻāĻĒā§āĻā§āώāĻŋāĻ āĻĒā§āϰāĻāĻžāĻŦ āĻŦāĻšā§āϰā§āĻĒāϤāĻžCPS āϰā§āĻĒāĻžāύā§āϤāϰ āĻāĻŦāĻ āĻŽā§āύāĻžāĻĄ : āĻĒā§āϰāĻāĻžāĻŦā§āϰ āϏāĻžāĻĨā§ āĻā§āϞāĻžāϏāĻŋāĻ āϏāĻāϝā§āĻāĻā§āϞāĻžāϏāĻŋāĻ āĻāĻžāĻ : Strom āĻāĻŦāĻ Yemini (1986) āĻāϰ āĻāĻžāĻāĻĒāϏā§āĻā§āĻ āϧāĻžāϰāĻŖāĻžāĻāĻĒāύāĻžāĻŽ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž : DeLine āĻāĻŦāĻ Fähndrich (2004) āĻāϰ āϰā§āĻāĻŋāĻ āĻĒā§āϰāĻāĻžāϰ āĻĒāĻĻā§āϧāϤāĻŋāĻāĻā§āύāĻžāĻāĻļ āĻā§āώāĻŽāϤāĻž : Bierhoff āĻāĻŦāĻ Aldrich (2007) āĻāϰ Plaid āϤ⧠āĻĒā§āϰāϝāĻŧā§āĻāϰā§āĻāĻŋāĻ āϝā§āĻā§āϤāĻŋ āĻāĻŋāϤā§āϤāĻŋ : Girard (1987) āĻāϰ āĻāĻžāĻ āĻžāĻŽā§āĻāϤ āύāĻŋāϝāĻŧāĻŽ āϏā§āĻŽāĻžāĻŦāĻĻā§āϧāϤāĻžāĻŦā§āϝāĻŦāĻšāĻžāϰāĻŋāĻ āϏāĻŋāϏā§āĻā§āĻŽ : Rust āĻāϰ āϧāĻžāϰ āĻā§āĻāĻžāϰ, Linear HaskellāĻĒā§āĻāĻāĻžāύā§-āϝā§āĻā§āϝāϤāĻž āĻĒā§āϰāĻāĻžāϰ : Bao āĻāϤā§āϝāĻžāĻĻāĻŋāϰ āĻāĻā§āĻ-āĻā§āϰāĻŽ āĻĢāĻžāĻāĻļāύ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻĒāύāĻžāĻŽ āĻā§āϰā§āϝāĻžāĻāĻŋāĻāĻā§āϝāĻžāĻĒāĻāĻžāϰāĻŋāĻ āĻĒā§āϰāĻāĻžāϰ : Scala āϤ⧠āĻĒāϰā§āĻā§āώāĻžāĻŽā§āϞāĻ capture checkerāĻāĻā§āĻāϰāĻŖ āĻ
āϰā§āĻāύ : āϏā§āĻā§āĻĒ āύāĻŋāϰāĻžāĻĒāϤā§āϤāĻž āĻāĻŦāĻ āĻāĻĻā§āĻļāĻŽā§āϞāĻ āĻĒā§āϰāĻāĻžāĻļāύā§āϝāĻŧāϤāĻž āϏāĻĢāϞāĻāĻžāĻŦā§ āĻāĻā§āĻā§āϤ āĻāϰāĻžāύā§āϝā§āύāϤāĻŽ āϏāĻŽā§āĻĒā§āϰāϏāĻžāϰāĻŖ āύā§āϤāĻŋ : āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻā§āώāĻŽāϤāĻž āϏāĻŋāϏā§āĻā§āĻŽā§ āĻ
āϞā§āĻĒ āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āϝā§āĻ āĻāϰ⧠āĻļāĻā§āϤāĻŋāĻļāĻžāϞ⧠āĻāĻžāĻāĻĒāϏā§āĻā§āĻ āĻā§āϰā§āϝāĻžāĻāĻŋāĻ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āϏāĻŽā§āĻāĻŦ āĻĒā§āϰāĻŽāĻžāĻŖ āĻāϰāĻžāĻŦā§āϝāĻŦāĻšāĻžāϰāĻŋāĻāϤāĻž āϝāĻžāĻāĻžāĻāĻāϰāĻŖ : āĻāĻāĻžāϧāĻŋāĻ āĻŦāĻžāϏā§āϤāĻŦ āĻĻā§āĻļā§āϝā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻĒāĻĻā§āϧāϤāĻŋāϰ āϏāĻŽā§āĻāĻžāĻŦā§āϝāϤāĻž āĻāĻŦāĻ āĻĒā§āϰāĻāĻžāĻļāύā§āϝāĻŧāϤāĻž āϝāĻžāĻāĻžāĻ āĻāϰāĻžÎŖ āĻĒā§āϰāĻāĻžāϰā§āϰ āϏā§āĻŽāĻžāĻŦāĻĻā§āϧāϤāĻž :āϤāĻžā§āĻā§āώāĻŖāĻŋāĻ āĻāύāĻĒā§āϝāĻžāĻāĻŋāĻ āĻĒā§āϰāϝāĻŧā§āĻāύ, āĻĄā§āĻāĻž āĻāĻžāĻ āĻžāĻŽā§āϤ⧠āϏā§āĻĨāĻžāϝāĻŧā§ āϏāĻāϰāĻā§āώāĻŖ āϏāĻŽāϰā§āĻĨāύ āĻāϰ⧠āύāĻž āύāĻŋāϰā§āĻāϰ āĻĒā§āϰāĻāĻžāϰ āϏāĻŽāϰā§āĻĨāύā§āϰ āĻ
āϏāĻŽā§āĻĒā§āϰā§āĻŖāϤāĻž āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āϏā§āĻŽāĻžāĻŦāĻĻā§āϧāϤāĻž :āĻŦāϰā§āϤāĻŽāĻžāύ āĻĒā§āϰā§āĻā§āĻāĻžāĻāĻĒ āĻĒāϰāĻŋāĻŦāϰā§āϤāύāĻļā§āϞ āĻāϞāĻ āĻāĻŦāĻ āĻŦāϏā§āϤ⧠āĻā§āώā§āϤā§āϰā§āϰ āĻŦāĻŋāύāĻžāĻļāĻāĻžāϰ⧠āĻĒā§āϰāĻāĻžāĻŦ āϏāĻŽāϰā§āĻĨāύ āĻāϰ⧠āύāĻž Scala āĻā§āύā§āϰāĻŋāĻā§āϏā§āϰ āϏāĻžāĻĨā§ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻāĻā§āĻāϰāĻŖ āĻāĻāύāĻ āϏā§āĻŽāĻžāĻŦāĻĻā§āϧ āĻāύā§āώā§āĻ āĻžāύāĻŋāĻ āĻĢāĻžāĻāĻ :ÎŖ āĻĒā§āϰāĻāĻžāϰ āĻĒā§āĻāĻāĻžāύā§-āϝā§āĻā§āϝāϤāĻž āĻĒā§āϰāĻāĻžāϰ⧠āϏāϰāĻžāϏāϰāĻŋ āĻĒā§āϰāϤāĻŋāύāĻŋāϧāĻŋāϤā§āĻŦ āύā§āĻ CPS āϰā§āĻĒāĻžāύā§āϤāϰā§āϰ āĻāύā§āώā§āĻ āĻžāύāĻŋāĻ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖ āĻĒā§āϰāϝāĻŧā§āĻāύ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āύāĻŋāϰā§āĻāϰ āĻĒā§āϰāĻāĻžāϰ āϏāĻŽāϰā§āĻĨāύ : āϏāĻŽā§āĻĒā§āϰā§āĻŖ āύāĻŋāϰā§āĻāϰ āĻĒā§āϰāĻāĻžāϰ āϏāĻŋāϏā§āĻā§āĻŽā§ āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻāϰāĻžāĻāϰāĻ āĻŦāĻŋāϏā§āϤā§āϤ āĻāĻžāώāĻž āϏāĻŽāϰā§āĻĨāύ : āĻā§āώāĻŽāϤāĻž āϏāĻŽāϰā§āĻĨāύāĻāĻžāϰ⧠āĻ
āύā§āϝāĻžāύā§āϝ āĻāĻžāώāĻžāϝāĻŧ āϏā§āĻĨāĻžāύāĻžāύā§āϤāϰ āĻāϰāĻžāĻ
āĻĒā§āĻāĻŋāĻŽāĻžāĻāĻā§āĻļāύ āĻāĻŦāĻ āϏāϰāĻā§āĻāĻžāĻŽ : āĻāĻŽā§āĻĒāĻžāĻāϞāĻžāϰ āĻ
āĻĒā§āĻāĻŋāĻŽāĻžāĻāĻā§āĻļāύ āĻāĻŦāĻ āĻĄāĻŋāĻŦāĻžāĻāĻŋāĻ āϏāϰāĻā§āĻāĻžāĻŽ āĻāύā§āύāϝāĻŧāύāϤāĻžāϤā§āϤā§āĻŦāĻŋāĻ āĻĒāϰāĻŋāĻŽāĻžāϰā§āĻāύ : āĻāύā§āώā§āĻ āĻžāύāĻŋāĻ āĻŽāĻĄā§āϞā§āϰ āĻāϰāĻ āĻĒāϰāĻŋāĻŽāĻžāϰā§āĻāύāϤāĻžāϤā§āϤā§āĻŦāĻŋāĻ āĻāĻĻā§āĻāĻžāĻŦāύ⧠:āĻĒā§āϰāĻĨāĻŽāĻŦāĻžāϰā§āϰ āĻŽāϤ⧠āĻĒā§āϰāĻŦāĻžāĻš-āĻ
āϏāĻāĻŦā§āĻĻāύāĻļā§āϞ āĻā§āώāĻŽāϤāĻž āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āϏāĻĢāϞāĻāĻžāĻŦā§ āĻĒā§āϰāĻŦāĻžāĻš-āϏāĻāĻŦā§āĻĻāύāĻļā§āϞ āĻāĻžāĻāĻĒāϏā§āĻā§āĻ āĻā§āϰā§āϝāĻžāĻāĻŋāĻāϝāĻŧā§ āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻāϰāĻž āϤāĻŋāύāĻāĻŋ āĻĒā§āϰāϝā§āĻā§āϤāĻŋāĻāϤ āϏā§āϤāĻŽā§āĻā§āϰ āĻā§āĻŦ āϏāĻŽāύā§āĻŦāϝāĻŧ āĻŽā§āϞ āĻāĻĻā§āĻāĻžāĻŦāύ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻŋāĻ āĻŽā§āϞā§āϝ :āĻĒā§āϰāĻā§āϤ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻŋāĻāϝāĻŧā§ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āϏāĻŽāϏā§āϝāĻž āϏāĻŽāĻžāϧāĻžāύ āĻāϰāĻž āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻāĻžāώāĻžāϰ āĻā§āϰāĻŽāĻŦāϰā§āϧāĻŽāĻžāύ āĻāĻĒāĻā§āϰā§āĻĄ āĻĒāĻĨ āĻĒā§āϰāĻĻāĻžāύ āĻāϰāĻž āĻĒāϰā§āĻā§āώāĻž āϏāĻŽā§āĻĒā§āϰā§āĻŖāϤāĻž :āĻāĻāĻžāϧāĻŋāĻ āĻāĻāĻŋāϞ āĻā§āϏ āϏā§āĻāĻžāĻĄāĻŋ āĻĒāĻĻā§āϧāϤāĻŋāϰ āĻĒā§āϰāĻāĻžāĻļāύā§āϝāĻŧāϤāĻž āϝāĻžāĻāĻžāĻ āĻāϰāĻž āϏāĻžāϧāĻžāϰāĻŖ āĻĢāĻžāĻāϞ āĻ
āĻĒāĻžāϰā§āĻļāύ āĻĨā§āĻā§ āĻāĻāĻŋāϞ āϏā§āĻļāύ āĻĒā§āϰāĻāĻžāϰ āĻĒāϰā§āϝāύā§āϤ āĻŦāĻŋāϏā§āϤā§āϤ āĻĒāϰāĻŋāϏā§āĻĨāĻŋāϤāĻŋ āĻāĻāĻžāϰ āĻāϰāĻž āĻĒā§āϰāĻā§āĻļāϞ āĻā§āĻŖāĻŽāĻžāύ :āϏāĻŽā§āĻĒā§āϰā§āĻŖ Scala 3 āĻāĻŽā§āĻĒāĻžāĻāϞāĻžāϰ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ capture checker āĻāϰ āϏāĻžāĻĨā§ āĻāĻžāϞ āĻāĻā§āĻāϰāĻŖ āϤāĻžāϤā§āϤā§āĻŦāĻŋāĻ āĻāĻŋāϤā§āϤāĻŋāϰ āĻ
āϏāĻŽā§āĻĒā§āϰā§āĻŖāϤāĻž :ÎŖ āĻĒā§āϰāĻāĻžāϰā§āϰ āĻāύā§āώā§āĻ āĻžāύāĻŋāĻ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖ āϝāĻĨā§āώā§āĻ āĻāĻ ā§āϰ āύāϝāĻŧ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻĒā§āĻāĻāĻžāύā§-āϝā§āĻā§āϝāϤāĻž āĻĒā§āϰāĻāĻžāϰ āϤāϤā§āϤā§āĻŦā§āϰ āϏāĻžāĻĨā§ āĻāĻā§āĻāϰāĻŖā§ āĻĢāĻžāĻāĻ āϰāϝāĻŧā§āĻā§ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āϏā§āĻŽāĻžāĻŦāĻĻā§āϧāϤāĻž :āĻĒāϰāĻŋāĻŦāϰā§āϤāύāĻļā§āϞ āĻ
āĻŦāϏā§āĻĨāĻžāϰ āϏāĻŽāϰā§āĻĨāύ āĻ
āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻā§āύā§āϰāĻŋāĻ āϏāĻŽāϰā§āĻĨāύā§āϰ āϏā§āĻŽāĻžāĻŦāĻĻā§āϧāϤāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻŋāĻāϤāĻž āĻĒā§āϰāĻāĻžāĻŦāĻŋāϤ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āĻŽā§āϞā§āϝāĻžāϝāĻŧāύ āĻĒāĻĻā§āϧāϤāĻŋāϰ āϏā§āĻŽāĻžāĻŦāĻĻā§āϧāϤāĻž :āĻāϰā§āĻŽāĻā§āώāĻŽāϤāĻž āĻŽā§āϞā§āϝāĻžāϝāĻŧāύ āĻ
āύā§āĻĒāϏā§āĻĨāĻŋāϤ āĻŦāĻĄāĻŧ āĻāĻāĻžāϰā§āϰ āĻā§āĻĄ āĻŦā§āϏā§āϰ āϝāĻžāĻāĻžāĻāĻāϰāĻŖ āύā§āĻ āĻļāĻŋāĻā§āώāĻŖā§āϝāĻŧāϤāĻž āϏāĻŽāϏā§āϝāĻž :āϧāĻžāϰāĻŖāĻž āĻāĻāĻŋāϞāϤāĻž āĻāĻā§āĻ, āĻā§āϰāĻšāĻŖāĻā§ āĻĒā§āϰāĻāĻžāĻŦāĻŋāϤ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āϤā§āϰā§āĻāĻŋ āĻŦāĻžāϰā§āϤāĻžāϰ āĻŦāύā§āϧā§āϤā§āĻŦ āϝāĻĨā§āώā§āĻ āĻāϞā§āĻāύāĻž āĻāϰāĻž āĻšāϝāĻŧāύāĻŋ āĻāĻāĻžāĻĄā§āĻŽāĻŋāĻ āĻ
āĻŦāĻĻāĻžāύ :āĻāĻžāĻāĻĒāϏā§āĻā§āĻ āĻāĻŦā§āώāĻŖāĻžāϰ āĻāύā§āϝ āύāϤā§āύ āĻĻāĻŋāĻāύāĻŋāϰā§āĻĻā§āĻļāύāĻž āĻā§āϞāĻž āĻā§āώāĻŽāϤāĻž āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āϏāĻŽā§āĻĒā§āϰāϏāĻžāϰāĻŖ āϏāĻŽā§āĻāĻžāĻŦāύāĻž āĻĒā§āϰāĻĻāϰā§āĻļāύ āĻāϰāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻŋāĻ āĻĒā§āϰāĻāĻžāĻŦ :Scala āĻāĻā§āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āĻāύā§āϝ āĻŽā§āϞā§āϝāĻŦāĻžāύ āϏāĻŽā§āĻĒā§āϰāϏāĻžāϰāĻŖ āĻĒā§āϰāĻĻāĻžāύ āĻāϰāĻž āĻ
āύā§āϝāĻžāύā§āϝ āĻāĻžāώāĻžāϰ āĻĄāĻŋāĻāĻžāĻāύ āĻĒā§āϰāĻāĻžāĻŦāĻŋāϤ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āĻĒā§āύāϰā§ā§āĻĒāĻžāĻĻāύāϝā§āĻā§āϝāϤāĻž :āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āĻĒā§āϰāĻĻāĻžāύ āĻāϰāĻž āĻā§āϏ āĻā§āĻĄ āϏāĻāĻāϞāύ āĻāĻŦāĻ āĻāĻžāϞāĻžāύ⧠āϝāĻžāϝāĻŧ āϏāĻŋāϏā§āĻā§āĻŽ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻŋāĻ : āύāĻŋāϰā§āĻā§āϞ āϏāĻŽā§āĻĒāĻĻ āĻŦā§āϝāĻŦāϏā§āĻĨāĻžāĻĒāύāĻž āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧ āĻĻā§āĻļā§āϝāϏāĻŽāϏāĻžāĻŽāϝāĻŧāĻŋāĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻŋāĻ : āĻāĻāĻŋāϞ āϞāĻ āĻĒā§āϰā§āĻā§āĻāϞ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύāĻĒā§āϰā§āĻā§āĻāϞ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ : āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āĻĒā§āϰā§āĻā§āĻāϞ āĻāĻŦāĻ āϝā§āĻāĻžāϝā§āĻ āĻĒā§āϰā§āĻā§āĻāϞDSL āĻĄāĻŋāĻāĻžāĻāύ : āĻ
āĻŦāϏā§āĻĨāĻž āĻā§āϰā§āϝāĻžāĻāĻŋāĻ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧ āĻĄā§āĻŽā§āĻāύ-āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāĻžāώāĻžāĻĒā§āĻĒāĻžāϰāĻāĻŋ āϏāĻŽā§āĻĻā§āϧ āϏāĻŽā§āĻĒāϰā§āĻāĻŋāϤ āĻāĻžāĻ āĻāĻĻā§āϧā§āϤ āĻāϰā§, āĻĒā§āϰāϧāĻžāύāϤ āĻ
āύā§āϤāϰā§āĻā§āĻā§āϤ:
āĻāĻžāĻāĻĒāϏā§āĻā§āĻ āĻāĻŋāϤā§āϤāĻŋ : Strom āĻāĻŦāĻ Yemini (1986) - āĻāĻžāĻāĻĒāϏā§āĻā§āĻ āϧāĻžāϰāĻŖāĻžāϰ āĻāĻŋāϤā§āϤāĻŋ āĻāĻžāĻāĻā§āώāĻŽāϤāĻž āϏāĻŋāϏā§āĻā§āĻŽ : Dennis āĻāĻŦāĻ Horn (1966), Miller āĻāĻŦāĻ Shapiro (2003) - āĻā§āώāĻŽāϤāĻž āϧāĻžāϰāĻŖāĻžāϰ āϤāĻžāϤā§āϤā§āĻŦāĻŋāĻ āĻāĻŋāϤā§āϤāĻŋāĻĒā§āĻāĻāĻžāύā§-āϝā§āĻā§āϝāϤāĻž āĻĒā§āϰāĻāĻžāϰ : Bao āĻāϤā§āϝāĻžāĻĻāĻŋ (2021), Wei āĻāϤā§āϝāĻžāĻĻāĻŋ (2024) - āĻāĻ āĻāĻžāĻā§āϰ āϏāϰāĻžāϏāϰāĻŋ āϤāĻžāϤā§āϤā§āĻŦāĻŋāĻ āĻāĻŋāϤā§āϤāĻŋScala āĻĒā§āϰāĻāĻžāϰ āϏāĻŋāϏā§āĻā§āĻŽ : Amin āĻāϤā§āϝāĻžāĻĻāĻŋ (2016) - DOT āĻā§āϝāĻžāϞāĻā§āϞāĻžāϏ āĻāĻŦāĻ āĻĒāĻĨ-āύāĻŋāϰā§āĻāϰ āĻĒā§āϰāĻāĻžāϰāϏā§āĻļāύ āĻĒā§āϰāĻāĻžāϰ : Honda (1993), Takeuchi āĻāϤā§āϝāĻžāĻĻāĻŋ (1994) - āϏā§āĻļāύ āĻĒā§āϰāĻāĻžāϰā§āϰ āϤāĻžāϤā§āϤā§āĻŦāĻŋāĻ āĻāĻŋāϤā§āϤāĻŋāĻāĻ āĻĒā§āĻĒāĻžāϰāĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻŋāĻ āĻāĻžāώāĻž āϤāϤā§āϤā§āĻŦ āĻāĻŦāĻ āĻ
āύā§āĻļā§āϞāύā§āϰ āϏāĻŽāύā§āĻŦāϝāĻŧā§ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āĻ
āĻŦāĻĻāĻžāύ āϰāĻžāĻā§, āĻāϤā§āϰ āĻĒā§āϰāϝā§āĻā§āϤāĻŋāĻāϤ āϏāĻŽāύā§āĻŦāϝāĻŧā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻĻā§āϰā§āĻāϏā§āĻĨāĻžāϝāĻŧā§ āĻāĻžāĻāĻĒāϏā§āĻā§āĻ āĻŦā§āϝāĻŦāϏā§āĻĨāĻžāĻĒāύāĻž āϏāĻŽāϏā§āϝāĻž āϏāĻŽāĻžāϧāĻžāύ āĻāϰā§āĨ¤ āϝāĻĻāĻŋāĻ āĻāĻŋāĻā§ āϤāĻžāϤā§āϤā§āĻŦāĻŋāĻ āĻŦāĻŋāĻŦāϰāĻŖā§ āĻāϰāĻ āĻĒāϰāĻŋāĻŽāĻžāϰā§āĻāύā§āϰ āĻ
āĻŦāĻāĻžāĻļ āϰāϝāĻŧā§āĻā§, āĻāϰ āĻāĻĻā§āĻāĻžāĻŦāύ⧠āĻāĻŦāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻŋāĻ āĻŽā§āϞā§āϝ āĻāĻāĻŋāĻā§ āĻāĻ āĻā§āώā§āϤā§āϰā§āϰ āĻāĻāĻāĻŋ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āĻ
āĻā§āϰāĻāϤāĻŋ āĻāϰ⧠āϤā§āϞā§āĨ¤