Utoljára aktív 19 hours ago

Revízió 408f70bde4e72333062bcb9bdf8d9ddb565869e4

dsl.lua Eredeti Playground
1local function eval (prog)
2 local env = {}
3 for _, fn in ipairs (prog) do
4 fn (env)
5 end
6end
7
8local function keywords_for (apply)
9 return function (word_list)
10 local keywords = {}
11 for _, word in ipairs (word_list) do
12 keywords[word] = apply
13 end
14 return setmetatable (keywords, {__call = function (t, ...) return apply(...) end})
15 end
16end
17
18local function let (var)
19 local _let = function (val)
20 return function (env)
21 if type (val) == "function" then
22 val = val (env)
23 end
24 env[var] = val
25 end
26 end
27 return keywords_for (_let) { "equal", "be" }
28end
29
30local function get (var)
31 return function (env)
32 return env[var]
33 end
34end
35
36local function add (x)
37 local _add = function (y)
38 return function (env)
39 if type (x) == "function" then
40 x = x (env)
41 end
42
43 if type (y) == "function" then
44 y = y (env)
45 end
46 if type (y) == "table" then
47 print (next(y))
48 end
49 return x + y
50 end
51 end
52 return keywords_for (_add) { "to", "with" }
53end
54
55local function show (val)
56 local _show = function (env)
57 if type (val) == "function" then
58 val = val (env)
59 end
60
61 print (val)
62 end
63
64 return _show
65end
66
67eval {
68 let "x" .equal (1) ;
69 let "y" .be (2) ;
70 let "z" (3) ;
71 show (add (get "x") .to (get "y")) ;
72 show (add (get "y") .with (get "z")) ;
73}
74
dsl2.lua Eredeti Playground
1local function eval (prog, env)
2 local env = env or {}
3 local last
4 for _, fn in ipairs (prog) do
5 last = fn (env)
6 end
7 return last
8end
9
10local function force (env)
11 return function (x)
12 if type (x) == "function" then
13 x = x (env)
14 end
15 return x
16 end
17end
18
19local function keywords_for (apply)
20 return function (word_list)
21 local keywords = {}
22 for _, word in ipairs (word_list) do
23 keywords[word] = apply
24 end
25 return setmetatable (keywords, {__call = function (t, ...)
26 return apply(...)
27 end})
28 end
29end
30
31local function default (apply)
32 return function (operations)
33 return setmetatable (operations, {__call = function (t, ...)
34 return apply (...)
35 end})
36 end
37end
38
39local function let (var)
40 local _let = function (val)
41 return function (env)
42 env[force (env) (var)] = force (env) (val)
43 end
44 end
45 return keywords_for (_let) { "equal", "be" }
46end
47
48local function get (var)
49 return function (env)
50 return env[force (env) (var)]
51 end
52end
53
54local function add (x)
55 local _add = function (y)
56 return function (env)
57 return force (env) (x) + force (env) (y)
58 end
59 end
60 return keywords_for (_add) { "to", "with" }
61end
62
63local function show (val)
64 local _show = function (env)
65 print (force (env) (val))
66 end
67
68 return _show
69end
70
71local function is (a)
72 local _equals = function (b)
73 return function (env)
74 return force (env) (a) == force (env) (b)
75 end
76 end
77
78 return default (_equals) {
79 greater_than = function (b)
80 return function (env)
81 return force (env) (a) > force (env) (b)
82 end
83 end,
84 less_than = function (b)
85 return function (env)
86 return force (env) (a) < force (env) (b)
87 end
88 end,
89 }
90end
91
92local function when (cond)
93 local _when = function (when_true)
94 local _when_false = function (when_false)
95 return function (env)
96 if force (env) (cond) then
97 return eval (when_true, env)
98 else
99 return eval (when_false, env)
100 end
101 end
102 end
103
104 return keywords_for (_when_false) { "otherwise" }
105 end
106 return _when
107end
108
109local function seed_rand ()
110 math.randomseed (os.time ())
111end
112
113local function rand ()
114 return math.random ()
115end
116
117local function return_with (value)
118 return function (env)
119 return value
120 end
121end
122
123
124eval {
125 seed_rand ;
126 show (
127 when (is (rand) .greater_than (0.5)) {
128 show "Wow! The value was..." ;
129 return_with "High :>" ;
130 } .otherwise {
131 show "Damn, the value was..." ;
132 return_with "Low :<" ;
133 }
134 )
135}
136