p-lang 0.2.0 → 0.3.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.
data/README.rdoc CHANGED
@@ -75,7 +75,11 @@ IO:
75
75
 
76
76
  == Running
77
77
 
78
- $ p-lang -i your-program.p
78
+ $ p-lang your-program.p
79
+
80
+ == Interactive P Shell
81
+
82
+ $ p-lang
79
83
 
80
84
  == Note on Patches/Pull Requests
81
85
 
data/VERSION.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
2
  :major: 0
3
- :minor: 2
3
+ :minor: 3
4
4
  :patch: 0
5
5
  :build:
data/bin/p-lang CHANGED
@@ -14,7 +14,12 @@ options = OptionParser.new do|opts|
14
14
  vm.execute!
15
15
  end
16
16
 
17
- opts.on("-i", "-i FILE", "interp a script file.") do |file|
17
+ opts.on("-i", "-i", "interactive p shell.") do
18
+ shell = PLang::IPS::Shell.new
19
+ shell.start
20
+ end
21
+
22
+ opts.on("-f", "-f FILE", "interp a script file.") do |file|
18
23
  begin
19
24
  program = File.readlines(file).join("")
20
25
  rescue
@@ -35,10 +40,11 @@ argv = ARGV
35
40
  begin
36
41
  if ARGV.length > 0
37
42
  if options.parse!(ARGV).length > 0
38
- options.parse!(["-h"])
43
+ options.parse!(["-f" + ARGV[0]])
39
44
  end
40
45
  else
41
- options.parse!(["-h"])
46
+ # without arguments
47
+ options.parse!(["-i"])
42
48
  end
43
49
  rescue
44
50
  puts "p-lang: unrecognized option"
data/lib/ips/shell.rb ADDED
@@ -0,0 +1,59 @@
1
+ module PLang
2
+ module IPS # = Interactive P Shell
3
+ class Shell
4
+ def initialize
5
+ @expr_c = ""
6
+ @interpreter = PLang::VM::Interpreter.new(nil)
7
+ @env = @interpreter.send(:load_basic_environment)
8
+ end
9
+
10
+ def start
11
+ while true
12
+ begin
13
+ execute(read)
14
+ rescue Exception => e
15
+ if e.class == SystemExit
16
+ raise e
17
+ else
18
+ puts "ips:#{e}"
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ def execute(expr)
25
+ expr = @expr_c + expr
26
+ sa = PLang::Parser::SyntaxAnalyser.new(expr)
27
+ begin
28
+ ast = sa.parse
29
+ result = nil
30
+ ast.each do |a|
31
+ result = @interpreter.send(:execute, a, @env)
32
+ end
33
+ @expr_c = ""
34
+ show(result)
35
+ rescue Exception => e
36
+ if e.message =~ /sintax error: unexpected '\\n'/
37
+ @expr_c = expr
38
+ else
39
+ @expr_c = ""
40
+ raise e
41
+ end
42
+ end
43
+ end
44
+
45
+ def show(out)
46
+ puts " => #{out.to_s}"
47
+ end
48
+
49
+ def read
50
+ if @expr_c == ""
51
+ print "p-lang > "
52
+ else
53
+ print "...... > "
54
+ end
55
+ gets
56
+ end
57
+ end
58
+ end
59
+ end
data/lib/p-lang.rb CHANGED
@@ -19,3 +19,6 @@ require File.join(ROOT_PATH, '/vm/core/pstring')
19
19
  require File.join(ROOT_PATH, '/vm/core/pchar')
20
20
  require File.join(ROOT_PATH, '/vm/core/plist')
21
21
  require File.join(ROOT_PATH, '/vm/core/pio')
22
+ require File.join(ROOT_PATH, '/vm/core/miscellaneous')
23
+
24
+ require File.join(ROOT_PATH, '/ips/shell.rb')
@@ -0,0 +1,11 @@
1
+ module PLang
2
+ module VM
3
+ module PFunctions
4
+ def add_to_interpreter_miscellaneous_functions
5
+ def_function :exit, do
6
+ exit
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -3,19 +3,19 @@ module PLang
3
3
  module PFunctions
4
4
  def add_to_interpreter_boolean_functions
5
5
 
6
- object_message "{boolean: x}", :_and do |object|
6
+ def_object_message "{boolean: x}", :_and do |object|
7
7
  plambda "{boolean: y}" do |value|
8
8
  PObject.new(:boolean, [(object.params[0] and value[0].params[0])])
9
9
  end
10
10
  end
11
11
 
12
- object_message "{boolean: x}", :_or do |object|
12
+ def_object_message "{boolean: x}", :_or do |object|
13
13
  plambda "{boolean: y}" do |value|
14
14
  PObject.new(:boolean, [(object.params[0] or value[0].params[0])])
15
15
  end
16
16
  end
17
17
 
18
- object_message "{boolean: x}", :_not do |object|
18
+ def_object_message "{boolean: x}", :_not do |object|
19
19
  plambda do
20
20
  PObject.new(:boolean, [(not object.params[0])])
21
21
  end
@@ -24,4 +24,4 @@ module PLang
24
24
  end
25
25
  end
26
26
  end
27
- end
27
+ end
data/lib/vm/core/pchar.rb CHANGED
@@ -2,7 +2,7 @@ module PLang
2
2
  module VM
3
3
  module PFunctions
4
4
  def add_to_interpreter_char_functions
5
- object_message "{char: x}", :ord do |object|
5
+ def_object_message "{char: x}", :ord do |object|
6
6
  plambda do |value|
7
7
  PObject.new(:integer, [object.params[0].ord])
8
8
  end
@@ -10,4 +10,4 @@ module PLang
10
10
  end
11
11
  end
12
12
  end
13
- end
13
+ end
@@ -3,7 +3,7 @@ module PLang
3
3
  module PFunctions
4
4
  def add_to_interpreter_decimal_functions
5
5
 
6
- object_message "{decimal: x}", :add do |object|
6
+ def_object_message "{decimal: x}", :add do |object|
7
7
  plambda "y" do |value|
8
8
  case value[0].id
9
9
  when :integer, :decimal
@@ -14,7 +14,7 @@ module PLang
14
14
  end
15
15
  end
16
16
 
17
- object_message "{decimal: x}", :sub do |object|
17
+ def_object_message "{decimal: x}", :sub do |object|
18
18
  plambda "y" do |value|
19
19
  case value[0].id
20
20
  when :integer, :decimal
@@ -25,7 +25,7 @@ module PLang
25
25
  end
26
26
  end
27
27
 
28
- object_message "{decimal: x}", :mul do |object|
28
+ def_object_message "{decimal: x}", :mul do |object|
29
29
  plambda "y" do |value|
30
30
  case value[0].id
31
31
  when :integer, :decimal
@@ -36,7 +36,7 @@ module PLang
36
36
  end
37
37
  end
38
38
 
39
- object_message "{decimal: x}", :div do |object|
39
+ def_object_message "{decimal: x}", :div do |object|
40
40
  plambda "y" do |value|
41
41
  case value[0].id
42
42
  when :integer, :decimal
@@ -47,7 +47,7 @@ module PLang
47
47
  end
48
48
  end
49
49
 
50
- object_message "{decimal: x}", :mod do |object|
50
+ def_object_message "{decimal: x}", :mod do |object|
51
51
  plambda "y" do |value|
52
52
  case value[0].id
53
53
  when :integer, :decimal
@@ -58,7 +58,7 @@ module PLang
58
58
  end
59
59
  end
60
60
 
61
- object_message "{decimal: x}", :major do |object|
61
+ def_object_message "{decimal: x}", :major do |object|
62
62
  plambda "y" do |value|
63
63
  case value[0].id
64
64
  when :integer, :decimal
@@ -69,7 +69,7 @@ module PLang
69
69
  end
70
70
  end
71
71
 
72
- object_message "{decimal: x}", :major_equal do |object|
72
+ def_object_message "{decimal: x}", :major_equal do |object|
73
73
  plambda "y" do |value|
74
74
  case value[0].id
75
75
  when :integer, :decimal
@@ -80,7 +80,7 @@ module PLang
80
80
  end
81
81
  end
82
82
 
83
- object_message "{decimal: x}", :minor do |object|
83
+ def_object_message "{decimal: x}", :minor do |object|
84
84
  plambda "y" do |value|
85
85
  case value[0].id
86
86
  when :integer, :decimal
@@ -91,7 +91,7 @@ module PLang
91
91
  end
92
92
  end
93
93
 
94
- object_message "{decimal: x}", :minor_equal do |object|
94
+ def_object_message "{decimal: x}", :minor_equal do |object|
95
95
  plambda "y" do |value|
96
96
  case value[0].id
97
97
  when :integer, :decimal
@@ -102,7 +102,7 @@ module PLang
102
102
  end
103
103
  end
104
104
 
105
- object_message "{decimal: x}", :equal do |object|
105
+ def_object_message "{decimal: x}", :equal do |object|
106
106
  plambda "y" do |value|
107
107
  case value[0].id
108
108
  when :integer, :decimal
@@ -113,7 +113,7 @@ module PLang
113
113
  end
114
114
  end
115
115
 
116
- object_message "{decimal: x}", :diff do |object|
116
+ def_object_message "{decimal: x}", :diff do |object|
117
117
  plambda "y" do |value|
118
118
  case value[0].id
119
119
  when :integer, :decimal
@@ -127,4 +127,4 @@ module PLang
127
127
  end
128
128
  end
129
129
  end
130
- end
130
+ end
@@ -3,7 +3,7 @@ module PLang
3
3
  module PFunctions
4
4
  def add_to_interpreter_integer_functions
5
5
 
6
- object_message "{integer: x}", :add do |object|
6
+ def_object_message "{integer: x}", :add do |object|
7
7
  plambda "y" do |value|
8
8
  if value[0].id == :integer
9
9
  PObject.new(:integer, [object.params[0] + value[0].params[0]])
@@ -13,7 +13,7 @@ module PLang
13
13
  end
14
14
  end
15
15
 
16
- object_message "{integer: x}", :sub do |object|
16
+ def_object_message "{integer: x}", :sub do |object|
17
17
  plambda "y" do |value|
18
18
  if value[0].id == :integer
19
19
  PObject.new(:integer, [object.params[0] - value[0].params[0]])
@@ -23,7 +23,7 @@ module PLang
23
23
  end
24
24
  end
25
25
 
26
- object_message "{integer: x}", :mul do |object|
26
+ def_object_message "{integer: x}", :mul do |object|
27
27
  plambda "y" do |value|
28
28
  if value[0].id == :integer
29
29
  PObject.new(:integer, [object.params[0] * value[0].params[0]])
@@ -33,7 +33,7 @@ module PLang
33
33
  end
34
34
  end
35
35
 
36
- object_message "{integer: x}", :div do |object|
36
+ def_object_message "{integer: x}", :div do |object|
37
37
  plambda "y" do |value|
38
38
  if value[0].id == :integer
39
39
  PObject.new(:integer, [object.params[0] / value[0].params[0]])
@@ -43,7 +43,7 @@ module PLang
43
43
  end
44
44
  end
45
45
 
46
- object_message "{integer: x}", :mod do |object|
46
+ def_object_message "{integer: x}", :mod do |object|
47
47
  plambda "y" do |value|
48
48
  if value[0].id == :integer
49
49
  PObject.new(:integer, [object.params[0] % value[0].params[0]])
@@ -53,7 +53,7 @@ module PLang
53
53
  end
54
54
  end
55
55
 
56
- object_message "{integer: x}", :major do |object|
56
+ def_object_message "{integer: x}", :major do |object|
57
57
  plambda "y" do |value|
58
58
  case value[0].id
59
59
  when :integer, :decimal
@@ -64,7 +64,7 @@ module PLang
64
64
  end
65
65
  end
66
66
 
67
- object_message "{integer: x}", :major_equal do |object|
67
+ def_object_message "{integer: x}", :major_equal do |object|
68
68
  plambda "y" do |value|
69
69
  case value[0].id
70
70
  when :integer, :decimal
@@ -75,7 +75,7 @@ module PLang
75
75
  end
76
76
  end
77
77
 
78
- object_message "{integer: x}", :minor do |object|
78
+ def_object_message "{integer: x}", :minor do |object|
79
79
  plambda "y" do |value|
80
80
  case value[0].id
81
81
  when :integer, :decimal
@@ -86,7 +86,7 @@ module PLang
86
86
  end
87
87
  end
88
88
 
89
- object_message "{integer: x}", :minor_equal do |object|
89
+ def_object_message "{integer: x}", :minor_equal do |object|
90
90
  plambda "y" do |value|
91
91
  case value[0].id
92
92
  when :integer, :decimal
@@ -97,7 +97,7 @@ module PLang
97
97
  end
98
98
  end
99
99
 
100
- object_message "{integer: x}", :equal do |object|
100
+ def_object_message "{integer: x}", :equal do |object|
101
101
  plambda "y" do |value|
102
102
  case value[0].id
103
103
  when :integer, :decimal
@@ -108,7 +108,7 @@ module PLang
108
108
  end
109
109
  end
110
110
 
111
- object_message "{integer: x}", :diff do |object|
111
+ def_object_message "{integer: x}", :diff do |object|
112
112
  plambda "y" do |value|
113
113
  case value[0].id
114
114
  when :integer, :decimal
@@ -122,4 +122,4 @@ module PLang
122
122
  end
123
123
  end
124
124
  end
125
- end
125
+ end
data/lib/vm/core/pio.rb CHANGED
@@ -3,13 +3,13 @@ module PLang
3
3
  module PFunctions
4
4
  def add_to_interpreter_io_functions
5
5
 
6
- var :print, (plambda "x" do |params|
6
+ def_function :print, "x" do |params|
7
7
  puts params[0].to_s
8
- end)
8
+ end
9
9
 
10
- var :read, (plambda do
10
+ def_function :read, do
11
11
  PObject.new(:string, [STDIN.gets])
12
- end)
12
+ end
13
13
  end
14
14
  end
15
15
  end
data/lib/vm/core/plist.rb CHANGED
@@ -3,25 +3,25 @@ module PLang
3
3
  module PFunctions
4
4
  def add_to_interpreter_list_functions
5
5
 
6
- object_message "{list: x, xs}", :head do |object|
6
+ def_object_message "{list: x, xs}", :head do |object|
7
7
  plambda do |value|
8
8
  object.params[0]
9
9
  end
10
10
  end
11
11
 
12
- object_message "{list: x, xs}", :tail do |object|
12
+ def_object_message "{list: x, xs}", :tail do |object|
13
13
  plambda do |value|
14
14
  object.params[1]
15
15
  end
16
16
  end
17
17
 
18
- object_message "{list: x, xs}", :concat do |object|
18
+ def_object_message "{list: x, xs}", :concat do |object|
19
19
  plambda "x" do |value|
20
20
  PObject.new(:list, [value[0], object])
21
21
  end
22
22
  end
23
23
 
24
- object_message "{empty}", :concat do |object|
24
+ def_object_message "{empty}", :concat do |object|
25
25
  plambda "x" do |value|
26
26
  PObject.new(:list, [value[0], object])
27
27
  end
@@ -3,31 +3,31 @@ module PLang
3
3
  module PFunctions
4
4
  def add_to_interpreter_string_functions
5
5
 
6
- object_message "{string: x}", :at do |object|
6
+ def_object_message "{string: x}", :at do |object|
7
7
  plambda "{integer: y}" do |value|
8
8
  PObject.new(:char, [object.params[0][value[0].params[0]]])
9
9
  end
10
10
  end
11
11
 
12
- object_message "{string: x}", :concat do |object|
12
+ def_object_message "{string: x}", :concat do |object|
13
13
  plambda "{string: y}" do |value|
14
14
  PObject.new(:string, [object.params[0] + value[0].params[0]])
15
15
  end
16
16
  end
17
17
 
18
- object_message "x", :to_string do |object|
18
+ def_object_message "x", :to_string do |object|
19
19
  plambda do |value|
20
20
  PObject.new(:string, [object.to_s])
21
21
  end
22
22
  end
23
23
 
24
- object_message "{string: x}", :to_integer do |object|
24
+ def_object_message "{string: x}", :to_integer do |object|
25
25
  plambda do |value|
26
26
  PObject.new(:integer, [object.params[0].to_i])
27
27
  end
28
28
  end
29
29
 
30
- object_message "{string: x}", :to_decimal do |object|
30
+ def_object_message "{string: x}", :to_decimal do |object|
31
31
  plambda do |value|
32
32
  PObject.new(:decimal, [object.params[0].to_f])
33
33
  end
data/lib/vm/pfunctions.rb CHANGED
@@ -1,7 +1,28 @@
1
1
  module PLang
2
2
  module VM
3
3
  module PFunctions
4
+
5
+ def def_function(id, *params)
6
+ def_var(id, (plambda(*params) do |values|
7
+ yield(values)
8
+ end))
9
+ end
10
+
11
+ def def_object_message(object, message)
12
+ lamb = plambda(object, "{#{message.to_s}}") do |values|
13
+ yield(values[0], values[1])
14
+ end
15
+ begin
16
+ @env.set_var(:get_object_message, lamb)
17
+ rescue
18
+ @env.add_lambda(:get_object_message, lamb)
19
+ end
20
+ end
4
21
 
22
+ def def_var(id, value)
23
+ @env.set_var(id.to_sym, value)
24
+ end
25
+
5
26
  def plambda(*params)
6
27
  lamb = PLambda.new do |values|
7
28
  yield(values)
@@ -22,25 +43,10 @@ module PLang
22
43
  PObject.new(:lambda, [lamb])
23
44
  end
24
45
 
25
- def object_message(object, message)
26
- lamb = plambda(object, "{#{message.to_s}}") do |values|
27
- yield(values[0], values[1])
28
- end
29
- begin
30
- @env.set_var(:get_object_message, lamb)
31
- rescue
32
- @env.add_lambda(:get_object_message, lamb)
33
- end
34
- end
35
-
36
- def var(id, value)
37
- @env.set_var(id.to_sym, value)
38
- end
39
-
40
46
  def object(expr)
41
47
  PLang::Parser::SyntaxAnalyser.new(expr).parse[0]
42
48
  end
43
49
 
44
50
  end
45
51
  end
46
- end
52
+ end
data/lib/vm/pobject.rb CHANGED
@@ -12,7 +12,7 @@ module PLang
12
12
  def to_s
13
13
  case @id
14
14
  when :integer, :decimal, :char, :string, :boolean
15
- return params[0]
15
+ return params[0].to_s
16
16
  when :empty
17
17
  return "'()"
18
18
  when :list
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: 23
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 2
8
+ - 3
9
9
  - 0
10
- version: 0.2.0
10
+ version: 0.3.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Igor Bonadio
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-07-29 00:00:00 -03:00
18
+ date: 2010-07-31 00:00:00 -03:00
19
19
  default_executable: p-lang
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -49,12 +49,14 @@ files:
49
49
  - Rakefile
50
50
  - VERSION.yml
51
51
  - bin/p-lang
52
+ - lib/ips/shell.rb
52
53
  - lib/p-lang.rb
53
54
  - lib/parser/error.rb
54
55
  - lib/parser/lexer.rb
55
56
  - lib/parser/node.rb
56
57
  - lib/parser/syntax_analyser.rb
57
58
  - lib/parser/token.rb
59
+ - lib/vm/core/miscellaneous.rb
58
60
  - lib/vm/core/pboolean.rb
59
61
  - lib/vm/core/pchar.rb
60
62
  - lib/vm/core/pdecimal.rb