arnoldc.rb 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []