rbf 0.0.6.1 → 0.0.7

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.
@@ -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: