Merge pull request #440 from aasimk2000/add-nil-if-test
[jackhill/mal.git] / vb / env.vb
1 Imports System.Collections.Generic
2 Imports Mal
3 Imports MalVal = Mal.types.MalVal
4 Imports MalSymbol = Mal.types.MalSymbol
5 Imports MalList = Mal.types.MalList
6
7 Namespace Mal
8 Public Class env
9 Public Class Env
10 Dim outer As Env = Nothing
11 Dim data As Dictionary(Of String, MalVal) = New Dictionary(Of String, MalVal)
12
13 Public Sub New(new_outer As Env)
14 outer = new_outer
15 End Sub
16 Public Sub New(new_outer As Env, binds As MalList, exprs As MalList)
17 outer = new_outer
18 For i As Integer = 0 To binds.size()-1
19 Dim sym As String = DirectCast(binds.nth(i),MalSymbol).getName()
20 If sym = "&" Then
21 data(DirectCast(binds.nth(i+1),MalSymbol).getName()) = exprs.slice(i)
22 Exit For
23 Else
24 data(sym) = exprs.nth(i)
25 End If
26 Next
27 End Sub
28
29 Public Function find(key As MalSymbol) As Env
30 If data.ContainsKey(key.getName()) Then
31 return Me
32 Else If outer IsNot Nothing Then
33 return outer.find(key)
34 Else
35 return Nothing
36 End If
37 End Function
38
39 Public Function do_get(key As MalSymbol) As MalVal
40 Dim e As Env = find(key)
41 If e Is Nothing Then
42 throw New Mal.types.MalException(
43 "'" & key.getName() & "' not found")
44 Else
45 return e.data(key.getName())
46 End If
47 End Function
48
49 Public Function do_set(key As MalSymbol, value As MalVal) As Env
50 data(key.getName()) = value
51 return Me
52 End Function
53 End Class
54 End Class
55 End Namespace