1 source mal_readline.tcl
11 proc eval_ast
{ast env
} {
12 switch [obj_type
$ast] {
14 set varname
[obj_val
$ast]
15 return [$env get
$varname]
19 foreach element
[obj_val
$ast] {
20 lappend res
[EVAL
$element $env]
22 return [list_new
$res]
26 foreach element
[obj_val
$ast] {
27 lappend res
[EVAL
$element $env]
29 return [vector_new
$res]
33 dict
for {k v
} [obj_val
$ast] {
34 dict
set res
$k [EVAL
$v $env]
36 return [hashmap_new
$res]
38 default { return $ast }
44 return [eval_ast
$ast $env]
46 set a0
[lindex [obj_val
$ast] 0]
50 set a1
[lindex [obj_val
$ast] 1]
51 set a2
[lindex [obj_val
$ast] 2]
52 switch [obj_val
$a0] {
54 set varname
[obj_val
$a1]
55 set value
[EVAL
$a2 $env]
56 return [$env set $varname $value]
59 set letenv
[Env new
$env]
60 set bindings_list
[obj_val
$a1]
61 foreach {varnameobj varvalobj
} $bindings_list {
62 $letenv set [obj_val
$varnameobj] [EVAL
$varvalobj $letenv]
64 return [EVAL
$a2 $letenv]
67 set lst_obj
[eval_ast
$ast $env]
68 set lst
[obj_val
$lst_obj]
70 set call_args
[lrange $lst 1 end
]
71 return [apply
$f $call_args]
81 PRINT
[EVAL
[READ
$str] $env]
85 integer_new
[expr {[obj_val
[lindex $a 0]] + [obj_val
[lindex $a 1]]}]
89 integer_new
[expr {[obj_val
[lindex $a 0]] - [obj_val
[lindex $a 1]]}]
93 integer_new
[expr {[obj_val
[lindex $a 0]] * [obj_val
[lindex $a 1]]}]
97 integer_new
[expr {[obj_val
[lindex $a 0]] / [obj_val
[lindex $a 1]]}]
100 set repl_env
[Env new
]
101 $repl_env set "+" {{a
} {mal_add
$a}}
102 $repl_env set "-" {{a
} {mal_sub
$a}}
103 $repl_env set "*" {{a
} {mal_mul
$a}}
104 $repl_env set "/" {{a
} {mal_div
$a}}
106 fconfigure stdout
-translation binary
110 set res
[_readline
"user> "]
111 if {[lindex $res 0] == "EOF"} {
114 set line
[lindex $res 1]
118 if { [catch { puts [REP
$line $repl_env] } exception
] } {
119 puts "Error: $exception"