semi-serio, se si vuole CONS, auto, e CDR in Ruby, si potrebbe fare di peggio che
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
E poi si può definire le procedure della lista,
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
E allora si potrebbe ottenere la somma dei quadrati dispari uares nell'intervallo da 1 a 10:
reduce(lambda {|x, y| x + y},
0,
filter(lambda {|x| x % 2 == 1},
map(lambda {|x| x * x},
interval(1, 10))))
=> 165
Non solo non è utile, non è davvero significativo. Auto, cdr e contro sono intrinsecamente legati alle celle contro. Dal momento che le cellule cons non sono affatto coinvolte negli array di Ruby, qualsiasi metodo di questo tipo sarebbe un termine improprio. – Chuck