rouge-lang 0.0.9 → 0.0.10
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/lib/rouge/printer.rb +28 -61
- data/lib/rouge/seq.rb +42 -25
- data/lib/rouge/symbol.rb +7 -5
- data/lib/rouge/var.rb +23 -17
- data/lib/rouge/version.rb +1 -1
- data/lib/rouge/wrappers.rb +8 -4
- data/spec/printer_spec.rb +3 -1
- data/spec/seq_spec.rb +6 -6
- data/spec/symbol_spec.rb +5 -0
- metadata +4 -4
data/lib/rouge/printer.rb
CHANGED
@@ -6,82 +6,49 @@ module Rouge::Printer
|
|
6
6
|
|
7
7
|
def self.print(form, out)
|
8
8
|
case form
|
9
|
-
when
|
9
|
+
when Numeric
|
10
|
+
# Handles Integer, Float, Rational, and Complex instances.
|
10
11
|
out << form.to_s
|
11
|
-
when Rational
|
12
|
-
out << "#{form.numerator}/#{form.denominator}"
|
13
|
-
when Rouge::Symbol
|
14
|
-
if form.ns_s
|
15
|
-
out << form.ns_s
|
16
|
-
out << "/"
|
17
|
-
end
|
18
|
-
out << form.name_s
|
19
|
-
when Symbol
|
20
|
-
out << form.inspect
|
21
|
-
when String
|
22
|
-
out << form.inspect
|
23
12
|
when Array
|
24
|
-
out << "["
|
25
|
-
form.each.with_index do |e, i|
|
26
|
-
out << " " unless i.zero?
|
27
|
-
print(e, out)
|
28
|
-
end
|
29
|
-
out << "]"
|
30
|
-
when Rouge::Seq::Empty
|
31
|
-
out << "()"
|
32
|
-
when Rouge::Seq::Cons
|
33
|
-
if form.length == 2 and form[0] == Rouge::Symbol[:quote]
|
34
|
-
out << "'"
|
35
|
-
print(form[1], out)
|
36
|
-
elsif form.length == 2 and form[0] == Rouge::Symbol[:var]
|
37
|
-
out << "#'"
|
38
|
-
print(form[1], out)
|
39
|
-
else
|
40
|
-
out << "("
|
41
|
-
form.each.with_index do |e, i|
|
42
|
-
out << " " unless i.zero?
|
43
|
-
print(e, out)
|
44
|
-
end
|
45
|
-
out << ")"
|
46
|
-
end
|
47
|
-
when Rouge::Var
|
48
|
-
out << "#'#{form.ns}/#{form.name}"
|
13
|
+
out << "[#{print_collection(form)}]"
|
49
14
|
when Hash
|
50
|
-
out << "{"
|
51
|
-
form.each.with_index do |kv,i|
|
52
|
-
out << ", " unless i.zero?
|
53
|
-
print(kv[0], out)
|
54
|
-
out << " "
|
55
|
-
print(kv[1], out)
|
56
|
-
end
|
57
|
-
out << "}"
|
15
|
+
out << "{#{print_collection(form)}}"
|
58
16
|
when Set
|
59
|
-
out << "\#{"
|
60
|
-
|
61
|
-
|
62
|
-
|
17
|
+
out << "\#{#{print_collection(form)}}"
|
18
|
+
when Regexp
|
19
|
+
out << "#\"#{form.source}\""
|
20
|
+
when Symbol
|
21
|
+
# Symbols containing white space are printed with the results of #inspect,
|
22
|
+
# otherwise they are printed with the results #to_s. This maintains an
|
23
|
+
# experience consistent with Clojure whenever possible while providing
|
24
|
+
# clarity in cases where Symbols contain white space, although this is
|
25
|
+
# typically uncommon.
|
26
|
+
if /\s/.match(form)
|
27
|
+
out << form.inspect
|
28
|
+
else
|
29
|
+
out << ":#{form}"
|
63
30
|
end
|
64
|
-
|
65
|
-
|
66
|
-
out << "nil"
|
67
|
-
when TrueClass
|
68
|
-
out << "true"
|
69
|
-
when FalseClass
|
70
|
-
out << "false"
|
31
|
+
when Rouge::Builtin, Rouge::Symbol, Rouge::Var, Rouge::Seq::Empty, Rouge::Seq::Cons
|
32
|
+
out << form.to_s
|
71
33
|
when Class, Module
|
72
34
|
if form.name
|
73
35
|
out << "ruby/#{form.name.split('::').join('.')}"
|
74
36
|
else
|
75
37
|
out << form.inspect
|
76
38
|
end
|
77
|
-
when Rouge::Builtin
|
78
|
-
out << "rouge.builtin/#{form.inner.name}"
|
79
|
-
when Regexp
|
80
|
-
out << "#\"#{form.source}\""
|
81
39
|
else
|
82
40
|
out << form.inspect
|
83
41
|
end
|
84
42
|
end
|
43
|
+
|
44
|
+
# Prints a collection of elements using `print`.
|
45
|
+
def self.print_collection(collection)
|
46
|
+
if collection.is_a? Hash
|
47
|
+
collection.to_a.map {|pair| print_collection(pair) }.join(', ')
|
48
|
+
else
|
49
|
+
collection.map {|el| print(el, '') }.join(' ')
|
50
|
+
end
|
51
|
+
end
|
85
52
|
end
|
86
53
|
|
87
54
|
# vim: set sw=2 et cc=80:
|
data/lib/rouge/seq.rb
CHANGED
@@ -16,7 +16,6 @@ module Rouge::Seq
|
|
16
16
|
# A partial implementation of ISeq. You supply #first and #next, it gives:
|
17
17
|
#
|
18
18
|
# - #cons
|
19
|
-
# - #inspect
|
20
19
|
# - #to_s
|
21
20
|
# - #seq
|
22
21
|
# - #length (#count)
|
@@ -28,13 +27,13 @@ module Rouge::Seq
|
|
28
27
|
module ASeq
|
29
28
|
include ISeq
|
30
29
|
|
31
|
-
def
|
32
|
-
"(#{to_a.map(&:
|
30
|
+
def to_s
|
31
|
+
"(#{to_a.map(&:to_s).join " "})"
|
33
32
|
end
|
34
33
|
|
35
|
-
def
|
36
|
-
|
37
|
-
|
34
|
+
def seq
|
35
|
+
self
|
36
|
+
end
|
38
37
|
|
39
38
|
def first; raise NotImplementedError; end
|
40
39
|
def next; raise NotImplementedError; end
|
@@ -84,13 +83,13 @@ module Rouge::Seq
|
|
84
83
|
cursor.first
|
85
84
|
end
|
86
85
|
|
87
|
-
def ==(
|
88
|
-
if
|
89
|
-
return self.to_a ==
|
86
|
+
def ==(other)
|
87
|
+
if other.is_a?(ISeq)
|
88
|
+
return self.to_a == other.to_a
|
90
89
|
end
|
91
90
|
|
92
|
-
if
|
93
|
-
return self.to_a ==
|
91
|
+
if other.is_a?(::Array)
|
92
|
+
return self.to_a == other
|
94
93
|
end
|
95
94
|
|
96
95
|
false
|
@@ -128,8 +127,9 @@ module Rouge::Seq
|
|
128
127
|
class << Empty
|
129
128
|
include ASeq
|
130
129
|
|
131
|
-
def
|
132
|
-
|
130
|
+
def to_s
|
131
|
+
'()'
|
132
|
+
end
|
133
133
|
|
134
134
|
def seq; nil; end
|
135
135
|
def first; nil; end
|
@@ -145,8 +145,10 @@ module Rouge::Seq
|
|
145
145
|
class Cons
|
146
146
|
include ASeq
|
147
147
|
|
148
|
+
attr_reader :head, :tail
|
149
|
+
|
148
150
|
def initialize(head, tail)
|
149
|
-
if tail
|
151
|
+
if tail && !tail.is_a?(ISeq)
|
150
152
|
raise ArgumentError,
|
151
153
|
"tail should be an ISeq, not #{tail.inspect} (#{tail.class})"
|
152
154
|
end
|
@@ -154,11 +156,27 @@ module Rouge::Seq
|
|
154
156
|
@head, @tail = head, tail
|
155
157
|
end
|
156
158
|
|
157
|
-
def first
|
158
|
-
|
159
|
+
def first
|
160
|
+
@head
|
161
|
+
end
|
162
|
+
|
163
|
+
def next
|
164
|
+
Rouge::Seq.seq(@tail)
|
165
|
+
end
|
166
|
+
|
167
|
+
def to_s
|
168
|
+
if self.length == 2 && self[0] == Rouge::Symbol[:quote]
|
169
|
+
"'#{self[1]}"
|
170
|
+
elsif self.length == 2 && self[0] == Rouge::Symbol[:var]
|
171
|
+
"#'#{self[1]}"
|
172
|
+
else
|
173
|
+
"(#{Rouge::Printer.print_collection(self)})"
|
174
|
+
end
|
175
|
+
end
|
159
176
|
|
160
177
|
def self.[](*elements)
|
161
178
|
length = elements.length
|
179
|
+
|
162
180
|
return Empty if length.zero?
|
163
181
|
|
164
182
|
head = nil
|
@@ -168,8 +186,6 @@ module Rouge::Seq
|
|
168
186
|
|
169
187
|
head.freeze
|
170
188
|
end
|
171
|
-
|
172
|
-
attr_reader :head, :tail
|
173
189
|
end
|
174
190
|
|
175
191
|
# A seq over a Ruby Array.
|
@@ -240,8 +256,13 @@ module Rouge::Seq
|
|
240
256
|
seq.send(sym, *args, &block)
|
241
257
|
end
|
242
258
|
|
243
|
-
def inspect
|
244
|
-
|
259
|
+
def inspect
|
260
|
+
seq.inspect
|
261
|
+
end
|
262
|
+
|
263
|
+
def to_s
|
264
|
+
seq.to_s
|
265
|
+
end
|
245
266
|
end
|
246
267
|
|
247
268
|
# An error thrown when we try to do a seq operation on something that's not
|
@@ -260,14 +281,10 @@ module Rouge::Seq
|
|
260
281
|
else
|
261
282
|
Rouge::Seq::Array.new(form, 0)
|
262
283
|
end
|
263
|
-
when Enumerator
|
284
|
+
when Hash, Set, Enumerator
|
264
285
|
seq(form.to_a)
|
265
286
|
when String
|
266
287
|
seq(form.chars)
|
267
|
-
when Set
|
268
|
-
seq(form.to_a)
|
269
|
-
when Hash
|
270
|
-
seq(form.to_a)
|
271
288
|
else
|
272
289
|
raise UnknownSeqError, form.inspect
|
273
290
|
end
|
data/lib/rouge/symbol.rb
CHANGED
@@ -4,13 +4,15 @@ require 'rouge/metadata'
|
|
4
4
|
class Rouge::Symbol
|
5
5
|
include Rouge::Metadata
|
6
6
|
|
7
|
+
attr_reader :ns, :name, :ns_s, :name_s, :name_parts, :new_sym
|
8
|
+
|
7
9
|
# The symbols for t/f/n are the Ruby objects themselves.
|
8
10
|
LOOKUP = {
|
9
11
|
:true => true,
|
10
12
|
:false => false,
|
11
13
|
:nil => nil,
|
12
14
|
}
|
13
|
-
|
15
|
+
|
14
16
|
KNOWNS = {
|
15
17
|
:/ => [nil, :/],
|
16
18
|
:"./" => [nil, :"./"],
|
@@ -58,20 +60,20 @@ class Rouge::Symbol
|
|
58
60
|
end
|
59
61
|
|
60
62
|
def to_sym
|
61
|
-
:"#{
|
63
|
+
:"#{to_s}"
|
62
64
|
end
|
63
65
|
|
64
66
|
def inspect
|
65
67
|
"Rouge::Symbol[#{to_sym.inspect}]"
|
66
68
|
end
|
67
69
|
|
68
|
-
def to_s
|
70
|
+
def to_s
|
71
|
+
"#{@ns ? "#@ns/" : ""}#@name"
|
72
|
+
end
|
69
73
|
|
70
74
|
def ==(right)
|
71
75
|
right.is_a?(Rouge::Symbol) and right.ns == @ns and right.name == @name
|
72
76
|
end
|
73
|
-
|
74
|
-
attr_reader :ns, :name, :ns_s, :name_s, :name_parts, :new_sym
|
75
77
|
end
|
76
78
|
|
77
79
|
# vim: set sw=2 et cc=80:
|
data/lib/rouge/var.rb
CHANGED
@@ -1,29 +1,31 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
class Rouge::Var
|
4
|
+
attr_reader :ns, :name
|
5
|
+
|
4
6
|
@@stack = []
|
5
7
|
|
6
8
|
def initialize(ns, name, root=Rouge::Var::UnboundSentinel)
|
7
|
-
@ns = ns
|
8
|
-
@name = name
|
9
9
|
raise ArgumentError, "bad var ns" unless ns.is_a? Symbol
|
10
10
|
raise ArgumentError, "bad var name" unless name.is_a? Symbol
|
11
|
+
|
12
|
+
@ns = ns
|
13
|
+
@name = name
|
14
|
+
|
11
15
|
if root == Rouge::Var::UnboundSentinel
|
12
|
-
@root = Rouge::Var::Unbound.new
|
16
|
+
@root = Rouge::Var::Unbound.new(self)
|
13
17
|
else
|
14
18
|
@root = root
|
15
19
|
end
|
16
20
|
end
|
17
21
|
|
18
|
-
def ==(
|
19
|
-
|
22
|
+
def ==(other)
|
23
|
+
other.is_a?(Rouge::Var) && @ns == other.ns && @name == other.name
|
20
24
|
end
|
21
25
|
|
22
|
-
attr_reader :ns, :name
|
23
|
-
|
24
26
|
def deref
|
25
27
|
@@stack.reverse_each do |map|
|
26
|
-
if map.include?
|
28
|
+
if map.include?(@name)
|
27
29
|
return map[@name]
|
28
30
|
end
|
29
31
|
end
|
@@ -32,11 +34,11 @@ class Rouge::Var
|
|
32
34
|
end
|
33
35
|
|
34
36
|
def inspect
|
35
|
-
"Rouge::Var
|
37
|
+
"#<Rouge::Var: (#{@ns.inspect}, #{@name.inspect}, #{@root.inspect})>"
|
36
38
|
end
|
37
39
|
|
38
40
|
def to_s
|
39
|
-
|
41
|
+
"#'#@ns/#@name"
|
40
42
|
end
|
41
43
|
|
42
44
|
def self.push(map)
|
@@ -48,22 +50,26 @@ class Rouge::Var
|
|
48
50
|
end
|
49
51
|
end
|
50
52
|
|
51
|
-
Rouge::Var::UnboundSentinel
|
52
|
-
|
53
|
-
|
54
|
-
|
53
|
+
class Rouge::Var::UnboundSentinel
|
54
|
+
def self.inspect
|
55
|
+
"#<Rouge::Var::UnboundSentinel>"
|
56
|
+
end
|
55
57
|
end
|
56
58
|
|
57
59
|
class Rouge::Var::Unbound
|
60
|
+
attr_reader :var
|
61
|
+
|
58
62
|
def initialize(var)
|
59
63
|
@var = var
|
60
64
|
end
|
61
65
|
|
62
|
-
def ==(
|
63
|
-
@var ==
|
66
|
+
def ==(other)
|
67
|
+
@var == other.var
|
64
68
|
end
|
65
69
|
|
66
|
-
|
70
|
+
def inspect
|
71
|
+
"#<Rouge::Var::Unbound: #@var>"
|
72
|
+
end
|
67
73
|
end
|
68
74
|
|
69
75
|
# vim: set sw=2 et cc=80:
|
data/lib/rouge/version.rb
CHANGED
data/lib/rouge/wrappers.rb
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
[:Macro, :Builtin, :Dequote, :Splice].each do |name|
|
4
4
|
Rouge.const_set name, Class.new {
|
5
|
+
attr_reader :inner
|
6
|
+
|
5
7
|
def initialize(inner)
|
6
8
|
@inner = inner
|
7
9
|
end
|
@@ -14,14 +16,16 @@
|
|
14
16
|
"#{self.class.name}[#{@inner.inspect}]"
|
15
17
|
end
|
16
18
|
|
17
|
-
def to_s; inspect; end
|
18
|
-
|
19
19
|
def ==(right)
|
20
20
|
right.is_a?(self.class) and right.inner == @inner
|
21
21
|
end
|
22
|
-
|
23
|
-
attr_reader :inner
|
24
22
|
}
|
25
23
|
end
|
26
24
|
|
25
|
+
class Rouge::Builtin
|
26
|
+
def to_s
|
27
|
+
"rouge.builtin/#{inner.name}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
27
31
|
# vim: set sw=2 et cc=80:
|
data/spec/printer_spec.rb
CHANGED
@@ -30,7 +30,9 @@ describe Rouge::Printer do
|
|
30
30
|
end
|
31
31
|
|
32
32
|
context "string-symbols" do
|
33
|
-
it { Rouge.print(:"!ruby!", "").should eq "
|
33
|
+
it { Rouge.print(:"!ruby!", "").should eq ":!ruby!" }
|
34
|
+
it { Rouge.print(:"lady-bird", "").should eq ":lady-bird" }
|
35
|
+
it { Rouge.print(:"bean sprouts", "").should eq ":\"bean sprouts\"" }
|
34
36
|
end
|
35
37
|
end
|
36
38
|
|
data/spec/seq_spec.rb
CHANGED
@@ -110,12 +110,12 @@ describe Rouge::Seq::Cons do
|
|
110
110
|
Rouge::Seq::Cons.new(3, Rouge::Seq::Empty))) }
|
111
111
|
end
|
112
112
|
|
113
|
-
describe "#
|
114
|
-
it { Rouge::Seq::Cons[].
|
115
|
-
it { Rouge::Seq::Cons[1].
|
116
|
-
it { Rouge::Seq::Cons[1, 2].
|
117
|
-
it { Rouge::Seq::Cons[1, 2, 3].
|
118
|
-
it { Rouge::Seq::Cons[1, 2, 3].tail.
|
113
|
+
describe "#to_s" do
|
114
|
+
it { Rouge::Seq::Cons[].to_s.should eq "()" }
|
115
|
+
it { Rouge::Seq::Cons[1].to_s.should eq "(1)" }
|
116
|
+
it { Rouge::Seq::Cons[1, 2].to_s.should eq "(1 2)" }
|
117
|
+
it { Rouge::Seq::Cons[1, 2, 3].to_s.should eq "(1 2 3)" }
|
118
|
+
it { Rouge::Seq::Cons[1, 2, 3].tail.to_s.should eq "(2 3)" }
|
119
119
|
end
|
120
120
|
|
121
121
|
describe "the ASeq implementation" do
|
data/spec/symbol_spec.rb
CHANGED
@@ -30,6 +30,11 @@ describe Rouge::Symbol do
|
|
30
30
|
it { Rouge::Symbol[:boo].to_sym.should eq :boo }
|
31
31
|
it { Rouge::Symbol[:"what/nice"].to_sym.should eq :"what/nice" }
|
32
32
|
end
|
33
|
+
|
34
|
+
describe "#to_s" do
|
35
|
+
it { Rouge::Symbol[:"breakfast"].to_s.should eq "breakfast" }
|
36
|
+
it { Rouge::Symbol[:"breakfast/toast"].to_s.should eq "breakfast/toast" }
|
37
|
+
end
|
33
38
|
end
|
34
39
|
|
35
40
|
# vim: set sw=2 et cc=80:
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rouge-lang
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.10
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -188,7 +188,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
188
188
|
version: '0'
|
189
189
|
segments:
|
190
190
|
- 0
|
191
|
-
hash: -
|
191
|
+
hash: -185805507
|
192
192
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
193
193
|
none: false
|
194
194
|
requirements:
|
@@ -197,7 +197,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
197
197
|
version: '0'
|
198
198
|
segments:
|
199
199
|
- 0
|
200
|
-
hash: -
|
200
|
+
hash: -185805507
|
201
201
|
requirements: []
|
202
202
|
rubyforge_project:
|
203
203
|
rubygems_version: 1.8.24
|