p-lang 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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