Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

Improve my bland List

Name: Anonymous 2012-02-04 2:25

class List
        attr_reader :car, :cdr, :size
        def initialize(*args)
                if args.size.zero? then
                        @car = nil; @cdr = nil; @size = 0
                elsif args.size == 1
                        @car = args[0]; @cdr = List.new; @size = 1
                else
                        @car = args[0]
                        @cdr = List.new *args[1 .. args.size - 1]
                        @size = args.size
                end
        end
        def [](n)
                raise ArgumentError unless n.class == Fixnum
                unless n > @size - 1 then
                        if n.zero? then @car
                        else @cdr[n - 1] end
                end
        end
        def []=(n,a)
                raise ArgumentError unless n.class == Fixnum
                unless n > @size - 1 then
                        if n.zero? then @car = a
                        else @cdr[n-1] = a end
                else raise ArgumentError
                end
        end
        def length
                @size
        end
        def null?
                @cdr.nil?
        end
        def member?(a)
                if a.nil? then true end
                unless self.null? then
                        if @car == a then true
                        else @cdr.member? a end
                else false
                end
        end
        def include?(a)
                self.member? a
        end
end

Name: Anonymous 2012-02-04 6:06

>>10
So basically if you want to simulate lisp lists you only make a pair class like so:

class Cons
  attr_accessor :car, :cdr
  def initialize(car, cdr = nil)
    @car, @cdr = car, cdr
  end
end

def list(*values)
  node = start = Cons.new(values.shift)
    for value in values
      next_node = Cons.new(value)
      node.cdr = next_node
      node = next_node
    end
    return start
end

l = list(1,2,3,4)

puts l.cdr.cdr.car # => 3

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List