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.
- data/lib/rbf/interpreter/extensions.rb +1 -1
- data/lib/rbf/interpreter/storage.rb +9 -0
- data/lib/rbf/optimizer.rb +4 -2
- data/lib/rbf.rb +86 -43
- metadata +3 -14
@@ -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 =
|
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
|
-
|
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
|
-
|
56
|
-
|
57
|
-
STDOUT.flush
|
97
|
+
while line = Readline.readline_with_hist_management
|
98
|
+
line.rstrip!
|
58
99
|
|
59
|
-
|
60
|
-
line
|
61
|
-
|
62
|
-
|
100
|
+
if line.start_with?('!')
|
101
|
+
case line[1 .. -1]
|
102
|
+
when 'exit', 'quit'
|
103
|
+
break
|
63
104
|
|
64
|
-
|
65
|
-
|
105
|
+
when 'storage'
|
106
|
+
STDOUT.puts interpreter.storage.inspect
|
66
107
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
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
|
-
|
74
|
-
|
115
|
+
when /^get(?:\s+(\d+))?$/
|
116
|
+
STDOUT.puts "#{($1 || interpreter.storage.position).to_s.bold}: #{interpreter.storage.get($1)}"
|
75
117
|
|
76
|
-
|
77
|
-
|
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
|
-
|
84
|
-
|
121
|
+
when 'clear'
|
122
|
+
interpreter.storage.clear!
|
85
123
|
|
86
|
-
|
87
|
-
|
124
|
+
when 'reset'
|
125
|
+
interpreter.storage.reset!
|
88
126
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
127
|
+
else
|
128
|
+
STDOUT.puts 'Command not found or used improperly'.red
|
129
|
+
end
|
130
|
+
|
131
|
+
next
|
132
|
+
end
|
95
133
|
|
96
|
-
|
97
|
-
|
134
|
+
begin
|
135
|
+
interpreter.evaluate(line, interpreter.options.merge(:output => Class.new {
|
136
|
+
attr_reader :last
|
98
137
|
|
99
|
-
|
100
|
-
|
138
|
+
def print (text)
|
139
|
+
STDOUT.print(text)
|
101
140
|
|
102
|
-
|
103
|
-
|
104
|
-
end
|
105
|
-
}.new))
|
141
|
+
@last = text[-1]
|
142
|
+
end
|
106
143
|
|
107
|
-
|
108
|
-
|
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.
|
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-
|
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:
|
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:
|