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