10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
# File 'lib/code/object/global.rb', line 10
def call(**args)
operator = args.fetch(:operator, nil)
arguments = args.fetch(:arguments, List.new)
output = args.fetch(:output)
context = args.fetch(:context)
multi_fetch(args, *GLOBALS)
value = arguments.code_first
case operator.to_s
when "Boolean"
sig(args) { Object.repeat }
arguments.any? ? Boolean.new(*arguments.raw) : Class.new(Boolean)
when "break"
sig(args) { Object.repeat }
raise Error::Break, value || Nothing.new
when "next"
sig(args) { Object.repeat }
raise Error::Next, value || Nothing.new
when "Class"
sig(args) { Object.repeat }
arguments.any? ? Class.new(*arguments.raw) : Class.new(Class)
when "Date"
sig(args) { Object.repeat }
arguments.any? ? Date.new(*arguments.raw) : Class.new(Date)
when "Decimal"
sig(args) { Object.repeat }
arguments.any? ? Decimal.new(*arguments.raw) : Class.new(Decimal)
when "Dictionary"
sig(args) { Object.repeat }
if arguments.any?
Dictionary.new(*arguments.raw)
else
Class.new(Dictionary)
end
when "Duration"
sig(args) { Object.repeat }
arguments.any? ? Duration.new(*arguments.raw) : Class.new(Duration)
when "Function"
sig(args)
arguments.any? ? Function.new(*arguments.raw) : Class.new(Function)
when "Integer"
sig(args) { Object.repeat }
arguments.any? ? Integer.new(*arguments.raw) : Class.new(Integer)
when "List"
sig(args) { Object.repeat }
arguments.any? ? List.new(*arguments.raw) : Class.new(List)
when "Nothing"
sig(args) { Object.repeat }
arguments.any? ? Nothing.new(*arguments.raw) : Class.new(Nothing)
when "context"
sig(args)
context
when "Object"
sig(args)
arguments.any? ? Object.new(*arguments.raw) : Class.new(Object)
when "Range"
sig(args) { Object.repeat }
arguments.any? ? Range.new(*arguments.raw) : Class.new(Range)
when "String"
sig(args) { Object.repeat }
arguments.any? ? String.new(*arguments.raw) : Class.new(String)
when "Time"
sig(args) { Object.repeat }
arguments.any? ? Time.new(*arguments.raw) : Class.new(Time)
when "Context"
sig(args) { Object.repeat }
arguments.any? ? Context.new(*arguments.raw) : Class.new(Context)
when "Code"
sig(args) { Object.repeat }
arguments.any? ? Code.new(*arguments.raw) : Class.new(Code)
when "Parameter"
sig(args) { Object.repeat }
arguments.any? ? Parameter.new(*arguments.raw) : Class.new(Parameter)
when "IdentifierList"
sig(args) { Object.repeat }
if arguments.any?
IdentifierList.new(*arguments.raw)
else
Class.new(IdentifierList)
end
when "Html"
sig(args) { Object.repeat }
arguments.any? ? Html.new(*arguments.raw) : Class.new(Html)
when "evaluate"
sig(args) { Object }
Code.evaluate(value.to_s)
when "p"
sig(args) { Object.repeat }
output.puts(*arguments.raw.map(&:inspect))
Nothing.new
when "print"
sig(args) { Object.repeat }
output.print(*arguments.raw)
Nothing.new
when "puts"
sig(args) { Object.repeat }
output.puts(*arguments.raw)
Nothing.new
else
context = context.lookup!(operator)
result = context.code_fetch(operator)
if result.is_a?(Function)
result.call(**args.merge(operator: nil))
else
sig(args)
result
end
end
end
|