Semi-seriously, if you want CONS, CAR, and CDR in Ruby, you could do worse than
def cons(x,y)
return lambda {|m| m.call(x,y)}
end
def car(z)
z.call(lambda {|p,q| p})
end
def cdr(z)
z.call(lambda {|p,q| q})
end
And then you can define your list procedures,
def interval(low, high)
if (low > high)
return nil
else
return cons(low, interval(low + 1, high))
end
end
def map(f, l)
if (l == nil)
return nil
else
cons(f.call(car(l)), map(f, cdr(l)))
end
end
def filter(p, l)
if (l == nil)
return nil
elsif (p.call(car(l)))
return cons(car(l), filter(p, cdr(l)))
else
return filter(p, cdr(l))
end
end
def reduce(f, f0, l)
if (l == nil)
return f0
else
return f.call(car(l), reduce(f, f0, cdr(l)))
end
end
And then you might get the sum of the odd squares in the range 1 to 10:
reduce(lambda {|x, y| x + y},
0,
filter(lambda {|x| x % 2 == 1},
map(lambda {|x| x * x},
interval(1, 10))))
=> 165