p-lang 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
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: []