arnoldc.rb 1.0.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3bc9f4118a8f08481fa84f42e2dab588c56ac730
4
+ data.tar.gz: c2e9b18cfc1ca0bb1dec386d2349f14879784aca
5
+ SHA512:
6
+ metadata.gz: b32be5ecec2e527b37667fe77003b2f70fc3d52ba553713caadaebe856f772d1cb82254770cefdc9905639c9f608856a0fcfcda9a6fdf21475f21b06a589d047
7
+ data.tar.gz: fccc33994aa1a0a2cfb3e8183ce8af649ef6d2f61bd8e4c24fc64e485df9a0bace8359a55bb37d68e936e739d7e53b1a4e9682cd9c6086ebd049139c009d52c9
@@ -0,0 +1,297 @@
1
+ # arnoldc.rb
2
+
3
+ [ArnoldC](https://github.com/lhartikk/ArnoldC) on top of any Ruby Virtual Machine.
4
+
5
+ ## INSTALLATION
6
+
7
+ gem install arnoldc
8
+
9
+ ## USAGE
10
+
11
+ ```ruby
12
+ λ arnoldc.rb my_script.arnoldc
13
+ ```
14
+
15
+ Example:
16
+
17
+ ```ruby
18
+ λ arnoldc.rb samples/fizzbuzz.arnoldc
19
+ arnoldc.rb...
20
+
21
+ 1
22
+ 2
23
+ Fizz
24
+ 4
25
+ Buzz
26
+ Fizz
27
+ 7
28
+ 8
29
+ Fizz
30
+ Buzz
31
+ 11
32
+ Fizz
33
+ 13
34
+ 14
35
+ FizzBuzz
36
+ 16
37
+ 17
38
+ Fizz
39
+ 19
40
+ Buzz
41
+ Fizz
42
+ 22
43
+ 23
44
+ Fizz
45
+ Buzz
46
+ 26
47
+ Fizz
48
+ 28
49
+ 29
50
+ FizzBuzz
51
+ 31
52
+ 32
53
+ Fizz
54
+ 34
55
+ Buzz
56
+ Fizz
57
+ 37
58
+ 38
59
+ Fizz
60
+ Buzz
61
+ 41
62
+ Fizz
63
+ 43
64
+ 44
65
+ FizzBuzz
66
+ 46
67
+ 47
68
+ Fizz
69
+ 49
70
+ Buzz
71
+ Fizz
72
+ 52
73
+ 53
74
+ Fizz
75
+ Buzz
76
+ 56
77
+ Fizz
78
+ 58
79
+ 59
80
+ FizzBuzz
81
+ 61
82
+ 62
83
+ Fizz
84
+ 64
85
+ Buzz
86
+ Fizz
87
+ 67
88
+ 68
89
+ Fizz
90
+ Buzz
91
+ 71
92
+ Fizz
93
+ 73
94
+ 74
95
+ FizzBuzz
96
+ 76
97
+ 77
98
+ Fizz
99
+ 79
100
+ Buzz
101
+ Fizz
102
+ 82
103
+ 83
104
+ Fizz
105
+ Buzz
106
+ 86
107
+ Fizz
108
+ 88
109
+ 89
110
+ FizzBuzz
111
+ 91
112
+ 92
113
+ Fizz
114
+ 94
115
+ Buzz
116
+ Fizz
117
+ 97
118
+ 98
119
+ Fizz
120
+ Buzz
121
+
122
+ Exiting.
123
+ ```
124
+
125
+ You can turn on debug mode by using the -w option of the Ruby VM:
126
+
127
+ ```ruby
128
+ /tmp/arnoldc.rb [±] λ ruby arnoldc.rb samples/fizzbuzz.arnoldc
129
+ arnoldc.rb...
130
+ L0000: def main
131
+ L0001: isLessThan100 = true
132
+ L0002: n = 0
133
+ L0003: multiple = true
134
+ L0004: while isLessThan100
135
+ L0005: n = \
136
+ L0006: n\
137
+ L0007: + 1
138
+ L0008: isLessThan100 = \
139
+ L0009: 100\
140
+ L0010: > n
141
+ L0011: multiple = \
142
+ L0012: divisible(n, 15)
143
+ L0013: if multiple
144
+ L0014: puts "FizzBuzz"
145
+ L0015: else
146
+ L0016: multiple = \
147
+ L0017: divisible(n, 3)
148
+ L0018: if multiple
149
+ L0019: puts "Fizz"
150
+ L0020: else
151
+ L0021: multiple = \
152
+ L0022: divisible(n, 5)
153
+ L0023: if multiple
154
+ L0024: puts "Buzz"
155
+ L0025: else
156
+ L0026: puts n
157
+ L0027: end
158
+ L0028: end
159
+ L0029: end
160
+ L0030: end
161
+ L0031: end
162
+ L0032: def modulo(
163
+ L0033: dividend,
164
+ L0034: divisor,
165
+ L0035: unused=0)
166
+ L0036: quotient = 0
167
+ L0037: remainder = 0
168
+ L0038: product = 0
169
+ L0039: quotient = \
170
+ L0040: dividend\
171
+ L0041: * 1/divisor
172
+ L0042: product = \
173
+ L0043: divisor\
174
+ L0044: * quotient
175
+ L0045: remainder = \
176
+ L0046: dividend\
177
+ L0047: - product
178
+ L0048: return remainder
179
+ L0049: end
180
+ L0050: def divisible(
181
+ L0051: dividend,
182
+ L0052: divisor,
183
+ L0053: unused=0)
184
+ L0054: result = 0
185
+ L0055: result = \
186
+ L0056: modulo(dividend, divisor)
187
+ L0057: isZero = 0
188
+ L0058: isZero = \
189
+ L0059: result\
190
+ L0060: == 0
191
+ L0061: return isZero
192
+ L0062: end
193
+ L0063: main
194
+
195
+ 1
196
+ 2
197
+ Fizz
198
+ 4
199
+ Buzz
200
+ Fizz
201
+ 7
202
+ 8
203
+ Fizz
204
+ Buzz
205
+ 11
206
+ Fizz
207
+ 13
208
+ 14
209
+ FizzBuzz
210
+ 16
211
+ 17
212
+ Fizz
213
+ 19
214
+ Buzz
215
+ Fizz
216
+ 22
217
+ 23
218
+ Fizz
219
+ Buzz
220
+ 26
221
+ Fizz
222
+ 28
223
+ 29
224
+ FizzBuzz
225
+ 31
226
+ 32
227
+ Fizz
228
+ 34
229
+ Buzz
230
+ Fizz
231
+ 37
232
+ 38
233
+ Fizz
234
+ Buzz
235
+ 41
236
+ Fizz
237
+ 43
238
+ 44
239
+ FizzBuzz
240
+ 46
241
+ 47
242
+ Fizz
243
+ 49
244
+ Buzz
245
+ Fizz
246
+ 52
247
+ 53
248
+ Fizz
249
+ Buzz
250
+ 56
251
+ Fizz
252
+ 58
253
+ 59
254
+ FizzBuzz
255
+ 61
256
+ 62
257
+ Fizz
258
+ 64
259
+ Buzz
260
+ Fizz
261
+ 67
262
+ 68
263
+ Fizz
264
+ Buzz
265
+ 71
266
+ Fizz
267
+ 73
268
+ 74
269
+ FizzBuzz
270
+ 76
271
+ 77
272
+ Fizz
273
+ 79
274
+ Buzz
275
+ Fizz
276
+ 82
277
+ 83
278
+ Fizz
279
+ Buzz
280
+ 86
281
+ Fizz
282
+ 88
283
+ 89
284
+ FizzBuzz
285
+ 91
286
+ 92
287
+ Fizz
288
+ 94
289
+ Buzz
290
+ Fizz
291
+ 97
292
+ 98
293
+ Fizz
294
+ Buzz
295
+
296
+ Exiting.
297
+ ```
@@ -0,0 +1,17 @@
1
+ # coding: utf-8
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "arnoldc.rb"
5
+ spec.version = "1.0.0"
6
+ spec.authors = ["Franck Verrot"]
7
+ spec.email = ["franck@verrot.fr"]
8
+ spec.summary = %q{arnoldc Ruby implementation}
9
+ spec.description = spec.summary
10
+ spec.homepage = "https://github.com/franckverrot/arnoldc.rb"
11
+ spec.license = "GPLv3"
12
+
13
+ spec.files = `git ls-files -z`.split("\x0")
14
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
15
+
16
+ spec.add_development_dependency "bundler", "~> 1.5"
17
+ end
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env ruby
2
+ # COMPUTE FILE NAME
3
+ filename = ARGV.fetch(0) { raise ArgumentError, 'You should provide a script name. eg: ./arnoldc.rb my_file.arnoldc' }
4
+
5
+ # READ FILE
6
+ data = File.read(filename)
7
+
8
+ # DROP LEADING SPACES
9
+ data.gsub!(/^\s*(.*)/) { $1 }
10
+
11
+ # MAIN PROGRAM
12
+ data.gsub!(/IT'S SHOWTIME/,"def main")
13
+ data.gsub!(/(HASTA LA VISTA, BABY|CHILL|YOU HAVE BEEN TERMINATED|YOU HAVE NO RESPECT FOR LOGIC)/,"end")
14
+
15
+ # MACROS
16
+ data.gsub!(/@NO PROBLEMO/,"true")
17
+ data.gsub!(/@I LIED/,"false")
18
+
19
+ # CONDITIONALS
20
+ data.gsub!(/BECAUSE I'M GOING TO SAY PLEASE (\w*)/) { "if #{$1}" }
21
+ data.gsub!(/BULLSHIT/,"else")
22
+
23
+ # LOOP
24
+ data.gsub!(/STICK AROUND (\w*)/) { "while #{$1}" }
25
+
26
+ # ASSIGNMENTS
27
+ data.gsub!(/HEY CHRISTMAS TREE (\w+)\nYOU SET US UP (\w*)/) { "#{$1} = #{$2}" }
28
+ data.gsub!(/GET TO THE CHOPPER (\w+)/) { "#{$1} = \\" }
29
+ data.gsub!(/GET YOUR ASS TO MARS (\w+)/) { "#{$1} = \\" }
30
+
31
+ # METHODS
32
+ data.gsub!(/LISTEN TO ME VERY CAREFULLY (\w+)/) { "def #{$1}(" }
33
+ data.gsub!(/I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE (\w+)/) { "#{$1}," }
34
+
35
+ # METHOD CALLS
36
+ data.gsub!(/DO IT NOW (\w*) (\w+) (\w+)/) { "#{$1}(#{$2}, #{$3})" }
37
+ data.gsub!(/HERE IS MY INVITATION (\w+)/) { "#{$1}\\" }
38
+
39
+ # ARITHMETICS
40
+ data.gsub!(/GET DOWN (\w+)/) { "- #{$1}" }
41
+ data.gsub!(/GET UP (\w+)/) { "+ #{$1}" }
42
+ data.gsub!(/YOU'RE FIRED (\w+)/) { "* #{$1}" }
43
+ data.gsub!(/HE HAD TO SPLIT (\w+)/) { "* 1/#{$1}" }
44
+
45
+ # COMPARISONS
46
+ data.gsub!(/YOU ARE NOT YOU YOU ARE ME (\w+)/) { "== #{$1}" }
47
+ data.gsub!(/LET OFF SOME STEAM BENNET (\w+)/) { "> #{$1}" }
48
+ data.gsub!(/CONSIDER THAT A DIVORCE (\w+)/) { "|| #{$1}" }
49
+ data.gsub!(/KNOCK KNOCK (\w+)/) { "&& #{$1}" }
50
+
51
+ # HACKS :-D
52
+ data.gsub!(/ENOUGH TALK/) { "" }
53
+ data.gsub!(/GIVE THESE PEOPLE AIR/) { "unused=0)" }
54
+ data.gsub!(/I'LL BE BACK (\w+)/) { "return #{$1}" }
55
+ data.gsub!(/TALK TO THE HAND (.*)/) { "puts #{$1}" }
56
+
57
+ # WRAPPING THE SH*T UP
58
+ locs = data.split("\n").reject { |l| l.empty? } + ["main"]
59
+ data = locs.map.with_index { |l,i| "L%04d: %s" % [i, l] }.join("\n")
60
+
61
+ code = locs.join("\n")
62
+ puts "arnoldc.rb..."
63
+ puts data if $-w
64
+ puts
65
+
66
+ eval(code)
67
+
68
+ puts "\nExiting."
@@ -0,0 +1,3 @@
1
+ IT'S SHOWTIME
2
+ TALK TO THE HAND "hello world"
3
+ YOU HAVE BEEN TERMINATED
@@ -0,0 +1,25 @@
1
+ IT'S SHOWTIME
2
+ HEY CHRISTMAS TREE limit
3
+ YOU SET US UP 10
4
+ HEY CHRISTMAS TREE index
5
+ YOU SET US UP 1
6
+ HEY CHRISTMAS TREE squared
7
+ YOU SET US UP 1
8
+ HEY CHRISTMAS TREE loop
9
+ YOU SET US UP @NO PROBLEMO
10
+ STICK AROUND loop
11
+ GET TO THE CHOPPER squared
12
+ HERE IS MY INVITATION index
13
+ YOU'RE FIRED index
14
+ ENOUGH TALK
15
+ TALK TO THE HAND squared
16
+ GET TO THE CHOPPER loop
17
+ HERE IS MY INVITATION limit
18
+ LET OFF SOME STEAM BENNET index
19
+ ENOUGH TALK
20
+ GET TO THE CHOPPER index
21
+ HERE IS MY INVITATION index
22
+ GET UP 1
23
+ ENOUGH TALK
24
+ CHILL
25
+ YOU HAVE BEEN TERMINATED
@@ -0,0 +1,87 @@
1
+ IT'S SHOWTIME
2
+
3
+ HEY CHRISTMAS TREE isLessThan100
4
+ YOU SET US UP @NO PROBLEMO
5
+ HEY CHRISTMAS TREE n
6
+ YOU SET US UP 0
7
+ HEY CHRISTMAS TREE multiple
8
+ YOU SET US UP @NO PROBLEMO
9
+
10
+ STICK AROUND isLessThan100
11
+ GET TO THE CHOPPER n
12
+ HERE IS MY INVITATION n
13
+ GET UP 1
14
+ ENOUGH TALK
15
+
16
+ GET TO THE CHOPPER isLessThan100
17
+ HERE IS MY INVITATION 100
18
+ LET OFF SOME STEAM BENNET n
19
+ ENOUGH TALK
20
+
21
+ GET YOUR ASS TO MARS multiple
22
+ DO IT NOW divisible n 15
23
+ BECAUSE I'M GOING TO SAY PLEASE multiple
24
+ TALK TO THE HAND "FizzBuzz"
25
+ BULLSHIT
26
+ GET YOUR ASS TO MARS multiple
27
+ DO IT NOW divisible n 3
28
+ BECAUSE I'M GOING TO SAY PLEASE multiple
29
+ TALK TO THE HAND "Fizz"
30
+ BULLSHIT
31
+ GET YOUR ASS TO MARS multiple
32
+ DO IT NOW divisible n 5
33
+ BECAUSE I'M GOING TO SAY PLEASE multiple
34
+ TALK TO THE HAND "Buzz"
35
+ BULLSHIT
36
+ TALK TO THE HAND n
37
+ YOU HAVE NO RESPECT FOR LOGIC
38
+ YOU HAVE NO RESPECT FOR LOGIC
39
+ YOU HAVE NO RESPECT FOR LOGIC
40
+ CHILL
41
+
42
+ YOU HAVE BEEN TERMINATED
43
+
44
+ LISTEN TO ME VERY CAREFULLY modulo
45
+ I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE dividend
46
+ I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE divisor
47
+ GIVE THESE PEOPLE AIR
48
+ HEY CHRISTMAS TREE quotient
49
+ YOU SET US UP 0
50
+ HEY CHRISTMAS TREE remainder
51
+ YOU SET US UP 0
52
+ HEY CHRISTMAS TREE product
53
+ YOU SET US UP 0
54
+ GET TO THE CHOPPER quotient
55
+ HERE IS MY INVITATION dividend
56
+ HE HAD TO SPLIT divisor
57
+ ENOUGH TALK
58
+ GET TO THE CHOPPER product
59
+ HERE IS MY INVITATION divisor
60
+ YOU'RE FIRED quotient
61
+ ENOUGH TALK
62
+ GET TO THE CHOPPER remainder
63
+ HERE IS MY INVITATION dividend
64
+ GET DOWN product
65
+ ENOUGH TALK
66
+ I'LL BE BACK remainder
67
+ HASTA LA VISTA, BABY
68
+
69
+ LISTEN TO ME VERY CAREFULLY divisible
70
+ I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE dividend
71
+ I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE divisor
72
+ GIVE THESE PEOPLE AIR
73
+
74
+ HEY CHRISTMAS TREE result
75
+ YOU SET US UP 0
76
+ GET YOUR ASS TO MARS result
77
+ DO IT NOW modulo dividend divisor
78
+
79
+ HEY CHRISTMAS TREE isZero
80
+ YOU SET US UP 0
81
+ GET TO THE CHOPPER isZero
82
+ HERE IS MY INVITATION result
83
+ YOU ARE NOT YOU YOU ARE ME 0
84
+ ENOUGH TALK
85
+
86
+ I'LL BE BACK isZero
87
+ HASTA LA VISTA, BABY
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: arnoldc.rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Franck Verrot
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-02-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.5'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.5'
27
+ description: arnoldc Ruby implementation
28
+ email:
29
+ - franck@verrot.fr
30
+ executables:
31
+ - arnoldc.rb
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - README.md
36
+ - arnoldc.rb.gemspec
37
+ - bin/arnoldc.rb
38
+ - samples/HelloWorld.arnoldc
39
+ - samples/file.arnoldc
40
+ - samples/fizzbuzz.arnoldc
41
+ homepage: https://github.com/franckverrot/arnoldc.rb
42
+ licenses:
43
+ - GPLv3
44
+ metadata: {}
45
+ post_install_message:
46
+ rdoc_options: []
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ requirements: []
60
+ rubyforge_project:
61
+ rubygems_version: 2.2.0
62
+ signing_key:
63
+ specification_version: 4
64
+ summary: arnoldc Ruby implementation
65
+ test_files: []