3 Imports System
.Collections
.Generic
5 Imports MalVal
= Mal
.types
.MalVal
6 Imports MalInt
= Mal
.types
.MalInt
7 Imports MalSymbol
= Mal
.types
.MalSymbol
8 Imports MalList
= Mal
.types
.MalList
9 Imports MalVector
= Mal
.types
.MalVector
10 Imports MalHashMap
= Mal
.types
.MalHashMap
11 Imports MalFunc
= Mal
.types
.MalFunc
16 Shared
Function READ(str
As String) As MalVal
17 Return reader
.read_str(str
)
21 Shared
Function eval_ast(ast
As MalVal
, env
As Dictionary(Of
String, MalVal
)) As MalVal
22 If TypeOf ast Is MalSymbol
Then
23 Dim sym
As MalSymbol
= DirectCast(ast
, MalSymbol
)
24 return env
.Item(sym
.getName())
25 Else If TypeOf ast Is MalList
Then
26 Dim old_lst
As MalList
= DirectCast(ast
, MalList
)
27 Dim new_lst
As MalList
31 new_lst
= DirectCast(New MalVector
, MalList
)
34 For Each mv
in old_lst
.getValue()
35 new_lst
.conj_BANG(EVAL(mv
, env
))
38 Else If TypeOf ast Is MalHashMap
Then
39 Dim new_dict
As New Dictionary(Of
String, MalVal
)
40 Dim entry
As KeyValuePair(Of
String, MalVal
)
41 For Each entry
in DirectCast(ast
,MalHashMap
).getValue()
42 new_dict
.Add(entry
.Key
, EVAL(DirectCast(entry
.Value
,MalVal
), env
))
44 return New MalHashMap(new_dict
)
51 Shared
Function EVAL(orig_ast
As MalVal
, env
As Dictionary(Of
String, MalVal
)) As MalVal
52 'Console.WriteLine("EVAL: {0}", printer._pr_str(orig_ast, true))
53 If not orig_ast
.list_Q() Then
54 return eval_ast(orig_ast
, env
)
58 Dim ast
As MalList
= DirectCast(orig_ast
, MalList
)
59 If ast
.size() = 0 Then
62 Dim a0
As MalVal
= ast(0)
63 Dim el
As MalList
= DirectCast(eval_ast(ast
, env
), MalList
)
64 Dim f
As MalFunc
= DirectCast(el(0), MalFunc
)
65 Return f
.apply(el
.rest())
69 Shared
Function PRINT(exp
As MalVal
) As String
70 return printer
._pr_str(exp
, TRUE)
74 Shared repl_env
As Dictionary(Of
String, MalVal
)
76 Shared
Function REP(str
As String) As String
77 Return PRINT(EVAL(READ(str
), repl_env
))
80 Shared
Function add(a
As MalList
) As MalVal
81 Return DirectCast(a
.Item(0),MalInt
) + DirectCast(a
.Item(1),MalInt
)
84 Shared
Function minus(a
As MalList
) As MalVal
85 Return DirectCast(a
.Item(0),MalInt
) - DirectCast(a
.Item(1),MalInt
)
88 Shared
Function mult(a
As MalList
) As MalVal
89 Return DirectCast(a
.Item(0),MalInt
) * DirectCast(a
.Item(1),MalInt
)
92 Shared
Function div(a
As MalList
) As MalVal
93 Return DirectCast(a
.Item(0),MalInt
) / DirectCast(a
.Item(1),MalInt
)
96 Shared
Function Main
As Integer
97 Dim args
As String() = Environment
.GetCommandLineArgs()
99 repl_env
= New Dictionary(Of
String, MalVal
)
100 repl_env
.Add("+", New MalFunc(AddressOf add
))
101 repl_env
.Add("-", New MalFunc(AddressOf minus
))
102 repl_env
.Add("*", New MalFunc(AddressOf mult
))
103 repl_env
.Add("/", New MalFunc(AddressOf div
))
106 If args
.Length
> 1 AndAlso
args(1) = "--raw" Then
107 Mal
.readline
.SetMode(Mal
.readline
.Modes
.Raw
)
114 line
= Mal
.readline
.Readline("user> ")
115 If line is
Nothing Then
121 Catch e
As IOException
122 Console
.WriteLine("IOException: " & e
.Message
)
125 Console
.WriteLine(REP(line
))
127 Console
.WriteLine("Error: " & e
.Message
)
128 Console
.WriteLine(e
.StackTrace
)