lrb 0.0.0

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 +7 -0
  2. data/bin/lrb +31 -0
  3. data/lib/lrb.rb +152 -0
  4. 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: