[obsidian] vault backup: 2025-12-19 17:28:30[
All checks were successful
Build / build (push) Successful in 8m40s
All checks were successful
Build / build (push) Successful in 8m40s
This commit is contained in:
@@ -83,4 +83,86 @@ $$
|
||||
&\frac{E^n \vdash e_c \Downarrow n \quad n \leqq0\ E^n \vdash e_e\ \Downarrow v\ }{E^n \vdash\ if (e_c)\ e_t\ else\ e_t \Downarrow v }\ &\textrm{[E-IFFALSE]}\\
|
||||
&\frac{E^n \vdash e_1 \Downarrow cls(\lambda x_c.e_c, E^n_c) E^n \vdash e_2 \Downarrow v_2\ E^n_c,\ x_c \mapsto v_2 \vdash e_c \Downarrow v }{E^n \vdash\ e_1\ e_2 \Downarrow v }\ &\textrm{[E-APP]}
|
||||
\end{gathered}
|
||||
|
||||
$$
|
||||
|
||||
## 実用スモールステップ意味論
|
||||
|
||||
アイデア:クロージャ呼び出しとそれ以外の関数呼び出し(グローバルに登録されたものと即時呼び出しされるものとか)を分けよう
|
||||
|
||||
OCamlでの疑似コード(未完成)
|
||||
|
||||
```Ocaml
|
||||
type expr = NumLit of float
|
||||
| Var of string
|
||||
| App of expr * expr
|
||||
| Lam of string * expr
|
||||
| Delay of int * expr * expr
|
||||
| Feed of string * expr
|
||||
| Quote of expr
|
||||
| Splice of expr
|
||||
| Tuple of expr list
|
||||
| Proj of expr * int
|
||||
type bound = string * value
|
||||
and env = bound list
|
||||
and value = Real of float
|
||||
| OpenFn of string * expr * int
|
||||
| Closure of string * expr * env
|
||||
| Code of expr
|
||||
type state = float list
|
||||
type stage = int
|
||||
type stateptr = int
|
||||
|
||||
let lookup: string->env->value =
|
||||
fun name env -> let finder = fun (n,v) -> n == name in
|
||||
let (_n,v) = List.find finder env in
|
||||
v
|
||||
|
||||
|
||||
|
||||
let rec contain_freevars: string -> expr -> env -> bool =
|
||||
...
|
||||
|
||||
|
||||
let states = ... in
|
||||
let stateptr = 0 in
|
||||
let rec eval : stage -> expr -> env -> value =
|
||||
fun stage e env -> match e with
|
||||
| Var(name) ->
|
||||
lookup env name
|
||||
| Lam(x,e) ->
|
||||
if contains_freevar(e) then OpenFn(x,e,statesize e)
|
||||
else Closure(x,e,env)
|
||||
| App(ef,ea) ->
|
||||
let va = eval stage ea env in
|
||||
let vf = eval stage ef env in
|
||||
match vf with
|
||||
| OpenFn(x,e,size)-> let r = eval stage e ((x,va)::env) in
|
||||
shift stateptr size;
|
||||
r
|
||||
| Closure(x,e,cenv) -> eval stage e ((x,va)::cenv)
|
||||
| Delay(n,et,ev) ->
|
||||
let v = eval stage ev env in
|
||||
let vt = eval stage et env in
|
||||
update_ringbuf state stateptr v vt
|
||||
| Feed(x,e)->
|
||||
let size = statesize e in
|
||||
let last = getstate state stateptr in
|
||||
let current = eval stage e ((x,last)::env)
|
||||
state[stateptr] := current;
|
||||
last
|
||||
| Quote(e)->
|
||||
rebuild stage+1 e env
|
||||
| Splice(e)->
|
||||
let v = rebuild stage-1 e env
|
||||
match v with
|
||||
| Code(e) -> eval e env
|
||||
_-> raise
|
||||
and rebuild : stage -> expr -> env =
|
||||
fun stage e env ->
|
||||
if stage == 0 then eval e env
|
||||
else Code(e)
|
||||
|
||||
|
||||
```
|
||||
|
||||
|
||||
Reference in New Issue
Block a user