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.
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