p-lang 0.0.3 → 0.0.4

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.
data/Rakefile CHANGED
@@ -10,7 +10,7 @@ begin
10
10
  gem.email = "igorbonadio@gmail.com"
11
11
  gem.homepage = "http://github.com/igorbonadio/p-lang"
12
12
  gem.authors = ["Igor Bonadio"]
13
- gem.add_development_dependency "treetop", ">= 0"
13
+ gem.add_dependency "treetop", ">= 0"
14
14
  gem.add_development_dependency "shoulda", ">= 0"
15
15
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
16
16
  end
data/VERSION.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
- :patch: 3
2
+ :patch: 4
3
3
  :build:
4
4
  :major: 0
5
5
  :minor: 0
data/bin/p-lang CHANGED
@@ -5,9 +5,12 @@ require File.join(File.expand_path(File.dirname(__FILE__)), '/../lib/p-lang')
5
5
  if ARGV[0]
6
6
  @parser = PLangParser.new
7
7
 
8
- ast = @parser.parse(File.readlines(ARGV[0]).join("")).build.collect(&:to_sexp)
9
-
10
- vm = PLang::VM.new(ast)
11
-
12
- vm.execute!
13
- end
8
+ ast = @parser.parse(File.readlines(ARGV[0]).join(""))
9
+
10
+ if ast
11
+ vm = PLang::VM.new(ast.build.collect(&:to_sexp))
12
+ vm.execute!
13
+ else
14
+ puts @parser.failure_reason
15
+ end
16
+ end
data/bin/teste.p ADDED
@@ -0,0 +1,5 @@
1
+ f = [x| x(1)]
2
+
3
+ g = [x| x+1]
4
+
5
+ print(f(g))
data/lib/p-lang.rb CHANGED
@@ -12,6 +12,7 @@ require File.join(ROOT_PATH, '/vm/environment')
12
12
  require File.join(ROOT_PATH, '/vm/vm')
13
13
  require File.join(ROOT_PATH, '/vm/proc')
14
14
  require File.join(ROOT_PATH, '/vm/pobject')
15
+ require File.join(ROOT_PATH, '/vm/perror')
15
16
 
16
17
  require File.join(ROOT_PATH, '/vm/std/io')
17
18
 
@@ -12,7 +12,7 @@ module PLang
12
12
  unless @vars[id]
13
13
  @vars[id] = value
14
14
  else
15
- raise "add_var"
15
+ PError.raise_error(:BindVariableError, "variable '#{id}'")
16
16
  end
17
17
  end
18
18
 
@@ -23,7 +23,7 @@ module PLang
23
23
  elsif @parent
24
24
  return @parent.get_var(id)
25
25
  else
26
- raise "get_var"
26
+ PError.raise_error(:NameError, "undefined variable '#{id}'")
27
27
  end
28
28
  end
29
29
 
@@ -44,7 +44,7 @@ module PLang
44
44
  end
45
45
  return lamb
46
46
  rescue
47
- raise "get_object_call"
47
+ PError.raise_error(:ObjectCallError, "undefined message #{object} -> #{msg}")
48
48
  end
49
49
  end
50
50
  end
data/lib/vm/perror.rb ADDED
@@ -0,0 +1,8 @@
1
+ module PLang
2
+ class PError
3
+ def PError.raise_error(error_name, error_message)
4
+ puts error_name.to_s + ": " + error_message
5
+ exit
6
+ end
7
+ end
8
+ end
data/lib/vm/proc.rb CHANGED
@@ -1,7 +1,5 @@
1
1
  class Proc
2
- def form=(form)
3
- @form = form
4
- end
2
+ attr_accessor :form
5
3
 
6
4
  def compare_form(form, obj)
7
5
  if(form)
@@ -37,8 +35,14 @@ class Proc
37
35
  def call?(params)
38
36
  if @form.length == params.length
39
37
  params.each_with_index do |param, i|
40
- unless compare_form(@form[i], param.form)
41
- return false
38
+ unless param.class == Array
39
+ unless compare_form(@form[i], param.form)
40
+ return false
41
+ end
42
+ else
43
+ if @form[i]
44
+ return false
45
+ end
42
46
  end
43
47
  end
44
48
  return true
data/lib/vm/vm.rb CHANGED
@@ -85,12 +85,12 @@ module PLang
85
85
  add_object_var(param, value.params[i], env)
86
86
  else
87
87
  unless execute(param, env) == value.params[i]
88
- raise "add_object_var #1"
88
+ PError.raise_error(:ObjectPatternError, "in object '#{obj[1]}'")
89
89
  end
90
90
  end
91
91
  end
92
92
  else
93
- raise "add_object_var #2"
93
+ PError.raise_error(:ObjectTypeError, "'#{obj[1]}' expected but was '#{value.type}'")
94
94
  end
95
95
  end
96
96
 
@@ -137,12 +137,26 @@ module PLang
137
137
  params.each do |param|
138
138
  values << execute(param, env)
139
139
  end
140
- execute(id, env).each do |lambda|
140
+ lamb = execute(id, env)
141
+ lamb.each do |lambda|
141
142
  if lambda.call?(values)
142
143
  return lambda.call(values)
143
144
  end
144
145
  end
145
- raise "execute_call"
146
+ # CallFunctionError
147
+ str_value = "("
148
+ values.each do |v|
149
+ str_value += "#{v.to_s}" + ","
150
+ end
151
+ if str_value[-1] == ","
152
+ str_value[-1] = ")"
153
+ else
154
+ str_value += ")"
155
+ end
156
+ if id[0] == :object_call
157
+ id = id[2]
158
+ end
159
+ PError.raise_error(:CallFunctionError, "in function '#{id[1]}': no pattern matches with #{id[1]}#{str_value}")
146
160
  end
147
161
 
148
162
  def execute_id(id, env)
@@ -36,3 +36,4 @@ begin(1,2,3,4)
36
36
  f = [_,x,_| x*2] f(1,2,3)
37
37
  f = [{obj: {xxx: _}, x}, y| x+y] f({obj: {xxx: 1}, 2}, 3)
38
38
  list_sum = [{list: head, tail}| head + list_sum(tail)], [{list}| 0] list_sum({list: 1, {list: 2, {list}}})
39
+ f = [x| x(10)] g = [x| x+1] f(g)
@@ -36,3 +36,4 @@ true
36
36
  4
37
37
  5
38
38
  3
39
+ 11
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: p-lang
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 3
10
- version: 0.0.3
9
+ - 4
10
+ version: 0.0.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Igor Bonadio
@@ -15,8 +15,8 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-07-07 00:00:00 -03:00
19
- default_executable: p-lang
18
+ date: 2010-07-08 00:00:00 -03:00
19
+ default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  name: treetop
@@ -30,7 +30,7 @@ dependencies:
30
30
  segments:
31
31
  - 0
32
32
  version: "0"
33
- type: :development
33
+ type: :runtime
34
34
  version_requirements: *id001
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: shoulda
@@ -50,6 +50,7 @@ description: P is a small ('pequena' in portuguese) functional programming langu
50
50
  email: igorbonadio@gmail.com
51
51
  executables:
52
52
  - p-lang
53
+ - teste.p
53
54
  extensions: []
54
55
 
55
56
  extra_rdoc_files:
@@ -68,6 +69,7 @@ files:
68
69
  - lib/parser/nodes.rb
69
70
  - lib/parser/p-lang.treetop
70
71
  - lib/vm/environment.rb
72
+ - lib/vm/perror.rb
71
73
  - lib/vm/pobject.rb
72
74
  - lib/vm/proc.rb
73
75
  - lib/vm/std/io.rb
@@ -79,6 +81,7 @@ files:
79
81
  - test/test_vm.rb
80
82
  - test/test_vm_programs.txt
81
83
  - test/test_vm_results.txt
84
+ - bin/teste.p
82
85
  has_rdoc: true
83
86
  homepage: http://github.com/igorbonadio/p-lang
84
87
  licenses: []