rbf 0.0.6.1 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -21,7 +21,7 @@ class IO
21
21
  end
22
22
  rescue LoadError
23
23
  def read_char
24
- system 'stty raw -echo'
24
+ system 'stty raw'
25
25
 
26
26
  STDIN.getc
27
27
  ensure
@@ -65,6 +65,15 @@ class Storage < Hash
65
65
  self[position ? position.to_i : @position.to_i].to_i rescue 0
66
66
  end
67
67
 
68
+ def clear!
69
+ self.clear
70
+ end
71
+
72
+ def reset!
73
+ clear!
74
+ @position = 0
75
+ end
76
+
68
77
  def inspect
69
78
  "#<Storage(#{position}): #{super}>"
70
79
  end
data/lib/rbf/optimizer.rb CHANGED
@@ -10,6 +10,8 @@
10
10
  # 0. You just DO WHAT THE FUCK YOU WANT TO.
11
11
  #++
12
12
 
13
+ require 'memoized'
14
+
13
15
  module RBF
14
16
 
15
17
  class Optimizer
@@ -38,10 +40,9 @@ class Optimizer
38
40
 
39
41
  def optimize (tree)
40
42
  result = tree.clone
41
- algos = algorithms
42
43
 
43
44
  begin
44
- changed = algos.any? {|algo|
45
+ changed = algorithms.any? {|algo|
45
46
  algo.optimize(result)
46
47
  }
47
48
  end while changed
@@ -49,6 +50,7 @@ class Optimizer
49
50
  result
50
51
  end
51
52
 
53
+ memoize
52
54
  def algorithms
53
55
  @@optimizations.map {|(name, block)|
54
56
  Algorithm.new(self, &block) unless options[name] == false
data/lib/rbf.rb CHANGED
@@ -16,6 +16,41 @@ require 'rbf/optimizer'
16
16
  require 'rbf/jit'
17
17
  require 'rbf/interpreter'
18
18
 
19
+ module Readline
20
+ Commands = ['!exit', '!quit', '!storage', '!position', '!get', '!set', '!clear', '!reset']
21
+
22
+ def self.supported?
23
+ require 'colorb'
24
+ require 'readline'
25
+ rescue Exception => e
26
+ false
27
+ end
28
+
29
+ if supported?
30
+ self.completion_proc = proc {|s|
31
+ next unless s.start_with?('!')
32
+
33
+ Commands.grep(/^#{Regexp.escape(s)}/)
34
+ }
35
+ end
36
+
37
+ def self.readline_with_hist_management
38
+ begin
39
+ line = Readline.readline('>> '.bold, true)
40
+ rescue Exception => e
41
+ return
42
+ end
43
+
44
+ return unless line
45
+
46
+ if line =~ /^\s*$/ or Readline::HISTORY.to_a[-2] == line
47
+ Readline::HISTORY.pop
48
+ end
49
+
50
+ line
51
+ end
52
+ end
53
+
19
54
  module RBF
20
55
  def self.syntax (name)
21
56
  name.is_a?(Hash) ? name :
@@ -48,69 +83,77 @@ module RBF
48
83
  end
49
84
 
50
85
  def self.repl (options=nil)
51
- require 'colorb'
86
+ begin
87
+ require 'colorb'
88
+ require 'readline'
89
+ rescue LoadError
90
+ warn 'You need colorb and readline to use the REPL, install them.'
91
+
92
+ return false
93
+ end
52
94
 
53
95
  interpreter = Interpreter.new(options || {})
54
96
 
55
- loop do
56
- STDOUT.print '>> '.bold
57
- STDOUT.flush
97
+ while line = Readline.readline_with_hist_management
98
+ line.rstrip!
58
99
 
59
- begin
60
- line = STDIN.gets.chomp rescue nil or raise SystemExit
61
- rescue Interrupt, SystemExit
62
- puts "\nExiting REPL."
100
+ if line.start_with?('!')
101
+ case line[1 .. -1]
102
+ when 'exit', 'quit'
103
+ break
63
104
 
64
- return false
65
- end
105
+ when 'storage'
106
+ STDOUT.puts interpreter.storage.inspect
66
107
 
67
- begin
68
- if line.start_with?('!')
69
- case line[1 .. -1]
70
- when 'exit', 'quit'
71
- return true
108
+ when /^position(?:\s+(\d+))?$/
109
+ if $1
110
+ interpreter.storage.position = $1
111
+ else
112
+ STDOUT.puts interpreter.storage.position.to_s.bold
113
+ end
72
114
 
73
- when 'storage'
74
- STDOUT.puts interpreter.storage.inspect
115
+ when /^get(?:\s+(\d+))?$/
116
+ STDOUT.puts "#{($1 || interpreter.storage.position).to_s.bold}: #{interpreter.storage.get($1)}"
75
117
 
76
- when /^position(?:\s+(\d+))?$/
77
- if $1
78
- interpreter.storage.position = $1
79
- else
80
- STDOUT.puts interpreter.storage.position.to_s.bold
81
- end
118
+ when /^set(?:\s+(\d+)\s+(\d+))/
119
+ interpreter.storage.set($2.to_i, $1.to_i)
82
120
 
83
- when /^get(?:\s+(\d+))?$/
84
- STDOUT.puts "#{($1 || interpreter.storage.position).to_s.bold}: #{interpreter.storage.get($1)}"
121
+ when 'clear'
122
+ interpreter.storage.clear!
85
123
 
86
- when /^set(?:\s+(\d+)\s+(\d+))/
87
- interpreter.storage.set($2.to_i, $1.to_i)
124
+ when 'reset'
125
+ interpreter.storage.reset!
88
126
 
89
- else
90
- STDOUT.puts 'Command not found or used improperly'.red
91
- end
92
- else
93
- interpreter.evaluate(line, interpreter.options.merge(:output => Class.new {
94
- attr_reader :last
127
+ else
128
+ STDOUT.puts 'Command not found or used improperly'.red
129
+ end
130
+
131
+ next
132
+ end
95
133
 
96
- def print (text)
97
- STDOUT.print(text)
134
+ begin
135
+ interpreter.evaluate(line, interpreter.options.merge(:output => Class.new {
136
+ attr_reader :last
98
137
 
99
- @last = text[-1]
100
- end
138
+ def print (text)
139
+ STDOUT.print(text)
101
140
 
102
- def flush
103
- STDOUT.sync
104
- end
105
- }.new))
141
+ @last = text[-1]
142
+ end
106
143
 
107
- puts if interpreter.output.last != "\n"
108
- end
144
+ def flush
145
+ STDOUT.sync
146
+ end
147
+ }.new))
148
+
149
+ puts if interpreter.output.last && interpreter.output.last != "\n"
109
150
  rescue SyntaxError
110
151
  next
111
152
  rescue
112
153
  STDOUT.puts $!.inspect.red, $@.join("\n")
113
154
  end
114
155
  end
156
+
157
+ puts "\nExiting REPL."
115
158
  end
116
159
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: rbf
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.6.1
5
+ version: 0.0.7
6
6
  platform: ruby
7
7
  authors:
8
8
  - meh.
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-06-24 00:00:00 Z
13
+ date: 2011-06-26 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: parslet
@@ -24,7 +24,7 @@ dependencies:
24
24
  type: :runtime
25
25
  version_requirements: *id001
26
26
  - !ruby/object:Gem::Dependency
27
- name: colorb
27
+ name: memoized
28
28
  prerelease: false
29
29
  requirement: &id002 !ruby/object:Gem::Requirement
30
30
  none: false
@@ -34,17 +34,6 @@ dependencies:
34
34
  version: "0"
35
35
  type: :runtime
36
36
  version_requirements: *id002
37
- - !ruby/object:Gem::Dependency
38
- name: memoized
39
- prerelease: false
40
- requirement: &id003 !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ">="
44
- - !ruby/object:Gem::Version
45
- version: "0"
46
- type: :runtime
47
- version_requirements: *id003
48
37
  description:
49
38
  email: meh@paranoici.org
50
39
  executables: