lib/nydp/pair.rb in nydp-0.2.3 vs lib/nydp/pair.rb in nydp-0.2.5
- old
+ new
@@ -6,25 +6,36 @@
def initialize car, cdr
@car, @cdr = car, cdr
end
- def nydp_type ; :pair ; end
- def caar ; car.car ; end
- def cadr ; cdr.car ; end
- def cdar ; car.cdr ; end
- def cddr ; cdr.cdr ; end
- def car= thing ; @car = thing ; @_hash = nil ; end
- def cdr= thing ; @cdr = thing ; @_hash = nil ; end
- def hash ; @_hash ||= (car.hash + cdr.hash) ; end
- def eql? other ; self == other ; end
+ def nydp_type ; :pair ; end
+ def caar ; car.car ; end
+ def cadr ; cdr.car ; end
+ def cdar ; car.cdr ; end
+ def cddr ; cdr.cdr ; end
+ def car= thing ; @car = thing ; @_hash = nil ; end
+ def cdr= thing ; @cdr = thing ; @_hash = nil ; end
+ def hash ; @_hash ||= (car.hash + cdr.hash) ; end
+ def eql? other ; self == other ; end
+ def copy ; cons(car, cdr.copy) ; end
+ def + other ; copy.append other ; end
+ def size ; 1 + (cdr.is_a?(Nydp::Pair) ? cdr.size : 0) ; end
+ def inspect ; "(#{inspect_rest})" ; end
+ # returns Array of elements after calling #n2r on each element
def to_ruby list=[]
list << n2r(car)
cdr.is_a?(Nydp::Pair) ? cdr.to_ruby(list) : list
end
+ # returns Array of elements as they are
+ def to_a list=[]
+ list << car
+ cdr.is_a?(Nydp::Pair) ? cdr.to_a(list) : list
+ end
+
def self.parse_list list
if sym? list.slice(-2), "."
from_list(list[0...-2], list.slice(-1))
else
from_list list
@@ -37,39 +48,23 @@
else
new list[n], from_list(list, last, n+1)
end
end
- def copy
- cons(car, cdr.copy)
- end
-
- def + other
- copy.append other
- end
-
def == other
- (other.respond_to? :car) && (self.car == other.car) && (self.cdr == other.cdr)
+ Nydp::NIL.isnt?(other) && (other.respond_to? :car) && (self.car == other.car) && (self.cdr == other.cdr)
end
- def size
- 1 + (cdr.is_a?(Nydp::Pair) ? cdr.size : 0)
- end
-
def proper?
Nydp::NIL.is?(cdr) || (cdr.is_a?(Nydp::Pair) && cdr.proper?)
end
def each &block
yield car
cdr.each(&block) unless Nydp::NIL.is?(cdr)
end
- def inspect
- "(#{inspect_rest})"
- end
-
def to_s
if car.is_a?(Nydp::Symbol) && car.is?(:quote)
if Nydp::NIL.is? cdr.cdr
"'#{cdr.car.to_s}"
else
@@ -115,18 +110,22 @@
[car.to_s, cdr_s].compact.join " "
end
def inspect_rest
- cdr_s = if cdr.is_a?(self.class)
- cdr.inspect_rest
- elsif cdr == Nydp::NIL
- nil
- else
- ". #{cdr.inspect}"
- end
-
- [car.inspect, cdr_s].compact.join " "
+ res = [car.inspect]
+ it = cdr
+ while it && it != Nydp::NIL
+ if it.is_a?(self.class)
+ res << it.car.inspect
+ it = it.cdr
+ else
+ res << "."
+ res << it.inspect
+ it = nil
+ end
+ end
+ res.compact.join " "
end
def append thing
if Nydp::NIL.is? self.cdr
self.cdr = thing