diff options
Diffstat (limited to 'ruby')
| -rw-r--r-- | ruby/core.rb | 8 | ||||
| -rw-r--r-- | ruby/printer.rb | 4 | ||||
| -rw-r--r-- | ruby/reader.rb | 1 |
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 |
