git @ Cat's Eye Technologies Decoy / 413d466
Split stdenv and module into two distinct Lua modules. Chris Pressey 1 year, 7 months ago
2 changed file(s) with 125 addition(s) and 123 deletion(s). Raw diff Collapse all Expand all
0 require "decoy_util"
1 require "decoy_model"
2
3 make_stdenv = function()
4 local env = {}
5
6 env["car"] = function(args)
7 return args[1].head()
8 end
9
10 env["cdr"] = function(args)
11 return args[1].tail()
12 end
13
14 env["cons"] = function(args)
15 return Cons.new(args[1], args[2])
16 end
17
18 local list_p
19 list_p = function(value)
20 if type(value) == "function" then
21 return False
22 elseif value == Nil then
23 return True
24 elseif is_a(value, Cons) then
25 return list_p(value.tail())
26 else
27 return False
28 end
29 end
30 env["list?"] = function(args)
31 return list_p(args[1])
32 end
33
34 local equal_p
35 equal_p = function(a, b)
36 if type(a) == "function" or type(b) == "function" then
37 return False
38 elseif a.class ~= b.class then
39 return False
40 elseif a == Nil then
41 return True
42 elseif is_a(a, String) or is_a(a, Symbol) then
43 return Boolean.value(a.text() == b.text())
44 elseif is_a(a, Number) or is_a(a, Boolean) then
45 return Boolean.value(a.value() == b.value())
46 elseif is_a(a, Cons) then
47 return equal_p(a.head(), b.head()) and equal_p(a.tail(), b.tail())
48 else
49 return False
50 end
51 end
52 env["equal?"] = function(args)
53 return equal_p(args[1], args[2])
54 end
55
56 env["list"] = function(args)
57 return table_to_list(args)
58 end
59
60 env["+"] = function(args)
61 return Number.new(args[1].value() + args[2].value())
62 end
63
64 env["*"] = function(args)
65 return Number.new(args[1].value() * args[2].value())
66 end
67
68 env["-"] = function(args)
69 return Number.new(args[1].value() - args[2].value())
70 end
71
72 env["/"] = function(args)
73 return Number.new(args[1].value() / args[2].value())
74 end
75
76 env["-"] = function(args)
77 return Number.new(args[1].value() - args[2].value())
78 end
79
80 env[">"] = function(args)
81 return Boolean.value(args[1].value() > args[2].value())
82 end
83
84 env[">="] = function(args)
85 return Boolean.value(args[1].value() >= args[2].value())
86 end
87
88 env["<"] = function(args)
89 return Boolean.value(args[1].value() < args[2].value())
90 end
91
92 env["<="] = function(args)
93 return Boolean.value(args[1].value() <= args[2].value())
94 end
95
96 env["and"] = function(args)
97 -- FIXME: not actually short circuiting
98 local i, expr
99 for i, expr in ipairs(args) do
100 if not expr.value() then
101 return False
102 end
103 end
104 return True
105 end
106
107 env["or"] = function(args)
108 -- FIXME: not actually short circuiting
109 local i, expr
110 for i, expr in ipairs(args) do
111 if expr.value() then
112 return True
113 end
114 end
115 return False
116 end
117
118 env["not"] = function(args)
119 return Boolean.value(not args[1].value())
120 end
121
122 return env
123 end
1010 require "decoy_desugar"
1111 require "decoy_eval"
1212 require "decoy_compile_js"
13
14
15 make_stdenv = function()
16 local env = {}
17
18 env["car"] = function(args)
19 return args[1].head()
20 end
21
22 env["cdr"] = function(args)
23 return args[1].tail()
24 end
25
26 env["cons"] = function(args)
27 return Cons.new(args[1], args[2])
28 end
29
30 local list_p
31 list_p = function(value)
32 if type(value) == "function" then
33 return False
34 elseif value == Nil then
35 return True
36 elseif is_a(value, Cons) then
37 return list_p(value.tail())
38 else
39 return False
40 end
41 end
42 env["list?"] = function(args)
43 return list_p(args[1])
44 end
45
46 local equal_p
47 equal_p = function(a, b)
48 if type(a) == "function" or type(b) == "function" then
49 return False
50 elseif a.class ~= b.class then
51 return False
52 elseif a == Nil then
53 return True
54 elseif is_a(a, String) or is_a(a, Symbol) then
55 return Boolean.value(a.text() == b.text())
56 elseif is_a(a, Number) or is_a(a, Boolean) then
57 return Boolean.value(a.value() == b.value())
58 elseif is_a(a, Cons) then
59 return equal_p(a.head(), b.head()) and equal_p(a.tail(), b.tail())
60 else
61 return False
62 end
63 end
64 env["equal?"] = function(args)
65 return equal_p(args[1], args[2])
66 end
67
68 env["list"] = function(args)
69 return table_to_list(args)
70 end
71
72 env["+"] = function(args)
73 return Number.new(args[1].value() + args[2].value())
74 end
75
76 env["*"] = function(args)
77 return Number.new(args[1].value() * args[2].value())
78 end
79
80 env["-"] = function(args)
81 return Number.new(args[1].value() - args[2].value())
82 end
83
84 env["/"] = function(args)
85 return Number.new(args[1].value() / args[2].value())
86 end
87
88 env["-"] = function(args)
89 return Number.new(args[1].value() - args[2].value())
90 end
91
92 env[">"] = function(args)
93 return Boolean.value(args[1].value() > args[2].value())
94 end
95
96 env[">="] = function(args)
97 return Boolean.value(args[1].value() >= args[2].value())
98 end
99
100 env["<"] = function(args)
101 return Boolean.value(args[1].value() < args[2].value())
102 end
103
104 env["<="] = function(args)
105 return Boolean.value(args[1].value() <= args[2].value())
106 end
107
108 env["and"] = function(args)
109 -- FIXME: not actually short circuiting
110 local i, expr
111 for i, expr in ipairs(args) do
112 if not expr.value() then
113 return False
114 end
115 end
116 return True
117 end
118
119 env["or"] = function(args)
120 -- FIXME: not actually short circuiting
121 local i, expr
122 for i, expr in ipairs(args) do
123 if expr.value() then
124 return True
125 end
126 end
127 return False
128 end
129
130 env["not"] = function(args)
131 return Boolean.value(not args[1].value())
132 end
133
134 return env
135 end
13 require "decoy_mod_stdenv"
13614
13715
13816 Registry = {}