aboutsummaryrefslogtreecommitdiff
path: root/ruby
diff options
context:
space:
mode:
Diffstat (limited to 'ruby')
-rw-r--r--ruby/core.rb8
-rw-r--r--ruby/printer.rb4
-rw-r--r--ruby/reader.rb1
3 files changed, 9 insertions, 4 deletions
diff --git a/ruby/core.rb b/ruby/core.rb
index 6b127ba..d55100c 100644
--- a/ruby/core.rb
+++ b/ruby/core.rb
@@ -8,8 +8,10 @@ $core_ns = {
:nil? => lambda {|a| a == nil},
:true? => lambda {|a| a == true},
:false? => lambda {|a| a == false},
+ :symbol => lambda {|a| a.to_sym},
:symbol? => lambda {|a| a.is_a? Symbol},
- :symbol? => lambda {|a| a.is_a? Symbol},
+ :keyword => lambda {|a| "\u029e"+a},
+ :keyword? => lambda {|a| (a.is_a? String) && "\u029e" == a[0]},
:"pr-str" => lambda {|*a| a.map {|e| _pr_str(e, true)}.join(" ")},
:str => lambda {|*a| a.map {|e| _pr_str(e, false)}.join("")},
@@ -44,11 +46,11 @@ $core_ns = {
:sequential? => lambda {|a| sequential?(a)},
:cons => lambda {|a,b| List.new(b.clone.insert(0,a))},
:concat => lambda {|*a| List.new(a && a.reduce(:concat) || [])},
- :nth => lambda {|a,b| a[b]},
+ :nth => lambda {|a,b| raise "nth: index out of range" if b >= a.size; a[b]},
:first => lambda {|a| a[0]},
:rest => lambda {|a| List.new(a.size > 0 && a.drop(1) || [])},
:empty? => lambda {|a| a.size == 0},
- :count => lambda {|a| a.size},
+ :count => lambda {|a| return 0 if a == nil; a.size},
:conj => lambda {|*a| a[0].clone.conj(a.drop(1))},
:apply => lambda {|*a| a[0][*a[1..-2].concat(a[-1])]},
:map => lambda {|a,b| List.new(b.map {|e| a[e]})},
diff --git a/ruby/printer.rb b/ruby/printer.rb
index cfcd064..37d338a 100644
--- a/ruby/printer.rb
+++ b/ruby/printer.rb
@@ -12,7 +12,9 @@ def _pr_str(obj, print_readably=true)
obj.each{|k,v| ret.push(_pr_str(k,_r), _pr_str(v,_r))}
"{" + ret.join(" ") + "}"
when String
- if _r
+ if obj[0] == "\u029e"
+ ":" + obj[1..-1]
+ elsif _r
obj.inspect # escape special characters
else
obj
diff --git a/ruby/reader.rb b/ruby/reader.rb
index 1039105..eb9ae7b 100644
--- a/ruby/reader.rb
+++ b/ruby/reader.rb
@@ -32,6 +32,7 @@ def read_atom(rdr)
when /^-?[0-9]+$/ then token.to_i # integer
when /^-?[0-9][0-9.]*$/ then token.to_f # float
when /^"/ then parse_str(token) # string
+ when /^:/ then "\u029e" + token[1..-1] # keyword
when "nil" then nil
when "true" then true
when "false" then false