lrb 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +213 -0
  3. data/lib/lrb.rb +114 -25
  4. metadata +15 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 95d432598099b498249adf215c114d4085422337
4
- data.tar.gz: 8aae9bc76ed5963a18888b5947bf3be576cabda0
3
+ metadata.gz: f1cd3e16d04456b052cdabcd6ad3fd3509d5f4bd
4
+ data.tar.gz: 7db9624b48b357c1bb23fe4b280018c70945d73f
5
5
  SHA512:
6
- metadata.gz: e7db38a8dfd2c6bd6fbd6bfb5ff7992a83e57be50b4571a46f4ce28b62d02b34d368cd2273e7c3dbc73b03bf08ece40879d6c22819d884512e85c196802af7dd
7
- data.tar.gz: 9431a51e1921c0818aac68340cf90874e09a4405e18033489d8d682df16610dae2155d048b69b871e1b66c0808fb8b3070ca06606112f0f9543118c23915e7a5
6
+ metadata.gz: f9f53921407081952ac231180a3728a38ac2a612557e6d3a70ff8ce4948a5fbb44dcee6572cbf5110d6cf2184a6447f64df3f61744fd0f121f98fe284b5f0707
7
+ data.tar.gz: 5b068a2f5f1b8dfd166e12fae9dbca72ca2cd46b0976eaa90745fa7869b630f1a31c09fedabafa387200206ef3eedaf134f712863824918f7a36f31d459c3d86
@@ -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
- :'=' => lambda {|left, right| "#{left} = #{right}"},
127
- :== => lambda {|left, right| "#{left} == #{right}"},
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
- name = args.first
131
- args = args.drop(1).join ", "
132
- body = transform body
133
- ["def #{name} #{args}",
134
- " #{body}",
135
- "end"
136
- ].join("\n")
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
- op = cond.first
141
- cond = cond.drop(1).join " #{op} "
142
- true_block = transform true_block
143
- false_block = transform false_block
144
- ["if #{cond}",
145
- " #{true_block}",
146
- " else",
147
- " #{false_block}",
148
- " end"
149
- ].join("\n")
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.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