lrb 0.0.0 → 0.0.1
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 +213 -0
- data/lib/lrb.rb +114 -25
- metadata +15 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f1cd3e16d04456b052cdabcd6ad3fd3509d5f4bd
|
4
|
+
data.tar.gz: 7db9624b48b357c1bb23fe4b280018c70945d73f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f9f53921407081952ac231180a3728a38ac2a612557e6d3a70ff8ce4948a5fbb44dcee6572cbf5110d6cf2184a6447f64df3f61744fd0f121f98fe284b5f0707
|
7
|
+
data.tar.gz: 5b068a2f5f1b8dfd166e12fae9dbca72ca2cd46b0976eaa90745fa7869b630f1a31c09fedabafa387200206ef3eedaf134f712863824918f7a36f31d459c3d86
|
data/README.md
ADDED
@@ -0,0 +1,213 @@
|
|
1
|
+
# Lispy Ruby
|
2
|
+
[LRB] transform Ruby to a Lisp with braces, remain all ruby keywords and same funtionalities.
|
3
|
+
|
4
|
+
\* Install:
|
5
|
+
|
6
|
+
gem install lrb
|
7
|
+
|
8
|
+
\* LRB source look like lisp, but with braces:
|
9
|
+
|
10
|
+
[require "colorize"]
|
11
|
+
|
12
|
+
[def [square x]
|
13
|
+
[* x x]
|
14
|
+
]
|
15
|
+
|
16
|
+
[def [factorial acc n]
|
17
|
+
[if [< n 1]
|
18
|
+
acc
|
19
|
+
[factorial [* acc n] [- n 1]]]]
|
20
|
+
|
21
|
+
|
22
|
+
[puts [square 10]]
|
23
|
+
[puts [factorial 1 10]]
|
24
|
+
|
25
|
+
|
26
|
+
[def [single_exp]
|
27
|
+
[puts "only block !"]
|
28
|
+
]
|
29
|
+
|
30
|
+
[def [multiple_exps][
|
31
|
+
[puts "1st statement"]
|
32
|
+
[puts "2nd statement"]
|
33
|
+
]
|
34
|
+
]
|
35
|
+
|
36
|
+
[single_exp]
|
37
|
+
[multiple_exps]
|
38
|
+
|
39
|
+
|
40
|
+
[puts [== 1 1]]
|
41
|
+
|
42
|
+
[= name :Trung.to_s ]
|
43
|
+
[puts name]
|
44
|
+
[puts [+ "Hello " name " \!"]]
|
45
|
+
|
46
|
+
[= lst [list 1 2 3]]
|
47
|
+
[= lst Array.new]
|
48
|
+
[<< lst 4]
|
49
|
+
[puts lst.to_s.blue]
|
50
|
+
|
51
|
+
[puts [.to_s.blue [+ "Heell" "o"]]]
|
52
|
+
|
53
|
+
[do [.map [list 1 2 3]] [n][
|
54
|
+
[puts n]
|
55
|
+
]
|
56
|
+
]
|
57
|
+
|
58
|
+
[unless [< 1 0]
|
59
|
+
[puts "one is not lesser than zero"]
|
60
|
+
[puts "you're doomed."]
|
61
|
+
]
|
62
|
+
|
63
|
+
[= square
|
64
|
+
[lambda [x]
|
65
|
+
[* x x]
|
66
|
+
]
|
67
|
+
]
|
68
|
+
|
69
|
+
[puts
|
70
|
+
[.to_s.blue [square.call 2]]]
|
71
|
+
|
72
|
+
[def [argumented x=2]
|
73
|
+
[puts x]
|
74
|
+
]
|
75
|
+
|
76
|
+
[argumented]
|
77
|
+
|
78
|
+
|
79
|
+
[cond
|
80
|
+
[< 1 0] [puts "1 < 0"]
|
81
|
+
[> 3 4] [puts "3 > 4"]
|
82
|
+
[<= 1 0] [puts "1 <= 0"]
|
83
|
+
[>= 1 0] [puts "1 >= 0"]
|
84
|
+
true [puts "as always"]
|
85
|
+
]
|
86
|
+
|
87
|
+
\* By then, LRB compile down into Ruby:
|
88
|
+
|
89
|
+
require "colorize"
|
90
|
+
|
91
|
+
def square x
|
92
|
+
x * x
|
93
|
+
end
|
94
|
+
|
95
|
+
def factorial acc, n
|
96
|
+
if n < 1
|
97
|
+
acc
|
98
|
+
else
|
99
|
+
factorial acc * n, n - 1
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
puts square 10
|
104
|
+
|
105
|
+
puts factorial 1, 10
|
106
|
+
|
107
|
+
def single_exp
|
108
|
+
puts "only block !"
|
109
|
+
end
|
110
|
+
|
111
|
+
def multiple_exps
|
112
|
+
puts "1st statement"
|
113
|
+
puts "2nd statement"
|
114
|
+
end
|
115
|
+
|
116
|
+
single_exp
|
117
|
+
|
118
|
+
multiple_exps
|
119
|
+
|
120
|
+
puts 1 == 1
|
121
|
+
|
122
|
+
name = :Trung.to_s
|
123
|
+
|
124
|
+
puts name
|
125
|
+
|
126
|
+
puts "Hello " + name + " !"
|
127
|
+
|
128
|
+
lst = [1, 2, 3]
|
129
|
+
|
130
|
+
lst = Array.new
|
131
|
+
|
132
|
+
lst << 4
|
133
|
+
|
134
|
+
puts lst.to_s.blue
|
135
|
+
|
136
|
+
puts ("Heell" + "o").to_s.blue
|
137
|
+
|
138
|
+
([1, 2, 3]).map do |n|
|
139
|
+
puts n
|
140
|
+
end
|
141
|
+
|
142
|
+
unless 1 < 0
|
143
|
+
puts "one is not lesser than zero"
|
144
|
+
else
|
145
|
+
puts "you're doomed."
|
146
|
+
end
|
147
|
+
|
148
|
+
square = lambda {|x|
|
149
|
+
x * x
|
150
|
+
}
|
151
|
+
|
152
|
+
puts (square.call 2).to_s.blue
|
153
|
+
|
154
|
+
def argumented x=2
|
155
|
+
puts x
|
156
|
+
end
|
157
|
+
|
158
|
+
argumented
|
159
|
+
|
160
|
+
if 1 < 0
|
161
|
+
puts "1 < 0"
|
162
|
+
elsif 3 > 4
|
163
|
+
puts "3 > 4"
|
164
|
+
elsif 1 <= 0
|
165
|
+
puts "1 <= 0"
|
166
|
+
elsif 1 >= 0
|
167
|
+
puts "1 >= 0"
|
168
|
+
elsif true
|
169
|
+
puts "as always"
|
170
|
+
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
|
+
|
185
|
+
|
186
|
+
\* And evaluate everything:
|
187
|
+
|
188
|
+
[evaluated]:
|
189
|
+
100
|
190
|
+
3628800
|
191
|
+
only block !
|
192
|
+
1st statement
|
193
|
+
2nd statement
|
194
|
+
true
|
195
|
+
Trung
|
196
|
+
Hello Trung !
|
197
|
+
[4]
|
198
|
+
Heello
|
199
|
+
1
|
200
|
+
2
|
201
|
+
3
|
202
|
+
|
203
|
+
|
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
|
+
Currently, it's only experiment toy,
|
211
|
+
not yet support `repl` or `macros`.
|
212
|
+
|
213
|
+
Have fun !
|
data/lib/lrb.rb
CHANGED
@@ -51,10 +51,14 @@ class Lrb
|
|
51
51
|
puts "args: #{args}".yellow
|
52
52
|
puts line
|
53
53
|
end
|
54
|
-
|
54
|
+
|
55
55
|
if KEYWORD.include? fun
|
56
56
|
result = self.instance_exec *args, &KEYWORD[fun]
|
57
|
+
elsif class_method? fun
|
58
|
+
puts "[ERROR] dot operator only take 1 arg.".red if args.length > 1
|
59
|
+
result = class_method_append fun, args.first
|
57
60
|
else
|
61
|
+
# function call
|
58
62
|
result = compose_function fun, args
|
59
63
|
end
|
60
64
|
|
@@ -62,7 +66,6 @@ class Lrb
|
|
62
66
|
puts result.light_green
|
63
67
|
puts line
|
64
68
|
end
|
65
|
-
|
66
69
|
indent + result
|
67
70
|
else
|
68
71
|
puts "#{sexp}".yellow if @debug
|
@@ -71,6 +74,14 @@ class Lrb
|
|
71
74
|
end
|
72
75
|
|
73
76
|
private
|
77
|
+
def class_method? function
|
78
|
+
function[0] == "."
|
79
|
+
end
|
80
|
+
|
81
|
+
def class_method_append fun, args
|
82
|
+
"(#{transform args})#{fun}"
|
83
|
+
end
|
84
|
+
|
74
85
|
def wrap_string args
|
75
86
|
args.map do |arg|
|
76
87
|
if arg.class == String
|
@@ -116,6 +127,35 @@ class Lrb
|
|
116
127
|
args.join " #{op.to_s} "
|
117
128
|
end
|
118
129
|
|
130
|
+
def transform_body block
|
131
|
+
if block.first.class == Array
|
132
|
+
block.map{|body| transform body}.join "\n "
|
133
|
+
else
|
134
|
+
transform block
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def conditional_block keyword, cond, true_block, false_block
|
139
|
+
op = cond.first
|
140
|
+
cond = cond.drop(1).join " #{op} "
|
141
|
+
true_block = transform true_block
|
142
|
+
false_block = transform false_block
|
143
|
+
["#{keyword} #{cond}",
|
144
|
+
" #{true_block}",
|
145
|
+
" else",
|
146
|
+
" #{false_block}",
|
147
|
+
" end"
|
148
|
+
].join("\n")
|
149
|
+
end
|
150
|
+
|
151
|
+
def single_block keyword, block
|
152
|
+
block = transform_body block
|
153
|
+
["#{keyword}",
|
154
|
+
" #{block}",
|
155
|
+
"end"
|
156
|
+
].join("\n")
|
157
|
+
end
|
158
|
+
|
119
159
|
KEYWORD = {
|
120
160
|
:* => lambda {|*args| operator :*, args},
|
121
161
|
:/ => lambda {|*args| operator :/, args},
|
@@ -123,30 +163,79 @@ class Lrb
|
|
123
163
|
:+ => lambda {|*args| operator :+, args},
|
124
164
|
:<< => lambda {|*args| operator :<<, args},
|
125
165
|
:'^' => lambda {|*args| operator :'^', args},
|
126
|
-
:'
|
127
|
-
|
166
|
+
:'<' => lambda {|*args| operator :'<', args},
|
167
|
+
:'>' => lambda {|*args| operator :'>', args},
|
168
|
+
:'<=' => lambda {|*args| operator :'<=', args},
|
169
|
+
:'>=' => lambda {|*args| operator :'>=', args},
|
170
|
+
|
171
|
+
:'=' => lambda {|left, right| "#{left} = #{transform right}"},
|
172
|
+
:== => lambda {|left, right| "#{transform left} == #{transform right}"},
|
173
|
+
|
128
174
|
|
175
|
+
:list => lambda {|*args|
|
176
|
+
"[#{args.join ', '}]"
|
177
|
+
},
|
178
|
+
:lambda => lambda {|args, body|
|
179
|
+
args = args.join ", "
|
180
|
+
body = transform_body body
|
181
|
+
["lambda {|#{args}|",
|
182
|
+
" #{body}",
|
183
|
+
"}"
|
184
|
+
].join("\n")
|
185
|
+
},
|
186
|
+
:begin => lambda {|do_block, rescue_block|
|
187
|
+
["begin",
|
188
|
+
" #{do_block}",
|
189
|
+
"rescue Exception => e",
|
190
|
+
" #{rescue_block}",
|
191
|
+
"end"
|
192
|
+
].join("\n")
|
193
|
+
},
|
194
|
+
:do => lambda {|fun, args, bodies|
|
195
|
+
fun = transform fun
|
196
|
+
args = args.join ", "
|
197
|
+
bodies = transform_body bodies
|
198
|
+
["#{fun} do |#{args}|",
|
199
|
+
" #{bodies}",
|
200
|
+
"end"
|
201
|
+
].join("\n")
|
202
|
+
},
|
129
203
|
:def => lambda {|args, body|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
204
|
+
name = args.first
|
205
|
+
args = args.drop(1).join ", "
|
206
|
+
body = transform_body body
|
207
|
+
["def #{name} #{args}",
|
208
|
+
" #{body}",
|
209
|
+
"end"
|
210
|
+
].join("\n")
|
211
|
+
},
|
139
212
|
:if => lambda {|cond, true_block, false_block|
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
213
|
+
conditional_block :if, cond, true_block, false_block
|
214
|
+
},
|
215
|
+
:unless => lambda {|cond, true_block, false_block|
|
216
|
+
conditional_block :unless, cond, true_block, false_block
|
217
|
+
},
|
218
|
+
:cond => lambda {|*conds|
|
219
|
+
conds = conds.map{|cond|
|
220
|
+
transform cond
|
221
|
+
}.each_slice(2).to_a
|
222
|
+
cond_first = conds.first
|
223
|
+
cond_body = conds.drop(1).map do |pair|
|
224
|
+
["elsif #{pair.first}",
|
225
|
+
" #{pair.last}"
|
226
|
+
].join "\n"
|
227
|
+
end
|
228
|
+
["if #{cond_first.first}",
|
229
|
+
" #{cond_first.last}",
|
230
|
+
cond_body,
|
231
|
+
"end"
|
232
|
+
].join "\n"
|
233
|
+
}
|
151
234
|
}
|
152
|
-
end
|
235
|
+
end
|
236
|
+
# @test = Lrb.new
|
237
|
+
# #@test.debug = true
|
238
|
+
# x = @test.to_ruby <<-REC
|
239
|
+
# REC
|
240
|
+
# puts x.blue
|
241
|
+
# eval x
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
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.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- The Trung
|
@@ -14,56 +14,56 @@ dependencies:
|
|
14
14
|
name: pry
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: oyster
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bracer
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: colorize
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
description: It transform Ruby to a Lisp with braces. Compile and run as ruby code.
|
@@ -71,8 +71,10 @@ email: deulamco@gmail.com
|
|
71
71
|
executables:
|
72
72
|
- lrb
|
73
73
|
extensions: []
|
74
|
-
extra_rdoc_files:
|
74
|
+
extra_rdoc_files:
|
75
|
+
- README.md
|
75
76
|
files:
|
77
|
+
- README.md
|
76
78
|
- bin/lrb
|
77
79
|
- lib/lrb.rb
|
78
80
|
homepage: http://github.com/thetrung/lrb.git
|
@@ -80,7 +82,9 @@ licenses:
|
|
80
82
|
- MIT
|
81
83
|
metadata: {}
|
82
84
|
post_install_message:
|
83
|
-
rdoc_options:
|
85
|
+
rdoc_options:
|
86
|
+
- "--main"
|
87
|
+
- README.md
|
84
88
|
require_paths:
|
85
89
|
- lib
|
86
90
|
required_ruby_version: !ruby/object:Gem::Requirement
|