aboutsummaryrefslogtreecommitdiff
path: root/forth/env.fs
blob: 9469bf2b1a640cb0d18e753addef2e6cf8386a2e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
require types.fs

MalType%
   cell% field MalEnv/outer
   cell% field MalEnv/data
deftype MalEnv

: MalEnv. { outer -- env }
    MalEnv new { env }
    outer env MalEnv/outer !
    MalMap/Empty env MalEnv/data !
    env ;

: env/set { key val env -- }
    key val env MalEnv/data @ assoc
    env MalEnv/data ! ;

: env/get-addr { key env -- val-addr }
    env
    begin ( env )
        key over MalEnv/data @ MalMap/get-addr ( env addr-or-0 )
        ?dup 0= if ( env )
            MalEnv/outer @ dup 0= ( env-or-0 done-looping? )
        else ( env addr )
            nip -1 \ found it! ( addr -1 )
        endif
    until ;

MalEnv
  extend pr-buf { env }
    env MalEnv/data @ pr-buf
    a-space s" outer: " str-append
    env MalEnv/outer @ ?dup 0= if
        s" <none>" str-append
    else
        pr-buf
    endif ;;
drop