forth: fix errors/reporting in steps 1-8.
[jackhill/mal.git] / forth / env.fs
CommitLineData
69972a83
C
1require types.fs
2
3MalType%
4 cell% field MalEnv/outer
5 cell% field MalEnv/data
6deftype MalEnv
7
8: MalEnv. { outer -- env }
9 MalEnv new { env }
10 outer env MalEnv/outer !
11 MalMap/Empty env MalEnv/data !
12 env ;
13
14: env/set { key val env -- }
15 key val env MalEnv/data @ assoc
16 env MalEnv/data ! ;
17
3a17cb96 18: env/get-addr { key env -- val-addr }
69972a83
C
19 env
20 begin ( env )
3a17cb96
C
21 key over MalEnv/data @ MalMap/get-addr ( env addr-or-0 )
22 ?dup 0= if ( env )
69972a83 23 MalEnv/outer @ dup 0= ( env-or-0 done-looping? )
3a17cb96
C
24 else ( env addr )
25 nip -1 \ found it! ( addr -1 )
69972a83
C
26 endif
27 until ;
28
29MalEnv
69972a83
C
30 extend pr-buf { env }
31 env MalEnv/data @ pr-buf
32 a-space s" outer: " str-append
33 env MalEnv/outer @ ?dup 0= if
34 s" <none>" str-append
35 else
36 pr-buf
37 endif ;;
c05d35e8 38drop