2 Imports System
.Collections
.Generic
3 Imports System
.Text
.RegularExpressions
11 Public Class MalThrowable
16 Public Sub New(msg
As String)
22 Public Sub New(msg
As String)
26 Public Class MalContinue
30 ' Thrown by throw function
31 Public Class MalException
33 Private value
As MalVal
36 Public Sub New(new_value
As MalVal
)
39 Public Sub New(new_value
As String)
41 value
= New MalString(new_value
)
43 Public Function getValue() As MalVal
51 Public Shared
Function _equal_Q(a
As MalVal
, b
As MalVal
) As Boolean
52 Dim ota
As Type = a
.GetType()
53 Dim otb
As Type = b
.GetType()
55 (TypeOf a Is MalList
and TypeOf b Is MalList
)) Then
58 If TypeOf a Is MalInt
Then
59 return DirectCast(a
,MalInt
).getValue() =
60 DirectCast(b
,MalInt
).getValue()
61 Else If TypeOf a Is MalSymbol
Then
62 return DirectCast(a
,MalSymbol
).getName() =
63 DirectCast(b
,MalSymbol
).getName()
64 Else If TypeOf a Is MalString
Then
65 return DirectCast(a
,MalString
).getValue() =
66 DirectCast(b
,MalString
).getValue()
67 Else If TypeOf a Is MalList
Then
68 If DirectCast(a
,MalList
).size() <>
69 DirectCast(b
,MalList
).size()
72 for i
As Integer = 0 To DirectCast(a
,MalList
).size()-1
73 If not _equal_Q(DirectCast(a
,MalList
)(i
),
74 DirectCast(b
,MalList
)(i
))
79 Else If TypeOf a Is MalHashMap
Then
80 Dim ahm
As Dictionary(Of
String,MalVal
) = DirectCast(a
,MalHashMap
).getValue()
81 Dim bhm
As Dictionary(Of
String,MalVal
) = DirectCast(b
,MalHashMap
).getValue()
82 For Each key
As String in ahm
.keys
83 If not bhm
.ContainsKey(key
) Then
86 If not _equal_Q(DirectCast(a
,MalHashMap
).getValue()(key
),
87 DirectCast(b
,MalHashMap
).getValue()(key
))
99 Public MustInherit Class MalVal
100 Private meta
As MalVal
= Nil
101 Public Overridable
Function copy() As MalVal
102 return DirectCast(Me.MemberwiseClone(),MalVal
)
105 ' Default is just to call regular toString()
106 Public Overridable
Function ToString() As String
107 throw
New MalException("ToString called on abstract MalVal")
109 Public Overridable
Function ToString(print_readably
As Boolean) As String
112 Public Function getMeta() As MalVal
115 Public Function setMeta(m
As MalVal
) As MalVal
119 Public Overridable
Function list_Q() As Boolean
124 Public Class MalConstant
126 Private value
As String
127 Public Sub New(name
As String)
130 Public Shadows
Function copy() As MalConstant
134 Public Overrides
Function ToString() As String
137 Public Overrides
Function ToString(print_readably
As Boolean) As String
142 Public Shared Nil
As MalConstant
= New MalConstant("nil")
143 Public Shared MalTrue
As MalConstant
= New MalConstant("true")
144 Public Shared MalFalse
As MalConstant
= New MalConstant("false")
148 Private value
As Int64
149 Public Sub New(v
As Int64
)
152 Public Shadows
Function copy() As MalInt
156 Public Function getValue() As Int64
159 Public Overrides
Function ToString() As String
160 return value
.ToString()
162 Public Overrides
Function ToString(print_readably
As Boolean) As String
163 return value
.ToString()
165 Public Shared Operator
<(a
As MalInt
, b
As Malint
) As MalConstant
166 If a
.getValue() < b
.getValue() Then
172 Public Shared Operator
<=(a
As MalInt
, b
As Malint
) As MalConstant
173 If a
.getValue() <= b
.getValue() Then
179 Public Shared Operator
>(a
As MalInt
, b
As Malint
) As MalConstant
180 If a
.getValue() > b
.getValue() Then
186 Public Shared Operator
>=(a
As MalInt
, b
As Malint
) As MalConstant
187 If a
.getValue() >= b
.getValue() Then
193 Public Shared Operator
+(a
As MalInt
, b
As Malint
) As MalInt
194 return new MalInt(a
.getValue() + b
.getValue())
196 Public Shared Operator
-(a
As MalInt
, b
As Malint
) As MalInt
197 return new MalInt(a
.getValue() - b
.getValue())
199 Public Shared Operator
*(a
As MalInt
, b
As Malint
) As MalInt
200 return new MalInt(a
.getValue() * b
.getValue())
202 Public Shared Operator
/(a
As MalInt
, b
As Malint
) As MalInt
203 return new MalInt(a
.getValue() / b
.getValue())
207 Public Class MalSymbol
209 Private value
As String
210 Public Sub New(v
As String)
213 Public Sub New(v
As MalString
)
216 Public Shadows
Function copy() As MalSymbol
220 Public Function getName() As String
223 Public Overrides
Function ToString() As String
226 Public Overrides
Function ToString(print_readably
As Boolean) As String
231 Public Class MalString
233 Private value
As String
234 Public Sub New(v
As String)
237 Public Shadows
Function copy() As MalString
241 Public Function getValue() As String
244 Public Overrides
Function ToString() As String
245 return """" & value
& """"
247 Public Overrides
Function ToString(print_readably
As Boolean) As String
248 If value
.Length
> 0 AndAlso
value(0) = ChrW(&H029e
) Then
249 return ":" & value
.Substring(1)
250 Else If print_readably
Then
252 value
.Replace("\", "\\") _
253 .Replace("""", "\""") _
254 .Replace(Environment
.NewLine
, "\n") & _
265 Public start
As String = "("
266 Public last
As String = ")"
267 Private value
As List(Of MalVal
)
269 value
= New List(Of MalVal
)
271 Public Sub New(val
As List(Of MalVal
))
274 Public Sub New(ParamArray
mvs() As MalVal
)
275 value
= New List(Of MalVal
)
279 Public Function getValue() As List(Of MalVal
)
282 Public Overrides
Function list_Q() As Boolean
286 Public Overrides
Function ToString() As String
287 return start
& printer
.join(value
, " ", true) & last
289 Public Overrides
Function ToString(print_readably
As Boolean) As String
290 return start
& printer
.join(value
, " ", print_readably
) & last
293 Public Function conj_BANG(ParamArray
mvs() As MalVal
) As MalList
294 For i
As Integer = 0 To mvs
.Length
-1
300 Public Function size() As Int64
303 Public Function nth(ByVal idx
As Integer) As MalVal
304 If value
.Count
> idx
Then
310 Default
Public ReadOnly
Property Item(idx
As Integer) As MalVal
312 If value
.Count
> idx
then
319 Public Function rest() As MalList
321 return New MalList(value
.GetRange(1, value
.Count
-1))
326 Public Overridable
Function slice(start
As Int64
) As MalList
327 return New MalList(value
.GetRange(start
, value
.Count
-start
))
329 Public Overridable
Function slice(start
As Int64
, last
As Int64
) As MalList
330 return New MalList(value
.GetRange(start
, last
-start
))
334 Public Class MalVector
336 ' ' Same implementation except for instantiation methods
342 Public Sub New(val
As List(Of MalVal
))
348 Public Overrides
Function list_Q() As Boolean
352 Public Overrides
Function slice(start
As Int64
, last
As Int64
) As MalList
353 Dim val
As List(Of MalVal
) = Me.getValue()
354 return New MalVector(val
.GetRange(start
, val
.Count
-start
))
358 Public Class MalHashMap
360 Private value
As Dictionary(Of
string, MalVal
)
361 Public Sub New(val
As Dictionary(Of
String, MalVal
))
364 Public Sub New(lst
As MalList
)
365 value
= New Dictionary(Of
String, MalVal
)
368 Public Shadows
Function copy() As MalHashMap
369 Dim new_self
As MalHashMap
= DirectCast(Me.MemberwiseClone(),MalHashMap
)
370 new_self
.value
= New Dictionary(Of
String, MalVal
)(value
)
374 Public Function getValue() As Dictionary(Of
String, MalVal
)
378 Public Overrides
Function ToString() As String
379 return "{" & printer
.join(value
, " ", true) & "}"
381 Public Overrides
Function ToString(print_readably
As Boolean) As String
382 return "{" & printer
.join(value
, " ", print_readably
) & "}"
385 Public Function assoc_BANG(lst
As MalList
) As MalHashMap
386 For i
As Integer = 0 To lst
.size()-1 Step
2
387 value(DirectCast(lst(i
),MalString
).getValue()) = lst(i
+1)
392 Public Function dissoc_BANG(lst
As MalList
) As MalHashMap
393 for i
As Integer = 0 To lst
.size()-1
394 value
.Remove(DirectCast(lst
.nth(i
),MalString
).getValue())
402 Private value
As MalVal
403 Public Sub New(val
As MalVal
)
406 'Public MalAtom copy() { return New MalAtom(value) }
407 Public Function getValue() As MalVal
410 Public Function setValue(val
As MalVal
) As MalVal
414 Public Overrides
Function ToString() As String
415 return "(atom " & printer
._pr_str(value
, true) & ")"
417 Public Overrides
Function ToString(print_readably
As Boolean) As String
418 return "(atom " & printer
._pr_str(value
, print_readably
) & ")"
424 Private fn
As Func(Of MalList
, MalVal
) = Nothing
425 Private ast
As MalVal
= Nothing
426 Private env
As Mal
.env
.Env
= Nothing
427 Private fparams
As MalList
428 Private macro
As Boolean = False
429 Public Sub New(new_fn
As Func(Of MalList
, MalVal
))
432 Public Sub New(new_ast
As MalVal
, new_env
As Mal
.env
.Env
,
433 new_fparams
As MalList
, new_fn
As Func(Of MalList
, MalVal
))
437 fparams
= new_fparams
440 Public Overrides
Function ToString() As String
441 If Not ast Is
Nothing Then
442 return "<fn* " & Mal
.printer
._pr_str(fparams
,true) &
443 " " & Mal
.printer
._pr_str(ast
, true) & ">"
445 return "<builtin_function " & fn
.ToString() & ">"
449 Public Function apply(args
As MalList
) As MalVal
453 Public Function getAst() As MalVal
456 Public Function getEnv() As Mal
.env
.Env
459 Public Function getFParams() As MalList
462 Public Function genEnv(args
As MalList
) As Mal
.env
.Env
463 return New Mal
.env
.Env(env
, fparams
, args
)
465 Public Function isMacro() As Boolean
468 Public Sub setMacro()