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.
@@ -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
@@ -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
@@ -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