rouge-lang 0.0.5 → 0.0.6
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.
- data/bin/rouge +59 -2
- data/lib/rouge/repl.rb +17 -25
- data/lib/rouge/seq.rb +23 -1
- data/lib/rouge/version.rb +1 -1
- data/lib/rouge.rb +4 -4
- metadata +1 -1
data/bin/rouge
CHANGED
@@ -1,6 +1,63 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# The Rouge REPL/interpreter.
|
3
|
-
|
4
3
|
$: << "#{File.dirname(__FILE__)}/../lib"
|
5
4
|
require 'rouge'
|
6
|
-
|
5
|
+
require 'optparse'
|
6
|
+
|
7
|
+
options = {:backtrace => true}
|
8
|
+
|
9
|
+
option_parser = OptionParser.new do |opts|
|
10
|
+
opts.banner = "rouge [switch] [filename]"
|
11
|
+
|
12
|
+
opts.on('-v', '--version', 'Print version number') do
|
13
|
+
puts "Rouge #{Rouge::VERSION}"
|
14
|
+
end
|
15
|
+
|
16
|
+
opts.on('-e STR', '--eval STR', 'Evaluate the contents of STR') do |str|
|
17
|
+
Rouge.boot!
|
18
|
+
Rouge::Context.new(Rouge[:user]).readeval(str)
|
19
|
+
exit 0
|
20
|
+
end
|
21
|
+
|
22
|
+
opts.on('--time-startup', 'Report boot up time') do
|
23
|
+
Rouge.boot!
|
24
|
+
puts Time.now - Rouge.start
|
25
|
+
exit 0
|
26
|
+
end
|
27
|
+
|
28
|
+
opts.on('--[no-]backtrace', 'Enable/disable backtracing in REPL') do |bool|
|
29
|
+
options[:backtrace] = bool
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
begin
|
34
|
+
option_parser.parse!
|
35
|
+
rescue OptionParser::MissingArgument => e
|
36
|
+
puts "rouge: #{e}"
|
37
|
+
end
|
38
|
+
|
39
|
+
if ARGV.length == 1
|
40
|
+
file = ARGV[0]
|
41
|
+
|
42
|
+
if File.file?(file)
|
43
|
+
code = File.read(file)
|
44
|
+
else
|
45
|
+
STDERR.puts "rouge: No such file -- #{file}"
|
46
|
+
exit 1
|
47
|
+
end
|
48
|
+
|
49
|
+
# Permit shebangs at the top of the document.
|
50
|
+
if code[0..1] == "#!"
|
51
|
+
code = code[code.index("\n") + 1..-1]
|
52
|
+
end
|
53
|
+
|
54
|
+
Rouge.boot!
|
55
|
+
Rouge::Context.new(Rouge[:user]).readeval(code)
|
56
|
+
|
57
|
+
exit 0
|
58
|
+
elsif ARGV.length > 1
|
59
|
+
STDERR.puts option_parser.help
|
60
|
+
exit 1
|
61
|
+
end
|
62
|
+
|
63
|
+
Rouge.repl(options)
|
data/lib/rouge/repl.rb
CHANGED
@@ -1,35 +1,23 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require 'readline'
|
3
3
|
|
4
|
-
module Rouge::REPL
|
4
|
+
module Rouge::REPL
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
STDOUT.puts "!! #{e.class}: #{e.message}"
|
9
|
-
STDOUT.puts "#{e.backtrace.join "\n"}"
|
10
|
-
end
|
11
|
-
|
12
|
-
def repl(argv)
|
13
|
-
context = Rouge::Context.new Rouge[:user]
|
6
|
+
def self.run!(options = {:backtrace => true})
|
7
|
+
puts "Rouge #{Rouge::VERSION}"
|
14
8
|
|
15
|
-
|
16
|
-
STDOUT.puts
|
17
|
-
exit(0)
|
18
|
-
elsif argv.length == 1
|
19
|
-
f = File.read(argv[0])
|
20
|
-
if f[0] == ?#
|
21
|
-
f = f[f.index("\n") + 1..-1]
|
22
|
-
end
|
9
|
+
repl_error = lambda do |e|
|
10
|
+
STDOUT.puts "!! #{e.class}: #{e.message}"
|
23
11
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
STDERR.puts "!! usage: #$0 [FILE]"
|
28
|
-
exit(1)
|
12
|
+
if options[:backtrace]
|
13
|
+
STDOUT.puts "#{e.backtrace.join "\n"}"
|
14
|
+
end
|
29
15
|
end
|
30
16
|
|
17
|
+
context = Rouge::Context.new(Rouge[:user])
|
31
18
|
count = 0
|
32
19
|
chaining = false
|
20
|
+
|
33
21
|
while true
|
34
22
|
if not chaining
|
35
23
|
prompt = "#{context.ns.name}=> "
|
@@ -50,15 +38,18 @@ class << Rouge::REPL
|
|
50
38
|
chaining = true
|
51
39
|
next
|
52
40
|
rescue Rouge::Reader::UnexpectedCharacterError => reader_err
|
53
|
-
repl_error reader_err
|
41
|
+
repl_error.call reader_err
|
54
42
|
end
|
55
43
|
|
56
44
|
chaining = false
|
45
|
+
|
57
46
|
begin
|
58
47
|
form = Rouge::Compiler.compile(
|
59
48
|
context.ns,
|
60
49
|
Set[*context.lexical_keys],
|
61
|
-
form
|
50
|
+
form
|
51
|
+
)
|
52
|
+
|
62
53
|
result = context.eval(form)
|
63
54
|
|
64
55
|
Rouge.print(result, STDOUT)
|
@@ -73,10 +64,11 @@ class << Rouge::REPL
|
|
73
64
|
context = cce.context
|
74
65
|
count = 0
|
75
66
|
rescue => e
|
76
|
-
repl_error e
|
67
|
+
repl_error.call e
|
77
68
|
end
|
78
69
|
end
|
79
70
|
end
|
71
|
+
|
80
72
|
end
|
81
73
|
|
82
74
|
# vim: set sw=2 et cc=80:
|
data/lib/rouge/seq.rb
CHANGED
@@ -64,7 +64,9 @@ module Rouge::Seq
|
|
64
64
|
len
|
65
65
|
end
|
66
66
|
|
67
|
-
|
67
|
+
def count
|
68
|
+
length
|
69
|
+
end
|
68
70
|
|
69
71
|
def [](idx)
|
70
72
|
return to_a[idx] if idx.is_a? Range
|
@@ -187,6 +189,26 @@ module Rouge::Seq
|
|
187
189
|
Array.new(@array, @idx + 1)
|
188
190
|
end
|
189
191
|
end
|
192
|
+
|
193
|
+
def length
|
194
|
+
@array.length - @idx
|
195
|
+
end
|
196
|
+
|
197
|
+
def [](idx)
|
198
|
+
@array[@idx + idx]
|
199
|
+
end
|
200
|
+
|
201
|
+
def to_a
|
202
|
+
@array[@idx..-1]
|
203
|
+
end
|
204
|
+
|
205
|
+
def each(&block)
|
206
|
+
to_a.each(&block)
|
207
|
+
end
|
208
|
+
|
209
|
+
def map(&block)
|
210
|
+
to_a.map(&block)
|
211
|
+
end
|
190
212
|
end
|
191
213
|
|
192
214
|
# A lazy seq; contains the body (thunk) which is a lambda to get the "real"
|
data/lib/rouge/version.rb
CHANGED
data/lib/rouge.rb
CHANGED
@@ -41,13 +41,13 @@ module Rouge
|
|
41
41
|
user.refer core
|
42
42
|
user.refer Rouge[:ruby]
|
43
43
|
|
44
|
-
Rouge
|
45
|
-
|
44
|
+
boot_rg = File.read(Rouge.relative_to_lib('boot.rg'))
|
45
|
+
Rouge::Context.new(user).readeval(boot_rg)
|
46
46
|
end
|
47
47
|
|
48
|
-
def self.repl(
|
48
|
+
def self.repl(options = {})
|
49
49
|
boot!
|
50
|
-
Rouge::REPL.
|
50
|
+
Rouge::REPL.run!(options)
|
51
51
|
end
|
52
52
|
|
53
53
|
def self.relative_to_lib name
|