lrb 0.0.1 → 0.0.3
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 +4 -4
- data/README.md +16 -19
- data/bin/lrb +4 -1
- data/lib/lrb.rb +127 -18
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 91b1b3463d0a8c5618c45cfe15e829cdd7340ac6
|
4
|
+
data.tar.gz: 2318438a0a671cc8b1e7f12adb30e35e9a5f7bac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 180ec2126d1c55a186d55c7b6ac69fdabc3f7991098d88b5b27f5cbaa7e8d54299974e5ab3f8dc2a5553da37942342c9ca1ed9e9b94c0b33feaa9af5593412b6
|
7
|
+
data.tar.gz: 9839e93cc80d0cec69d4f40dcf0561d0954d3aa2e5b2aad884062b2630d2580cc222363d2f90cf6674ff6b20e17ea8ce28cb6bcf1db888b8621d4ce63fabdf64
|
data/README.md
CHANGED
@@ -5,6 +5,18 @@
|
|
5
5
|
|
6
6
|
gem install lrb
|
7
7
|
|
8
|
+
\* To Start REPL:
|
9
|
+
|
10
|
+
lrb
|
11
|
+
|
12
|
+
\* for debug mode:
|
13
|
+
|
14
|
+
[debug]
|
15
|
+
|
16
|
+
\* To compile & run a source file:
|
17
|
+
|
18
|
+
lrb test.lrb
|
19
|
+
|
8
20
|
\* LRB source look like lisp, but with braces:
|
9
21
|
|
10
22
|
[require "colorize"]
|
@@ -168,19 +180,6 @@
|
|
168
180
|
elsif true
|
169
181
|
puts "as always"
|
170
182
|
end
|
171
|
-
100
|
172
|
-
3628800
|
173
|
-
only block !
|
174
|
-
1st statement
|
175
|
-
2nd statement
|
176
|
-
true
|
177
|
-
Trung
|
178
|
-
Hello Trung !
|
179
|
-
[4]
|
180
|
-
Heello
|
181
|
-
1
|
182
|
-
2
|
183
|
-
3
|
184
183
|
|
185
184
|
|
186
185
|
\* And evaluate everything:
|
@@ -199,14 +198,12 @@
|
|
199
198
|
1
|
200
199
|
2
|
201
200
|
3
|
201
|
+
one is not lesser than zero
|
202
|
+
4
|
203
|
+
2
|
204
|
+
1 >= 0
|
202
205
|
|
203
206
|
|
204
|
-
\* To run a source such as `test.lrb` in this repo:
|
205
|
-
|
206
|
-
lrb file_name.lrb
|
207
|
-
|
208
|
-
It will compile and run just as above.
|
209
|
-
|
210
207
|
Currently, it's only experiment toy,
|
211
208
|
not yet support `repl` or `macros`.
|
212
209
|
|
data/bin/lrb
CHANGED
@@ -16,13 +16,16 @@ spec = Oyster.spec do
|
|
16
16
|
'Start an interactive Scheme session'
|
17
17
|
end
|
18
18
|
|
19
|
+
require "rubygems"
|
19
20
|
|
20
21
|
begin
|
21
22
|
options = spec.parse
|
22
23
|
|
23
24
|
if options[:interactive] or options[:unclaimed].empty?
|
24
|
-
puts "
|
25
|
+
puts "lrb:repl".light_yellow
|
26
|
+
Lrb.new.repl
|
25
27
|
else
|
28
|
+
puts "lrb:compile".light_yellow
|
26
29
|
lrb = Lrb.new
|
27
30
|
lrb.eval_file File.expand_path(options[:unclaimed].first)
|
28
31
|
end
|
data/lib/lrb.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
+
require "readline"
|
1
2
|
require "colorize"
|
2
3
|
require "bracer"
|
4
|
+
# require "sexpistol"
|
3
5
|
require "pry"
|
4
6
|
|
5
7
|
class Lrb
|
@@ -11,27 +13,65 @@ class Lrb
|
|
11
13
|
@stack = Array.new
|
12
14
|
@parser = Bracer.new
|
13
15
|
@parser.ruby_keyword_literals = true
|
16
|
+
readline_autocompletion
|
14
17
|
end
|
15
18
|
|
16
19
|
def parse source
|
17
20
|
@parser.parse_string source
|
18
21
|
end
|
19
22
|
|
23
|
+
def repl
|
24
|
+
begin
|
25
|
+
while line = readline_with_hist_management
|
26
|
+
@stack << line
|
27
|
+
if balanced?
|
28
|
+
e = eval_source @stack.join " "
|
29
|
+
puts e.to_s.blue
|
30
|
+
@stack.clear
|
31
|
+
@indent = 0
|
32
|
+
end
|
33
|
+
end
|
34
|
+
rescue Interrupt => e
|
35
|
+
puts "\nGoodbye !".light_yellow
|
36
|
+
exit
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
20
40
|
def eval_file path
|
21
41
|
source = File.read path
|
22
|
-
|
23
|
-
puts source.light_yellow
|
24
|
-
|
25
|
-
e = to_ruby source
|
26
|
-
puts e.light_green
|
27
|
-
|
28
|
-
puts "\n[evaluated]:".light_yellow
|
29
|
-
puts "#{eval e}".blue
|
42
|
+
eval_source source, mode = :compile
|
30
43
|
end
|
31
44
|
|
32
|
-
def
|
33
|
-
|
34
|
-
|
45
|
+
def eval_source source, mode = :repl
|
46
|
+
begin
|
47
|
+
e = to_ruby source
|
48
|
+
evaluated = eval e
|
49
|
+
rescue Exception => ex
|
50
|
+
if @debug
|
51
|
+
puts ex.backtrace.join("\n").red
|
52
|
+
binding.pry
|
53
|
+
end
|
54
|
+
puts ex.message.red
|
55
|
+
end
|
56
|
+
if @debug
|
57
|
+
if mode == :compile
|
58
|
+
puts "[LRB]:".light_yellow
|
59
|
+
puts source.light_yellow
|
60
|
+
end
|
61
|
+
puts e.light_green
|
62
|
+
if mode == :compile
|
63
|
+
puts "\n[evaluated]:".light_yellow
|
64
|
+
puts "#{evaluated}".blue
|
65
|
+
end
|
66
|
+
end
|
67
|
+
evaluated
|
68
|
+
end
|
69
|
+
|
70
|
+
def eval_list list
|
71
|
+
eval list_to_ruby(list)
|
72
|
+
end
|
73
|
+
|
74
|
+
def list_to_ruby ast
|
35
75
|
ast = ast.map do |sexp|
|
36
76
|
result = transform sexp
|
37
77
|
puts result if @debug
|
@@ -40,6 +80,12 @@ class Lrb
|
|
40
80
|
ast.join "\n\n"
|
41
81
|
end
|
42
82
|
|
83
|
+
def to_ruby source
|
84
|
+
ast = parse source
|
85
|
+
puts "parsed: #{ast}".green if @debug
|
86
|
+
list_to_ruby ast
|
87
|
+
end
|
88
|
+
|
43
89
|
def transform sexp
|
44
90
|
puts line if @debug
|
45
91
|
if sexp.class == Array
|
@@ -69,11 +115,37 @@ class Lrb
|
|
69
115
|
indent + result
|
70
116
|
else
|
71
117
|
puts "#{sexp}".yellow if @debug
|
72
|
-
sexp
|
118
|
+
sexp
|
73
119
|
end
|
74
120
|
end
|
75
121
|
|
76
122
|
private
|
123
|
+
def balanced?
|
124
|
+
source = @stack.join " "
|
125
|
+
@left = source.count "["
|
126
|
+
@right = source.count "]"
|
127
|
+
@indent = @left - @right if (@left - @right) > 0
|
128
|
+
@left == @right
|
129
|
+
end
|
130
|
+
|
131
|
+
def readline_autocompletion
|
132
|
+
@dict = KEYWORD.keys.sort
|
133
|
+
|
134
|
+
comp = proc { |s| @dict.grep( /^#{Regexp.escape(s)}/ ) }
|
135
|
+
|
136
|
+
Readline.completion_append_character = " "
|
137
|
+
Readline.completion_proc = comp
|
138
|
+
end
|
139
|
+
|
140
|
+
def readline_with_hist_management
|
141
|
+
line = Readline.readline('> ' + indent, true)
|
142
|
+
return nil if line.nil?
|
143
|
+
if line =~ /^\s*$/ or Readline::HISTORY.to_a[-2] == line
|
144
|
+
Readline::HISTORY.pop
|
145
|
+
end
|
146
|
+
line
|
147
|
+
end
|
148
|
+
|
77
149
|
def class_method? function
|
78
150
|
function[0] == "."
|
79
151
|
end
|
@@ -87,11 +159,22 @@ class Lrb
|
|
87
159
|
if arg.class == String
|
88
160
|
"\"#{arg}\""
|
89
161
|
else
|
90
|
-
arg
|
162
|
+
replace_parenthese arg
|
91
163
|
end
|
92
164
|
end
|
93
165
|
end
|
94
166
|
|
167
|
+
def replace_parenthese arg
|
168
|
+
if arg.to_s["("] && arg.to_s[")"]
|
169
|
+
old = arg
|
170
|
+
arg = arg.to_s.gsub(/\((.*)\)/, '[\1]').to_sym
|
171
|
+
puts "arg: #{old} => #{arg}".light_yellow if @debug
|
172
|
+
arg
|
173
|
+
else
|
174
|
+
arg
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
95
178
|
def transform_exp exps
|
96
179
|
exps.map do |arg|
|
97
180
|
unless arg.class == String
|
@@ -124,7 +207,11 @@ class Lrb
|
|
124
207
|
end
|
125
208
|
|
126
209
|
def operator op, args
|
127
|
-
args
|
210
|
+
args = args.map do |arg|
|
211
|
+
transform arg
|
212
|
+
end
|
213
|
+
e = args.join " #{op.to_s} "
|
214
|
+
"(#{e})"
|
128
215
|
end
|
129
216
|
|
130
217
|
def transform_body block
|
@@ -171,7 +258,9 @@ class Lrb
|
|
171
258
|
:'=' => lambda {|left, right| "#{left} = #{transform right}"},
|
172
259
|
:== => lambda {|left, right| "#{transform left} == #{transform right}"},
|
173
260
|
|
174
|
-
|
261
|
+
:quote => lambda {|*args|
|
262
|
+
"#{args.first}"
|
263
|
+
},
|
175
264
|
:list => lambda {|*args|
|
176
265
|
"[#{args.join ', '}]"
|
177
266
|
},
|
@@ -184,6 +273,8 @@ class Lrb
|
|
184
273
|
].join("\n")
|
185
274
|
},
|
186
275
|
:begin => lambda {|do_block, rescue_block|
|
276
|
+
do_block = transform_body do_block
|
277
|
+
rescue_block = transform_body rescue_block
|
187
278
|
["begin",
|
188
279
|
" #{do_block}",
|
189
280
|
"rescue Exception => e",
|
@@ -191,6 +282,11 @@ class Lrb
|
|
191
282
|
"end"
|
192
283
|
].join("\n")
|
193
284
|
},
|
285
|
+
:debug => lambda {
|
286
|
+
@debug = !@debug
|
287
|
+
puts "[DEBUG = #{@debug}]".light_yellow
|
288
|
+
""
|
289
|
+
},
|
194
290
|
:do => lambda {|fun, args, bodies|
|
195
291
|
fun = transform fun
|
196
292
|
args = args.join ", "
|
@@ -200,6 +296,13 @@ class Lrb
|
|
200
296
|
"end"
|
201
297
|
].join("\n")
|
202
298
|
},
|
299
|
+
:class => lambda {|name, body|
|
300
|
+
body = transform_body body
|
301
|
+
["class #{name}",
|
302
|
+
" #{body}",
|
303
|
+
"end"
|
304
|
+
].join("\n")
|
305
|
+
},
|
203
306
|
:def => lambda {|args, body|
|
204
307
|
name = args.first
|
205
308
|
args = args.drop(1).join ", "
|
@@ -234,8 +337,14 @@ class Lrb
|
|
234
337
|
}
|
235
338
|
end
|
236
339
|
# @test = Lrb.new
|
237
|
-
#
|
340
|
+
# @test.debug = true
|
238
341
|
# x = @test.to_ruby <<-REC
|
342
|
+
# [= @a Hash.new]
|
343
|
+
|
344
|
+
# [= @a(:test) 1]
|
345
|
+
|
346
|
+
# [puts
|
347
|
+
# [.blue "HELLO ROSE"]]
|
239
348
|
# REC
|
240
|
-
#
|
241
|
-
#
|
349
|
+
# eval x
|
350
|
+
# @test.repl
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lrb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- The Trung
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pry
|
@@ -66,7 +66,7 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
-
description: It transform Ruby to a Lisp with braces
|
69
|
+
description: It transform Ruby to a Lisp with braces, included REPL mode.
|
70
70
|
email: deulamco@gmail.com
|
71
71
|
executables:
|
72
72
|
- lrb
|