fish.rb 1.0.0 → 1.0.2
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.
- checksums.yaml +8 -8
- data/README.md +6 -0
- data/Rakefile +1 -1
- data/fish.rb +27 -18
- metadata +2 -5
- data/examples/fibonacci.fsh +0 -2
- data/examples/hello.fsh +0 -2
- data/examples/quine.fsh +0 -1
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MjhkODdkZWVjMjFlODExNGZiNmQ4Yjk4NzFkNmQ1N2I0NmNhZWI5Mw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MzNlMWE0MGQzZGQzZWQ1OTg3MWRkODczYjM1MzM0MGViNTg4ZmVjMg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZmZiYWZlMGEzNDNhNWQxM2QxMmEzMmZkMDIxZTQyYTEzZDE4MzVhNmYzMWYw
|
10
|
+
ZTQyZTM4YzZlMjY2YjNlZDNlYjk1M2MzNzA4MDkwMzY2M2U3M2ZjYmNmZjMw
|
11
|
+
N2NkOTY1MDBhM2JmZTAxMjU3NGU3NWNjZjc0NTMzZGFjZTdhMDc=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MWRhZGVhOTJhOGM5YTJkZGE2NWZkZDI3ODBkZDdkNjc3ZWU1MDdhZjhjOGE0
|
14
|
+
Yzg4MjdjOGZjNzJlYTRmODgzZjg5YzQzZTE3NWNiMzg0ZjYzYTAwNzA3NWM2
|
15
|
+
YWMzZDAxYmI2ZTcxMzcxNDE2MDg2MmE0MmI4MGE4ZTJiMTdiNTk=
|
data/README.md
CHANGED
data/Rakefile
CHANGED
@@ -13,7 +13,7 @@ spec = Gem::Specification.new do |gem|
|
|
13
13
|
gem.summary = "A fish interpreter"
|
14
14
|
gem.description = "Ruby fish interpreter for the newer multi-stack version of fish"
|
15
15
|
|
16
|
-
gem.files = `git ls-files`.split($\)
|
16
|
+
gem.files = `git ls-files | grep -v examples`.split($\)
|
17
17
|
|
18
18
|
gem.bindir = "./"
|
19
19
|
gem.executables = ["fish.rb"]
|
data/fish.rb
CHANGED
@@ -55,7 +55,7 @@ class Stack
|
|
55
55
|
@data = data
|
56
56
|
|
57
57
|
def self.pop cnt
|
58
|
-
if cnt > @data.length; abort
|
58
|
+
if cnt > @data.length; abort "\nsomething smells fishy... (stack error)" end
|
59
59
|
@data.pop cnt
|
60
60
|
end
|
61
61
|
|
@@ -64,18 +64,19 @@ class Stack
|
|
64
64
|
|
65
65
|
@reg = nil
|
66
66
|
def self.reg
|
67
|
-
if @reg.
|
68
|
-
@reg = self.pop 1
|
67
|
+
if @reg.nil?
|
68
|
+
@reg = (self.pop 1)[0]
|
69
69
|
else
|
70
70
|
self.push @reg
|
71
71
|
@reg = nil
|
72
|
-
ret
|
73
72
|
end
|
74
73
|
end
|
75
74
|
end
|
76
75
|
end # class Stack
|
77
76
|
|
78
77
|
class Interpreter
|
78
|
+
def self.set_stdout file; @@stdout = file end
|
79
|
+
|
79
80
|
@@prng = Random.new
|
80
81
|
@@stdout = $stdout
|
81
82
|
|
@@ -88,7 +89,7 @@ class Interpreter
|
|
88
89
|
}
|
89
90
|
|
90
91
|
@@div_chk = lambda do |d|
|
91
|
-
abort
|
92
|
+
abort "\nsomething smells fishy... (division by zero)" unless d != 0
|
92
93
|
end
|
93
94
|
|
94
95
|
@@ops = {
|
@@ -118,16 +119,16 @@ class Interpreter
|
|
118
119
|
'~' => lambda { |pt, dir, stks, box, cntl| stks[-1].pop 1 },
|
119
120
|
'$' => lambda { |pt, dir, stks, box, cntl| x, y = stks[-1].pop 2; stks[-1].push y; stks[-1].push x },
|
120
121
|
'@' => lambda { |pt, dir, stks, box, cntl| x, y, z = stks[-1].pop 3; stks[-1].push z; stks[-1].push x; stks[-1].push y },
|
121
|
-
'
|
122
|
-
'
|
122
|
+
'{' => lambda { |pt, dir, stks, box, cntl| stks[-1].data.rotate! 1 },
|
123
|
+
'}' => lambda { |pt, dir, stks, box, cntl| stks[-1].data.rotate! -1 },
|
123
124
|
'r' => lambda { |pt, dir, stks, box, cntl| stks[-1].data.reverse! },
|
124
125
|
'l' => lambda { |pt, dir, stks, box, cntl| stks[-1].push stks[-1].data.length },
|
125
|
-
'[' => lambda { |pt, dir, stks, box, cntl| stks << (Stack.new stks[-1].pop stks[-1].pop 1) },
|
126
|
-
']' => lambda { |pt, dir, stks, box, cntl| stks[-
|
126
|
+
'[' => lambda { |pt, dir, stks, box, cntl| stks << (Stack.new stks[-1].pop (stks[-1].pop 1)[0]) },
|
127
|
+
']' => lambda { |pt, dir, stks, box, cntl| stks[-2].data.concat stks.pop.data },
|
127
128
|
# io
|
128
129
|
'o' => lambda { |pt, dir, stks, box, cntl| @@stdout.write (stks[-1].pop 1)[0].round.chr },
|
129
130
|
'n' => lambda { |pt, dir, stks, box, cntl| @@stdout.write (stks[-1].pop 1)[0].to_s },
|
130
|
-
'i' => lambda { |pt, dir, stks, box, cntl| stks[-1].push (cntl[:ibuf].empty? ? -1 : cntl[:ibuf][0].ord); cntl[:ibuf] = cntl[:ibuf][1..-1] unless cntl[:ibuf].length <
|
131
|
+
'i' => lambda { |pt, dir, stks, box, cntl| stks[-1].push (cntl[:ibuf].empty? ? -1 : cntl[:ibuf][0].ord); cntl[:ibuf] = cntl[:ibuf][1..-1] unless cntl[:ibuf].length < 1 },
|
131
132
|
# reflection
|
132
133
|
'g' => lambda { |pt, dir, stks, box, cntl| stks[-1].push (box.at stks[-1].pop 2).ord },
|
133
134
|
'p' => lambda { |pt, dir, stks, box, cntl| box.set (stks[-1].pop 2), (stks[-1].pop 1) },
|
@@ -155,7 +156,7 @@ class Interpreter
|
|
155
156
|
@pt = [0, 0]
|
156
157
|
@dir = 'r'
|
157
158
|
@stks = []
|
158
|
-
@stks << (Stack.new [])
|
159
|
+
@stks << (Stack.new options[:stack])
|
159
160
|
@cntl = {
|
160
161
|
:ibuf => options[:stdin],
|
161
162
|
:done => false,
|
@@ -167,28 +168,36 @@ class Interpreter
|
|
167
168
|
op = ' ' if op.nil?
|
168
169
|
if options[:debug] >= 3; puts op end
|
169
170
|
func = @@ops[op]
|
170
|
-
abort
|
171
|
+
abort "\nsomething smells fishy... (invalid instruction)" if func.nil?
|
171
172
|
func.call @pt, @dir, @stks, @box, @cntl
|
172
173
|
op = @box.send @dir, @pt
|
173
174
|
end
|
175
|
+
@@stdout.flush
|
174
176
|
end
|
175
177
|
end # class Interpreter
|
176
178
|
|
179
|
+
banner = "usage: fish <options> <files>"
|
177
180
|
|
178
181
|
options = {}
|
179
182
|
optparse = OptionParser.new do |opts|
|
180
|
-
opts.banner =
|
183
|
+
opts.banner = banner
|
181
184
|
|
182
185
|
opts.on '-h', '--help', 'Display help' do; puts opts; exit end
|
183
186
|
options[:debug] = 0
|
184
|
-
opts.on '-d
|
187
|
+
opts.on '-d <level>', '--debug <level>', 'Print debug messages (max of 3, defaults to 1)' do |opt|
|
185
188
|
options[:debug] = opt.to_i || options[:debug] = 1
|
186
189
|
end
|
187
190
|
options[:stdin] = ""
|
188
|
-
opts.on '-s
|
189
|
-
opts.on '-r file', '--redir-stdout file', 'Redirect fish stdout to file' do |opt|
|
190
|
-
|
191
|
+
opts.on '-s <input>', '--stdin <input>', 'Stdin for fish script' do |opt|; options[:stdin] = opt end
|
192
|
+
opts.on '-r <file>', '--redir-stdout <file>', 'Redirect fish stdout to file (useful when debuging)' do |opt|
|
193
|
+
Interpreter.set_stdout (File.open opt, 'w')
|
194
|
+
end
|
195
|
+
options[:stack] = []
|
196
|
+
opts.on '-v <vector>', '--vector <vector>', Array, 'Inital stack vector' do |opt|
|
197
|
+
options[:stack] = opt.collect { |x| x.to_i }
|
191
198
|
end
|
192
199
|
end.parse!
|
193
200
|
|
194
|
-
|
201
|
+
puts banner if ARGV.empty?
|
202
|
+
|
203
|
+
ARGV.each { |fish| Interpreter.new (IO.readlines fish), options }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fish.rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ! 'floomby
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: ./
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-07-
|
13
|
+
date: 2014-07-10 00:00:00.000000000 Z
|
14
14
|
dependencies: []
|
15
15
|
description: Ruby fish interpreter for the newer multi-stack version of fish
|
16
16
|
email: ! 'floomby@nmt.edu
|
@@ -25,9 +25,6 @@ files:
|
|
25
25
|
- .gitignore
|
26
26
|
- README.md
|
27
27
|
- Rakefile
|
28
|
-
- examples/fibonacci.fsh
|
29
|
-
- examples/hello.fsh
|
30
|
-
- examples/quine.fsh
|
31
28
|
- fish.rb
|
32
29
|
homepage: https://github.com/zerocool/fish.rb
|
33
30
|
licenses: []
|
data/examples/fibonacci.fsh
DELETED
data/examples/hello.fsh
DELETED
data/examples/quine.fsh
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
"ar00g!;oooooooooo|
|