p-lang 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +38 -8
- data/Rakefile +0 -1
- data/VERSION.yml +3 -3
- data/bin/p-lang +36 -8
- data/lib/p-lang.rb +16 -26
- data/lib/parser/error.rb +32 -0
- data/lib/parser/lexer.rb +245 -0
- data/lib/parser/node.rb +23 -0
- data/lib/parser/syntax_analyser.rb +378 -0
- data/lib/parser/token.rb +19 -0
- data/lib/vm/core/pboolean.rb +27 -0
- data/lib/vm/core/pchar.rb +13 -0
- data/lib/vm/core/pdecimal.rb +130 -0
- data/lib/vm/core/pinteger.rb +125 -0
- data/lib/vm/core/pio.rb +16 -0
- data/lib/vm/core/plist.rb +33 -0
- data/lib/vm/core/pstring.rb +39 -0
- data/lib/vm/environment.rb +67 -42
- data/lib/vm/interpreter.rb +209 -0
- data/lib/vm/pfunctions.rb +46 -0
- data/lib/vm/plambda.rb +42 -0
- data/lib/vm/pobject.rb +44 -42
- data/test/test_lexer +34 -0
- data/test/test_lexer.rb +19 -0
- data/test/test_lexer_tokens +34 -0
- data/test/{test_parser_ok.txt → test_parser} +26 -27
- data/test/test_parser.rb +6 -13
- data/test/test_parser_build +73 -0
- data/test/test_vm +29 -0
- data/test/test_vm.rb +7 -10
- data/test/test_vm_result +29 -0
- metadata +31 -38
- data/bin/teste.p +0 -3
- data/lib/parser/ast.rb +0 -168
- data/lib/parser/nodes.rb +0 -212
- data/lib/parser/p-lang.treetop +0 -197
- data/lib/vm/perror.rb +0 -8
- data/lib/vm/proc.rb +0 -67
- data/lib/vm/std/pdecimal.rb +0 -42
- data/lib/vm/std/pinteger.rb +0 -42
- data/lib/vm/std/pio.rb +0 -17
- data/lib/vm/std/pstring.rb +0 -160
- data/lib/vm/vm.rb +0 -233
- data/test/test_parser_build.txt +0 -72
- data/test/test_vm_programs.txt +0 -64
- data/test/test_vm_results.txt +0 -64
data/lib/vm/std/pdecimal.rb
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
module PLang
|
2
|
-
module PDecimal
|
3
|
-
def PDecimal.def_pfunctions(env)
|
4
|
-
env.add_object_call([:object, :decimal, [[:id, :x]]], :abs, PDecimal.abs)
|
5
|
-
env.add_object_call([:object, :decimal, [[:id, :x]]], :ceil, PDecimal.ceil)
|
6
|
-
env.add_object_call([:object, :decimal, [[:id, :x]]], :floor, PDecimal.floor)
|
7
|
-
env.add_object_call([:object, :decimal, [[:id, :x]]], :to_string, PDecimal.to_string)
|
8
|
-
end
|
9
|
-
|
10
|
-
def PDecimal.abs
|
11
|
-
lamb = Proc.new do |values|
|
12
|
-
PObject.new(:decimal, [values[0].params[0].abs])
|
13
|
-
end
|
14
|
-
lamb.form = [[:object, :decimal, [[:id, :x]]]]
|
15
|
-
[lamb]
|
16
|
-
end
|
17
|
-
|
18
|
-
def PDecimal.ceil
|
19
|
-
lamb = Proc.new do |values|
|
20
|
-
PObject.new(:decimal, [values[0].params[0].ceil])
|
21
|
-
end
|
22
|
-
lamb.form = [[:object, :decimal, [[:id, :x]]]]
|
23
|
-
[lamb]
|
24
|
-
end
|
25
|
-
|
26
|
-
def PDecimal.floor
|
27
|
-
lamb = Proc.new do |values|
|
28
|
-
PObject.new(:decimal, [values[0].params[0].floor])
|
29
|
-
end
|
30
|
-
lamb.form = [[:object, :decimal, [[:id, :x]]]]
|
31
|
-
[lamb]
|
32
|
-
end
|
33
|
-
|
34
|
-
def PDecimal.to_string
|
35
|
-
lamb = Proc.new do |values|
|
36
|
-
PObject.new(:string, [values[0].params[0].to_s])
|
37
|
-
end
|
38
|
-
lamb.form = [[:object, :decimal, [[:id, :x]]]]
|
39
|
-
[lamb]
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
data/lib/vm/std/pinteger.rb
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
module PLang
|
2
|
-
module PInteger
|
3
|
-
def PInteger.def_pfunctions(env)
|
4
|
-
env.add_object_call([:object, :integer, [[:id, :x]]], :abs, PInteger.abs)
|
5
|
-
env.add_object_call([:object, :integer, [[:id, :x]]], :to_decimal, PInteger.to_decimal)
|
6
|
-
env.add_object_call([:object, :integer, [[:id, :x]]], :to_string, PInteger.to_string)
|
7
|
-
env.add_object_call([:object, :integer, [[:id, :x]]], :next, PInteger.next)
|
8
|
-
end
|
9
|
-
|
10
|
-
def PInteger.abs
|
11
|
-
lamb = Proc.new do |values|
|
12
|
-
PObject.new(:integer, [values[0].params[0].abs])
|
13
|
-
end
|
14
|
-
lamb.form = [[:object, :integer, [[:id, :x]]]]
|
15
|
-
[lamb]
|
16
|
-
end
|
17
|
-
|
18
|
-
def PInteger.next
|
19
|
-
lamb = Proc.new do |values|
|
20
|
-
PObject.new(:integer, [values[0].params[0].next])
|
21
|
-
end
|
22
|
-
lamb.form = [[:object, :integer, [[:id, :x]]]]
|
23
|
-
[lamb]
|
24
|
-
end
|
25
|
-
|
26
|
-
def PInteger.to_decimal
|
27
|
-
lamb = Proc.new do |values|
|
28
|
-
PObject.new(:decimal, [values[0].params[0].to_f])
|
29
|
-
end
|
30
|
-
lamb.form = [[:object, :integer, [[:id, :x]]]]
|
31
|
-
[lamb]
|
32
|
-
end
|
33
|
-
|
34
|
-
def PInteger.to_string
|
35
|
-
lamb = Proc.new do |values|
|
36
|
-
PObject.new(:string, [values[0].params[0].to_s])
|
37
|
-
end
|
38
|
-
lamb.form = [[:object, :integer, [[:id, :x]]]]
|
39
|
-
[lamb]
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
data/lib/vm/std/pio.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
module PLang
|
2
|
-
module PIO
|
3
|
-
def PIO.def_pfunctions(env)
|
4
|
-
env.add_var(:print, PIO.pprint)
|
5
|
-
end
|
6
|
-
|
7
|
-
def PIO.pprint
|
8
|
-
lamb = Proc.new do |values|
|
9
|
-
values.each do |value|
|
10
|
-
puts value.to_s
|
11
|
-
end
|
12
|
-
end
|
13
|
-
lamb.form = [nil]
|
14
|
-
[lamb]
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
data/lib/vm/std/pstring.rb
DELETED
@@ -1,160 +0,0 @@
|
|
1
|
-
module PLang
|
2
|
-
module PString
|
3
|
-
def PString.def_pfunctions(env)
|
4
|
-
env.add_object_call([:object, :string, [[:id, :x]]], :append, PString.append)
|
5
|
-
env.add_object_call([:object, :string, [[:id, :x]]], :equal, PString.equal)
|
6
|
-
env.add_object_call([:object, :string, [[:id, :x]]], :at, PString.at)
|
7
|
-
env.add_object_call([:object, :string, [[:id, :x]]], :capitalize, PString.capitalize)
|
8
|
-
env.add_object_call([:object, :string, [[:id, :x]]], :center, PString.center)
|
9
|
-
env.add_object_call([:object, :string, [[:id, :x]]], :downcase, PString.downcase)
|
10
|
-
env.add_object_call([:object, :string, [[:id, :x]]], :is_empty, PString.is_empty)
|
11
|
-
env.add_object_call([:object, :string, [[:id, :x]]], :hex, PString.hex)
|
12
|
-
env.add_object_call([:object, :string, [[:id, :x]]], :index, PString.index)
|
13
|
-
env.add_object_call([:object, :string, [[:id, :x]]], :insert, PString.insert)
|
14
|
-
env.add_object_call([:object, :string, [[:id, :x]]], :length, PString.length)
|
15
|
-
env.add_object_call([:object, :string, [[:id, :x]]], :oct, PString.oct)
|
16
|
-
env.add_object_call([:object, :string, [[:id, :x]]], :reverse, PString.reverse)
|
17
|
-
env.add_object_call([:object, :string, [[:id, :x]]], :to_integer, PString.to_integer)
|
18
|
-
env.add_object_call([:object, :string, [[:id, :x]]], :to_decimal, PString.to_decimal)
|
19
|
-
env.add_object_call([:object, :string, [[:id, :x]]], :upcase, PString.upcase)
|
20
|
-
end
|
21
|
-
|
22
|
-
def PString.append
|
23
|
-
lamb = Proc.new do |values|
|
24
|
-
PObject.new(:string, [values[0].params[0] + values[1].params[0]])
|
25
|
-
end
|
26
|
-
lamb.form = [[:object, :string, [[:id, :x]]], [:object, :string, [[:id, :x]]]]
|
27
|
-
[lamb]
|
28
|
-
end
|
29
|
-
|
30
|
-
def PString.equal
|
31
|
-
lamb = Proc.new do |values|
|
32
|
-
if values[0].params[0] == values[1].params[0]
|
33
|
-
PObject.new(:boolean, [true])
|
34
|
-
else
|
35
|
-
PObject.new(:boolean, [false])
|
36
|
-
end
|
37
|
-
end
|
38
|
-
lamb.form = [[:object, :string, [[:id, :x]]], [:object, :string, [[:id, :x]]]]
|
39
|
-
[lamb]
|
40
|
-
end
|
41
|
-
|
42
|
-
def PString.at
|
43
|
-
lamb = Proc.new do |values|
|
44
|
-
PObject.new(:char, [values[0].params[0][values[1].params[0],1]])
|
45
|
-
end
|
46
|
-
lamb.form = [[:object, :string, [[:id, :x]]], [:object, :integer, [[:id, :x]]]]
|
47
|
-
[lamb]
|
48
|
-
end
|
49
|
-
|
50
|
-
def PString.capitalize
|
51
|
-
lamb = Proc.new do |values|
|
52
|
-
PObject.new(:string, [values[0].params[0].capitalize])
|
53
|
-
end
|
54
|
-
lamb.form = [[:object, :string, [[:id, :x]]]]
|
55
|
-
[lamb]
|
56
|
-
end
|
57
|
-
|
58
|
-
def PString.center
|
59
|
-
lamb = Proc.new do |values|
|
60
|
-
PObject.new(:string, [values[0].params[0].center(values[1].params[0])])
|
61
|
-
end
|
62
|
-
lamb.form = [[:object, :string, [[:id, :x]]], [:object, :integer, [[:id, :x]]]]
|
63
|
-
[lamb]
|
64
|
-
end
|
65
|
-
|
66
|
-
def PString.downcase
|
67
|
-
lamb = Proc.new do |values|
|
68
|
-
PObject.new(:string, [values[0].params[0].downcase])
|
69
|
-
end
|
70
|
-
lamb.form = [[:object, :string, [[:id, :x]]]]
|
71
|
-
[lamb]
|
72
|
-
end
|
73
|
-
|
74
|
-
def PString.is_empty
|
75
|
-
lamb = Proc.new do |values|
|
76
|
-
PObject.new(:boolean, [values[0].params[0].empty?])
|
77
|
-
end
|
78
|
-
lamb.form = [[:object, :string, [[:id, :x]]]]
|
79
|
-
[lamb]
|
80
|
-
end
|
81
|
-
|
82
|
-
def PString.hex
|
83
|
-
lamb = Proc.new do |values|
|
84
|
-
PObject.new(:integer, [values[0].params[0].hex])
|
85
|
-
end
|
86
|
-
lamb.form = [[:object, :string, [[:id, :x]]]]
|
87
|
-
[lamb]
|
88
|
-
end
|
89
|
-
|
90
|
-
def PString.index
|
91
|
-
lamb = Proc.new do |values|
|
92
|
-
i = values[0].params[0].index(values[1].params[0])
|
93
|
-
if i
|
94
|
-
PObject.new(:integer, [i])
|
95
|
-
else
|
96
|
-
PObject.new(:nil, [])
|
97
|
-
end
|
98
|
-
end
|
99
|
-
lamb.form = [[:object, :string, [[:id, :x]]], [:object, :string, [[:id, :x]]]]
|
100
|
-
[lamb]
|
101
|
-
end
|
102
|
-
|
103
|
-
def PString.insert
|
104
|
-
lamb = Proc.new do |values|
|
105
|
-
PObject.new(:string, [values[0].params[0].insert(values[1].params[0], values[2].params[0])])
|
106
|
-
end
|
107
|
-
lamb.form = [[:object, :string, [[:id, :x]]], [:object, :integer, [[:id, :x]]], [:object, :string, [[:id, :x]]]]
|
108
|
-
[lamb]
|
109
|
-
end
|
110
|
-
|
111
|
-
def PString.length
|
112
|
-
lamb = Proc.new do |values|
|
113
|
-
PObject.new(:integer, [values[0].params[0].length])
|
114
|
-
end
|
115
|
-
lamb.form = [[:object, :string, [[:id, :x]]]]
|
116
|
-
[lamb]
|
117
|
-
end
|
118
|
-
|
119
|
-
def PString.oct
|
120
|
-
lamb = Proc.new do |values|
|
121
|
-
PObject.new(:integer, [values[0].params[0].oct])
|
122
|
-
end
|
123
|
-
lamb.form = [[:object, :string, [[:id, :x]]]]
|
124
|
-
[lamb]
|
125
|
-
end
|
126
|
-
|
127
|
-
def PString.reverse
|
128
|
-
lamb = Proc.new do |values|
|
129
|
-
PObject.new(:string, [values[0].params[0].reverse])
|
130
|
-
end
|
131
|
-
lamb.form = [[:object, :string, [[:id, :x]]]]
|
132
|
-
[lamb]
|
133
|
-
end
|
134
|
-
|
135
|
-
def PString.to_integer
|
136
|
-
lamb = Proc.new do |values|
|
137
|
-
PObject.new(:integer, [values[0].params[0].to_i])
|
138
|
-
end
|
139
|
-
lamb.form = [[:object, :string, [[:id, :x]]]]
|
140
|
-
[lamb]
|
141
|
-
end
|
142
|
-
|
143
|
-
def PString.to_decimal
|
144
|
-
lamb = Proc.new do |values|
|
145
|
-
PObject.new(:decimal, [values[0].params[0].to_f])
|
146
|
-
end
|
147
|
-
lamb.form = [[:object, :string, [[:id, :x]]]]
|
148
|
-
[lamb]
|
149
|
-
end
|
150
|
-
|
151
|
-
def PString.upcase
|
152
|
-
lamb = Proc.new do |values|
|
153
|
-
PObject.new(:string, [values[0].params[0].upcase])
|
154
|
-
end
|
155
|
-
lamb.form = [[:object, :string, [[:id, :x]]]]
|
156
|
-
[lamb]
|
157
|
-
end
|
158
|
-
|
159
|
-
end
|
160
|
-
end
|
data/lib/vm/vm.rb
DELETED
@@ -1,233 +0,0 @@
|
|
1
|
-
module PLang
|
2
|
-
class VM
|
3
|
-
def initialize(ast)
|
4
|
-
@ast = ast
|
5
|
-
end
|
6
|
-
|
7
|
-
def execute!
|
8
|
-
env = PLang::Environment.new
|
9
|
-
initialize_global_environment(env)
|
10
|
-
@ast.each do |expr|
|
11
|
-
@ret = execute(expr, env)
|
12
|
-
end
|
13
|
-
@ret
|
14
|
-
end
|
15
|
-
|
16
|
-
def execute(expr, env)
|
17
|
-
case expr[0]
|
18
|
-
when :literal
|
19
|
-
execute_literal(expr[1], expr[2], env)
|
20
|
-
when :let
|
21
|
-
execute_let(expr[1], expr[2], env)
|
22
|
-
when :lambda
|
23
|
-
execute_lambda(expr[1], expr[2], expr[3], expr[4], env)
|
24
|
-
when :call
|
25
|
-
execute_call(expr[1], expr[2], env)
|
26
|
-
when :id
|
27
|
-
execute_id(expr[1], env)
|
28
|
-
when :+, :-, :*, :/, :%, :>, :<, :>=, :<=, :==
|
29
|
-
execute_binop(expr[0], expr[1], expr[2], env)
|
30
|
-
when :and
|
31
|
-
execute_and(expr[1], expr[2], env)
|
32
|
-
when :or
|
33
|
-
execute_or(expr[1], expr[2], env)
|
34
|
-
when :if
|
35
|
-
execute_if(expr[1], expr[2], expr[3], env)
|
36
|
-
when :begin
|
37
|
-
execute_begin(expr[1], env)
|
38
|
-
when :object
|
39
|
-
execute_object(expr[1], expr[2], env)
|
40
|
-
when :object_let
|
41
|
-
execute_object_let(expr[1], expr[2], expr[3], env)
|
42
|
-
when :object_call
|
43
|
-
execute_object_call(expr[1], expr[2], env)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def execute_literal(type, value, env)
|
48
|
-
case type
|
49
|
-
when :integer, :decimal, :char, :string
|
50
|
-
PObject.new(type, [value])
|
51
|
-
when :boolean
|
52
|
-
if value == :true
|
53
|
-
PObject.new(:boolean, [true])
|
54
|
-
elsif value == :false
|
55
|
-
PObject.new(:boolean, [false])
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def execute_let(id, value, env)
|
61
|
-
case id[0]
|
62
|
-
when :id
|
63
|
-
unless id[1] == :_
|
64
|
-
env.add_var(id[1], execute(value, env))
|
65
|
-
end
|
66
|
-
when :object
|
67
|
-
add_object_var(id, execute(value, env), env)
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
def add_object_var(obj, value, env)
|
72
|
-
if obj[1] == value.type
|
73
|
-
obj[2].each_with_index do |param, i|
|
74
|
-
case param[0]
|
75
|
-
when :id
|
76
|
-
unless param[1] == :_
|
77
|
-
case value.type
|
78
|
-
when :integer, :decimal, :boolean
|
79
|
-
env.add_var(param[1], PObject.new(value.type, [value.params[i]]))
|
80
|
-
else
|
81
|
-
env.add_var(param[1], value.params[i])
|
82
|
-
end
|
83
|
-
end
|
84
|
-
when :object
|
85
|
-
add_object_var(param, value.params[i], env)
|
86
|
-
else
|
87
|
-
unless execute(param, env) == value.params[i]
|
88
|
-
PError.raise_error(:ObjectPatternError, "in object '#{obj[1]}'")
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
else
|
93
|
-
PError.raise_error(:ObjectTypeError, "'#{obj[1]}' expected but was '#{value.type}'")
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
def execute_lambda(params, body, where, next_lambda, env)
|
98
|
-
lambda = []
|
99
|
-
lambda << Proc.new do |values|
|
100
|
-
new_env = PLang::Environment.new
|
101
|
-
new_env.parent = env
|
102
|
-
values.each_with_index do |value, i|
|
103
|
-
case params[i][0]
|
104
|
-
when :id
|
105
|
-
unless params[i][1] == :_
|
106
|
-
new_env.add_var(params[i][1], value)
|
107
|
-
end
|
108
|
-
when :object
|
109
|
-
add_object_var(params[i], value, new_env)
|
110
|
-
end
|
111
|
-
end
|
112
|
-
where.each do |w|
|
113
|
-
execute(w, new_env)
|
114
|
-
end
|
115
|
-
execute(body, new_env)
|
116
|
-
end
|
117
|
-
form = []
|
118
|
-
params.each do |param|
|
119
|
-
case param[0]
|
120
|
-
when :id
|
121
|
-
form << nil
|
122
|
-
when :object
|
123
|
-
form << param
|
124
|
-
else
|
125
|
-
form << execute(param, env).form
|
126
|
-
end
|
127
|
-
end
|
128
|
-
lambda[0].form = form
|
129
|
-
if next_lambda
|
130
|
-
lambda |= execute(next_lambda, env)
|
131
|
-
end
|
132
|
-
lambda
|
133
|
-
end
|
134
|
-
|
135
|
-
def execute_call(id, params, env)
|
136
|
-
values = []
|
137
|
-
params.each do |param|
|
138
|
-
values << execute(param, env)
|
139
|
-
end
|
140
|
-
lamb = execute(id, env)
|
141
|
-
lamb.each do |lambda|
|
142
|
-
if lambda.call?(values)
|
143
|
-
return lambda.call(values)
|
144
|
-
end
|
145
|
-
end
|
146
|
-
# CallFunctionError
|
147
|
-
ok = false
|
148
|
-
str_value = "("
|
149
|
-
values.each do |v|
|
150
|
-
str_value += "#{v.to_s}" + ","
|
151
|
-
ok = true
|
152
|
-
end
|
153
|
-
if ok
|
154
|
-
str_value[-1] = ")"
|
155
|
-
else
|
156
|
-
str_value += ")"
|
157
|
-
end
|
158
|
-
if id[0] == :object_call
|
159
|
-
id = id[2]
|
160
|
-
end
|
161
|
-
PError.raise_error(:CallFunctionError, "in function '#{id[1]}': no pattern matches with #{id[1]}#{str_value}")
|
162
|
-
end
|
163
|
-
|
164
|
-
def execute_id(id, env)
|
165
|
-
env.get_var(id)
|
166
|
-
end
|
167
|
-
|
168
|
-
def execute_binop(op, lhs, rhs, env)
|
169
|
-
lhs = execute(lhs, env)
|
170
|
-
rhs = execute(rhs, env)
|
171
|
-
#p lhs
|
172
|
-
#p rhs
|
173
|
-
result = lhs.params[0].send(op,rhs.params[0])
|
174
|
-
if result.class == Fixnum or result.class == Bignum
|
175
|
-
return PObject.new(:integer, [result])
|
176
|
-
elsif result.class == Float
|
177
|
-
return PObject.new(:decimal, [result])
|
178
|
-
elsif result.class == TrueClass or result.class == FalseClass
|
179
|
-
return PObject.new(:boolean, [result])
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
def execute_and(lhs, rhs, env)
|
184
|
-
lhs = execute(lhs, env)
|
185
|
-
rhs = execute(rhs, env)
|
186
|
-
PObject.new(:boolean, [(lhs.params[0] and rhs.params[0])])
|
187
|
-
end
|
188
|
-
|
189
|
-
def execute_or(lhs, rhs, env)
|
190
|
-
lhs = execute(lhs, env)
|
191
|
-
rhs = execute(rhs, env)
|
192
|
-
PObject.new(:boolean, [(lhs.params[0] or rhs.params[0])])
|
193
|
-
end
|
194
|
-
|
195
|
-
def execute_if(cond, t, f, env)
|
196
|
-
cond = execute(cond, env)
|
197
|
-
if cond.params[0]
|
198
|
-
execute(t, env)
|
199
|
-
else
|
200
|
-
execute(f, env)
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
def execute_begin(exprs, env)
|
205
|
-
ret = nil
|
206
|
-
exprs.each do |expr|
|
207
|
-
ret = execute(expr, env)
|
208
|
-
end
|
209
|
-
ret
|
210
|
-
end
|
211
|
-
|
212
|
-
def execute_object(type, params, env)
|
213
|
-
values = []
|
214
|
-
if type == :integer and params.length == 1
|
215
|
-
return PObject.new(type, [params[0][2]])
|
216
|
-
else
|
217
|
-
params.each do |param|
|
218
|
-
values << execute(param, env)
|
219
|
-
end
|
220
|
-
return PObject.new(type, values)
|
221
|
-
end
|
222
|
-
end
|
223
|
-
|
224
|
-
def execute_object_let(obj, msg, value, env)
|
225
|
-
value[1] << obj
|
226
|
-
env.add_object_call(obj, msg[1], execute(value, env))
|
227
|
-
end
|
228
|
-
|
229
|
-
def execute_object_call(object, id, env)
|
230
|
-
env.get_object_call(execute(object, env), id[1])
|
231
|
-
end
|
232
|
-
end
|
233
|
-
end
|