Ostatnio aktywny 14 hours ago

capitalex's Avatar capitalex zrewidował ten Gist 14 hours ago. Przejdź do rewizji

1 file changed, 43 insertions

cat.cr(stworzono plik)

@@ -0,0 +1,43 @@
1 + macro concat(*values)
2 + {% top = -1 %}
3 + {% for value, i in values %}
4 + {% if value.is_a? ProcLiteral %}
5 + {% new_top = top - value.args.size + 1 %}
6 + %var{new_top} = {{value}}.call({% for arg, j in value.args %}
7 + %var{top - (value.args.size - j - 1)},
8 + {% end %})
9 + {% top = new_top %}
10 + {% elsif value.is_a? Call %}
11 + {% new_top = top - value.args.size + 1 %}
12 + %var{new_top} = {{value}}({% for arg, j in value.args %}
13 + %var{top - (value.args.size - j - 1)},
14 + {% end %})
15 + {% top = new_top %}
16 + {% elsif value.is_a? SymbolLiteral && value == :put_stack %}
17 + {% for i in (0..top) %}
18 + puts(%var{i})
19 + {% end %}
20 + puts("---------")
21 + {% elsif value.is_a? SymbolLiteral && value == :swap %}
22 + %var{top}, %var{top - 1} = %var{top - 1}, %var{top}
23 + {% elsif value.is_a? SymbolLiteral && value == :dup %}
24 + {% top += 1 %}
25 + %var{top} = %var{top - 1}
26 + {% elsif value.is_a? SymbolLiteral && value == :over %}
27 + {% top += 1 %}
28 + %var{top} = %var{top - 2}
29 + {% elsif value.is_a? SymbolLiteral && value == :drop %}
30 + {% top -= 1 %}
31 + {% else %}
32 + {% top += 1 %}
33 + %var{top} = {{value}}
34 + {% end %}
35 + {% end %}
36 + end
37 +
38 + three = concat(
39 + 1, 2, :over, :over,
40 + ->(x : Int32, y : Int32){ x - y },
41 + :dup, ->(x : Int32, y : Int32){ x + y },
42 + :drop, ->(x : Int32, y : Int32){ x / y }
43 + )
Nowsze Starsze