lrb 0.0.0
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 +7 -0
- data/bin/lrb +31 -0
- data/lib/lrb.rb +152 -0
- metadata +103 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 95d432598099b498249adf215c114d4085422337
|
4
|
+
data.tar.gz: 8aae9bc76ed5963a18888b5947bf3be576cabda0
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e7db38a8dfd2c6bd6fbd6bfb5ff7992a83e57be50b4571a46f4ce28b62d02b34d368cd2273e7c3dbc73b03bf08ece40879d6c22819d884512e85c196802af7dd
|
7
|
+
data.tar.gz: 9431a51e1921c0818aac68340cf90874e09a4405e18033489d8d682df16610dae2155d048b69b871e1b66c0808fb8b3070ca06606112f0f9543118c23915e7a5
|
data/bin/lrb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
dir = File.expand_path(File.dirname(__FILE__))
|
3
|
+
require dir + '/../lib/lrb.rb'
|
4
|
+
|
5
|
+
require 'oyster'
|
6
|
+
spec = Oyster.spec do
|
7
|
+
name "lrb -- Lisp to ruby transformation"#, v. #{Heist::VERSION}"
|
8
|
+
author 'The Trung <deulamco@mail.com>'
|
9
|
+
|
10
|
+
synopsis <<-EOS
|
11
|
+
lrb -i [OPTIONS]
|
12
|
+
lrb FILE_NAME [OPTIONS]
|
13
|
+
EOS
|
14
|
+
|
15
|
+
flag :interactive, :desc =>
|
16
|
+
'Start an interactive Scheme session'
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
begin
|
21
|
+
options = spec.parse
|
22
|
+
|
23
|
+
if options[:interactive] or options[:unclaimed].empty?
|
24
|
+
puts "Not implemented yet"
|
25
|
+
else
|
26
|
+
lrb = Lrb.new
|
27
|
+
lrb.eval_file File.expand_path(options[:unclaimed].first)
|
28
|
+
end
|
29
|
+
|
30
|
+
rescue Oyster::HelpRendered
|
31
|
+
end
|
data/lib/lrb.rb
ADDED
@@ -0,0 +1,152 @@
|
|
1
|
+
require "colorize"
|
2
|
+
require "bracer"
|
3
|
+
require "pry"
|
4
|
+
|
5
|
+
class Lrb
|
6
|
+
attr_accessor :parser, :debug
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@debug = false
|
10
|
+
@indent = 0
|
11
|
+
@stack = Array.new
|
12
|
+
@parser = Bracer.new
|
13
|
+
@parser.ruby_keyword_literals = true
|
14
|
+
end
|
15
|
+
|
16
|
+
def parse source
|
17
|
+
@parser.parse_string source
|
18
|
+
end
|
19
|
+
|
20
|
+
def eval_file path
|
21
|
+
source = File.read path
|
22
|
+
puts "[LRB]:".light_yellow
|
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
|
30
|
+
end
|
31
|
+
|
32
|
+
def to_ruby source
|
33
|
+
ast = parse source
|
34
|
+
puts "parsed: #{ast}".green if @debug
|
35
|
+
ast = ast.map do |sexp|
|
36
|
+
result = transform sexp
|
37
|
+
puts result if @debug
|
38
|
+
result
|
39
|
+
end
|
40
|
+
ast.join "\n\n"
|
41
|
+
end
|
42
|
+
|
43
|
+
def transform sexp
|
44
|
+
puts line if @debug
|
45
|
+
if sexp.class == Array
|
46
|
+
fun = sexp.first
|
47
|
+
args = wrap_string sexp.drop(1)
|
48
|
+
result = ""
|
49
|
+
if @debug
|
50
|
+
puts "function: #{fun}".yellow
|
51
|
+
puts "args: #{args}".yellow
|
52
|
+
puts line
|
53
|
+
end
|
54
|
+
|
55
|
+
if KEYWORD.include? fun
|
56
|
+
result = self.instance_exec *args, &KEYWORD[fun]
|
57
|
+
else
|
58
|
+
result = compose_function fun, args
|
59
|
+
end
|
60
|
+
|
61
|
+
if @debug
|
62
|
+
puts result.light_green
|
63
|
+
puts line
|
64
|
+
end
|
65
|
+
|
66
|
+
indent + result
|
67
|
+
else
|
68
|
+
puts "#{sexp}".yellow if @debug
|
69
|
+
sexp.to_s
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
def wrap_string args
|
75
|
+
args.map do |arg|
|
76
|
+
if arg.class == String
|
77
|
+
"\"#{arg}\""
|
78
|
+
else
|
79
|
+
arg
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def transform_exp exps
|
85
|
+
exps.map do |arg|
|
86
|
+
unless arg.class == String
|
87
|
+
transform arg
|
88
|
+
else
|
89
|
+
arg
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def compose_function fun, args
|
95
|
+
args = transform_exp args
|
96
|
+
"#{fun} #{args.join ', '}"
|
97
|
+
end
|
98
|
+
|
99
|
+
def indent
|
100
|
+
" " * @indent
|
101
|
+
end
|
102
|
+
|
103
|
+
def line
|
104
|
+
"-" * 80
|
105
|
+
end
|
106
|
+
|
107
|
+
def push node
|
108
|
+
@stack.push node
|
109
|
+
end
|
110
|
+
|
111
|
+
def fetch
|
112
|
+
@stack.pop unless @stack.empty?
|
113
|
+
end
|
114
|
+
|
115
|
+
def operator op, args
|
116
|
+
args.join " #{op.to_s} "
|
117
|
+
end
|
118
|
+
|
119
|
+
KEYWORD = {
|
120
|
+
:* => lambda {|*args| operator :*, args},
|
121
|
+
:/ => lambda {|*args| operator :/, args},
|
122
|
+
:- => lambda {|*args| operator :-, args},
|
123
|
+
:+ => lambda {|*args| operator :+, args},
|
124
|
+
:<< => lambda {|*args| operator :<<, args},
|
125
|
+
:'^' => lambda {|*args| operator :'^', args},
|
126
|
+
:'=' => lambda {|left, right| "#{left} = #{right}"},
|
127
|
+
:== => lambda {|left, right| "#{left} == #{right}"},
|
128
|
+
|
129
|
+
: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
|
+
|
139
|
+
: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
|
+
}
|
151
|
+
}
|
152
|
+
end
|
metadata
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: lrb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- The Trung
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-05-24 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: pry
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: oyster
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bracer
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: colorize
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: It transform Ruby to a Lisp with braces. Compile and run as ruby code.
|
70
|
+
email: deulamco@gmail.com
|
71
|
+
executables:
|
72
|
+
- lrb
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- bin/lrb
|
77
|
+
- lib/lrb.rb
|
78
|
+
homepage: http://github.com/thetrung/lrb.git
|
79
|
+
licenses:
|
80
|
+
- MIT
|
81
|
+
metadata: {}
|
82
|
+
post_install_message:
|
83
|
+
rdoc_options: []
|
84
|
+
require_paths:
|
85
|
+
- lib
|
86
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
requirements: []
|
97
|
+
rubyforge_project:
|
98
|
+
rubygems_version: 2.4.5
|
99
|
+
signing_key:
|
100
|
+
specification_version: 4
|
101
|
+
summary: Ruby language in form of Lisp with braces
|
102
|
+
test_files: []
|
103
|
+
has_rdoc:
|