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.
@@ -0,0 +1,13 @@
1
+ module PLang
2
+ module VM
3
+ module PFunctions
4
+ def add_to_interpreter_char_functions
5
+ object_message "{char: x}", :ord do |object|
6
+ plambda do |value|
7
+ PObject.new(:integer, [object.params[0].ord])
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,130 @@
1
+ module PLang
2
+ module VM
3
+ module PFunctions
4
+ def add_to_interpreter_decimal_functions
5
+
6
+ object_message "{decimal: x}", :add do |object|
7
+ plambda "y" do |value|
8
+ case value[0].id
9
+ when :integer, :decimal
10
+ PObject.new(:decimal, [object.params[0] + value[0].params[0]])
11
+ else
12
+ raise "TODO: decimal"
13
+ end
14
+ end
15
+ end
16
+
17
+ object_message "{decimal: x}", :sub do |object|
18
+ plambda "y" do |value|
19
+ case value[0].id
20
+ when :integer, :decimal
21
+ PObject.new(:decimal, [object.params[0] - value[0].params[0]])
22
+ else
23
+ raise "TODO: decimal"
24
+ end
25
+ end
26
+ end
27
+
28
+ object_message "{decimal: x}", :mul do |object|
29
+ plambda "y" do |value|
30
+ case value[0].id
31
+ when :integer, :decimal
32
+ PObject.new(:decimal, [object.params[0] * value[0].params[0]])
33
+ else
34
+ raise "TODO: decimal"
35
+ end
36
+ end
37
+ end
38
+
39
+ object_message "{decimal: x}", :div do |object|
40
+ plambda "y" do |value|
41
+ case value[0].id
42
+ when :integer, :decimal
43
+ PObject.new(:decimal, [object.params[0] / value[0].params[0]])
44
+ else
45
+ raise "TODO: decimal"
46
+ end
47
+ end
48
+ end
49
+
50
+ object_message "{decimal: x}", :mod do |object|
51
+ plambda "y" do |value|
52
+ case value[0].id
53
+ when :integer, :decimal
54
+ PObject.new(:decimal, [object.params[0] % value[0].params[0]])
55
+ else
56
+ raise "TODO: decimal"
57
+ end
58
+ end
59
+ end
60
+
61
+ object_message "{decimal: x}", :major do |object|
62
+ plambda "y" do |value|
63
+ case value[0].id
64
+ when :integer, :decimal
65
+ PObject.new(:boolean, [(object.params[0] > value[0].params[0]).to_s.to_sym])
66
+ else
67
+ raise "TODO: decimal"
68
+ end
69
+ end
70
+ end
71
+
72
+ object_message "{decimal: x}", :major_equal do |object|
73
+ plambda "y" do |value|
74
+ case value[0].id
75
+ when :integer, :decimal
76
+ PObject.new(:boolean, [(object.params[0] >= value[0].params[0]).to_s.to_sym])
77
+ else
78
+ raise "TODO: decimal"
79
+ end
80
+ end
81
+ end
82
+
83
+ object_message "{decimal: x}", :minor do |object|
84
+ plambda "y" do |value|
85
+ case value[0].id
86
+ when :integer, :decimal
87
+ PObject.new(:boolean, [(object.params[0] < value[0].params[0]).to_s.to_sym])
88
+ else
89
+ raise "TODO: decimal"
90
+ end
91
+ end
92
+ end
93
+
94
+ object_message "{decimal: x}", :minor_equal do |object|
95
+ plambda "y" do |value|
96
+ case value[0].id
97
+ when :integer, :decimal
98
+ PObject.new(:boolean, [(object.params[0] <= value[0].params[0]).to_s.to_sym])
99
+ else
100
+ raise "TODO: decimal"
101
+ end
102
+ end
103
+ end
104
+
105
+ object_message "{decimal: x}", :equal do |object|
106
+ plambda "y" do |value|
107
+ case value[0].id
108
+ when :integer, :decimal
109
+ PObject.new(:boolean, [(object.params[0] == value[0].params[0]).to_s.to_sym])
110
+ else
111
+ raise "TODO: decimal"
112
+ end
113
+ end
114
+ end
115
+
116
+ object_message "{decimal: x}", :diff do |object|
117
+ plambda "y" do |value|
118
+ case value[0].id
119
+ when :integer, :decimal
120
+ PObject.new(:boolean, [(object.params[0] != value[0].params[0]).to_s.to_sym])
121
+ else
122
+ raise "TODO: decimal"
123
+ end
124
+ end
125
+ end
126
+
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,125 @@
1
+ module PLang
2
+ module VM
3
+ module PFunctions
4
+ def add_to_interpreter_integer_functions
5
+
6
+ object_message "{integer: x}", :add do |object|
7
+ plambda "y" do |value|
8
+ if value[0].id == :integer
9
+ PObject.new(:integer, [object.params[0] + value[0].params[0]])
10
+ elsif value[0].id == :decimal
11
+ PObject.new(:decimal, [object.params[0] + value[0].params[0]])
12
+ end
13
+ end
14
+ end
15
+
16
+ object_message "{integer: x}", :sub do |object|
17
+ plambda "y" do |value|
18
+ if value[0].id == :integer
19
+ PObject.new(:integer, [object.params[0] - value[0].params[0]])
20
+ elsif value[0].id == :decimal
21
+ PObject.new(:decimal, [object.params[0] - value[0].params[0]])
22
+ end
23
+ end
24
+ end
25
+
26
+ object_message "{integer: x}", :mul do |object|
27
+ plambda "y" do |value|
28
+ if value[0].id == :integer
29
+ PObject.new(:integer, [object.params[0] * value[0].params[0]])
30
+ elsif value[0].id == :decimal
31
+ PObject.new(:decimal, [object.params[0] * value[0].params[0]])
32
+ end
33
+ end
34
+ end
35
+
36
+ object_message "{integer: x}", :div do |object|
37
+ plambda "y" do |value|
38
+ if value[0].id == :integer
39
+ PObject.new(:integer, [object.params[0] / value[0].params[0]])
40
+ elsif value[0].id == :decimal
41
+ PObject.new(:decimal, [object.params[0] / value[0].params[0]])
42
+ end
43
+ end
44
+ end
45
+
46
+ object_message "{integer: x}", :mod do |object|
47
+ plambda "y" do |value|
48
+ if value[0].id == :integer
49
+ PObject.new(:integer, [object.params[0] % value[0].params[0]])
50
+ elsif value[0].id == :decimal
51
+ PObject.new(:decimal, [object.params[0] % value[0].params[0]])
52
+ end
53
+ end
54
+ end
55
+
56
+ object_message "{integer: x}", :major do |object|
57
+ plambda "y" do |value|
58
+ case value[0].id
59
+ when :integer, :decimal
60
+ PObject.new(:boolean, [(object.params[0] > value[0].params[0]).to_s.to_sym])
61
+ else
62
+ raise "TODO: integer"
63
+ end
64
+ end
65
+ end
66
+
67
+ object_message "{integer: x}", :major_equal do |object|
68
+ plambda "y" do |value|
69
+ case value[0].id
70
+ when :integer, :decimal
71
+ PObject.new(:boolean, [(object.params[0] >= value[0].params[0]).to_s.to_sym])
72
+ else
73
+ raise "TODO: integer"
74
+ end
75
+ end
76
+ end
77
+
78
+ object_message "{integer: x}", :minor do |object|
79
+ plambda "y" do |value|
80
+ case value[0].id
81
+ when :integer, :decimal
82
+ PObject.new(:boolean, [(object.params[0] < value[0].params[0]).to_s.to_sym])
83
+ else
84
+ raise "TODO: integer"
85
+ end
86
+ end
87
+ end
88
+
89
+ object_message "{integer: x}", :minor_equal do |object|
90
+ plambda "y" do |value|
91
+ case value[0].id
92
+ when :integer, :decimal
93
+ PObject.new(:boolean, [(object.params[0] <= value[0].params[0]).to_s.to_sym])
94
+ else
95
+ raise "TODO: integer"
96
+ end
97
+ end
98
+ end
99
+
100
+ object_message "{integer: x}", :equal do |object|
101
+ plambda "y" do |value|
102
+ case value[0].id
103
+ when :integer, :decimal
104
+ PObject.new(:boolean, [(object.params[0] == value[0].params[0]).to_s.to_sym])
105
+ else
106
+ raise "TODO: integer"
107
+ end
108
+ end
109
+ end
110
+
111
+ object_message "{integer: x}", :diff do |object|
112
+ plambda "y" do |value|
113
+ case value[0].id
114
+ when :integer, :decimal
115
+ PObject.new(:boolean, [(object.params[0] != value[0].params[0]).to_s.to_sym])
116
+ else
117
+ raise "TODO: integer"
118
+ end
119
+ end
120
+ end
121
+
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,16 @@
1
+ module PLang
2
+ module VM
3
+ module PFunctions
4
+ def add_to_interpreter_io_functions
5
+
6
+ var :print, (plambda "x" do |params|
7
+ puts params[0].to_s
8
+ end)
9
+
10
+ var :read, (plambda do
11
+ PObject.new(:string, [STDIN.gets])
12
+ end)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,33 @@
1
+ module PLang
2
+ module VM
3
+ module PFunctions
4
+ def add_to_interpreter_list_functions
5
+
6
+ object_message "{list: x, xs}", :head do |object|
7
+ plambda do |value|
8
+ object.params[0]
9
+ end
10
+ end
11
+
12
+ object_message "{list: x, xs}", :tail do |object|
13
+ plambda do |value|
14
+ object.params[1]
15
+ end
16
+ end
17
+
18
+ object_message "{list: x, xs}", :concat do |object|
19
+ plambda "x" do |value|
20
+ PObject.new(:list, [value[0], object])
21
+ end
22
+ end
23
+
24
+ object_message "{empty}", :concat do |object|
25
+ plambda "x" do |value|
26
+ PObject.new(:list, [value[0], object])
27
+ end
28
+ end
29
+
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,39 @@
1
+ module PLang
2
+ module VM
3
+ module PFunctions
4
+ def add_to_interpreter_string_functions
5
+
6
+ object_message "{string: x}", :at do |object|
7
+ plambda "{integer: y}" do |value|
8
+ PObject.new(:char, [object.params[0][value[0].params[0]]])
9
+ end
10
+ end
11
+
12
+ object_message "{string: x}", :concat do |object|
13
+ plambda "{string: y}" do |value|
14
+ PObject.new(:string, [object.params[0] + value[0].params[0]])
15
+ end
16
+ end
17
+
18
+ object_message "x", :to_string do |object|
19
+ plambda do |value|
20
+ PObject.new(:string, [object.to_s])
21
+ end
22
+ end
23
+
24
+ object_message "{string: x}", :to_integer do |object|
25
+ plambda do |value|
26
+ PObject.new(:integer, [object.params[0].to_i])
27
+ end
28
+ end
29
+
30
+ object_message "{string: x}", :to_decimal do |object|
31
+ plambda do |value|
32
+ PObject.new(:decimal, [object.params[0].to_f])
33
+ end
34
+ end
35
+
36
+ end
37
+ end
38
+ end
39
+ end
@@ -1,53 +1,78 @@
1
1
  module PLang
2
- class Environment
3
- attr_accessor :parent
4
-
5
- def initialize
6
- @vars = Hash.new
7
- @parent = nil
8
- @object_call = Hash.new
9
- end
10
-
11
- def add_var(id, value)
12
- unless @vars[id]
13
- @vars[id] = value
14
- else
15
- PError.raise_error(:BindVariableError, "variable '#{id}'")
2
+ module VM
3
+ class Environment
4
+ attr_accessor :parent
5
+
6
+ def initialize
7
+ @vars = Hash.new
8
+ @objects = Hash.new
16
9
  end
17
- end
18
10
 
19
- def get_var(id)
20
- v = @vars[id]
21
- if v
22
- return v
23
- elsif @parent
24
- return @parent.get_var(id)
25
- else
26
- PError.raise_error(:NameError, "undefined variable '#{id}'")
11
+ def set_var(id, value)
12
+ unless @vars[id]
13
+ @vars[id] = value
14
+ else
15
+ raise "LetError: TODO"
16
+ end
27
17
  end
28
- end
29
-
30
- def add_object_call(form, msg, value)
31
- unless @object_call[msg]
32
- @object_call[msg] = Hash.new
18
+
19
+ def get_var(id)
20
+ v = @vars[id]
21
+ if v
22
+ return v
23
+ elsif @parent
24
+ return @parent.get_var(id)
25
+ else
26
+ raise "NameError: undefined variable '#{id}'"
27
+ end
33
28
  end
34
- @object_call[msg][form] = value
35
- end
36
-
37
- def get_object_call(object, msg)
38
- begin
39
- lamb = []
40
- @object_call[msg].each do |obj|
41
- if obj[0][1] == object.type
42
- lamb |= obj[1]
29
+
30
+ #TODO: new operator to add lambdas
31
+ def add_lambda(id, lamb)
32
+ v = get_var(id)
33
+ if v
34
+ if v.id == :lambda and lamb.id == :lambda
35
+ v.params |= lamb.params
36
+ else
37
+ raise "TODO: Environment#add_lambda#2"
43
38
  end
39
+ else
40
+ raise "TODO: Environment#add_lambda#1"
44
41
  end
45
- return lamb
46
- rescue
47
- if @parent
48
- @parent.get_object_call(object, msg)
42
+ end
43
+
44
+ def set_object_var(form, object)
45
+ if form.type == :object
46
+ if form.id.value == object.id
47
+ form.params.each_with_index do |param, i|
48
+ case param.type
49
+ when :object
50
+ set_object_var(param, object.params[i])
51
+ when :id
52
+ unless param.value == :_
53
+ if object.id == :integer
54
+ set_var(param.value, PObject.new(:integer, [object.params[i]]))
55
+ elsif object.id == :decimal
56
+ set_var(param.value, PObject.new(:decimal, [object.params[i]]))
57
+ elsif object.id == :char
58
+ set_var(param.value, PObject.new(:char, [object.params[i]]))
59
+ elsif object.id == :string
60
+ set_var(param.value, PObject.new(:string, [object.params[i]]))
61
+ else
62
+ set_var(param.value, object.params[i])
63
+ end
64
+ end
65
+ else
66
+ unless param.value == object.params[i].params[0]
67
+ raise "TODO: Environment#set_object_var#3"
68
+ end
69
+ end
70
+ end
71
+ else
72
+ raise "TODO: Environment#set_object_var#1"
73
+ end
49
74
  else
50
- PError.raise_error(:ObjectCallError, "undefined message #{object} -> #{msg}")
75
+ raise "TODO: Environment#set_object_var#2"
51
76
  end
52
77
  end
53
78
  end