aboutsummaryrefslogtreecommitdiff
path: root/forth/env.fs
blob: 1b5a3626568ca3b4d170164e1287b7440de210f1 (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
39
40
41
42
43
44
45
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/find { key env -- env-or-0 }
    env
    begin ( env )
        dup 0 key rot MalEnv/data @ get ( env val-or-0 )
        0= if ( env )
            MalEnv/outer @ dup 0= ( env-or-0 done-looping? )
        else
            -1 \ found it! ( env -1 )
        endif
    until ;

MalEnv
  extend get { not-found key env -- }
    key env env/find ( env-or-0 )
    ?dup 0= if
        not-found
    else ( env )
        not-found key rot MalEnv/data @ get
    endif ;;
  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