semi-sérieux, si vous voulez CONS, CAR et le CDR en Ruby, vous pourriez faire pire que
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
Et vous pouvez définir vos procédures de liste,
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
Et vous pourriez obtenir la somme des carrés impairs uares dans la plage de 1 à 10:
reduce(lambda {|x, y| x + y},
0,
filter(lambda {|x| x % 2 == 1},
map(lambda {|x| x * x},
interval(1, 10))))
=> 165
Non seulement ce n'est pas utile, ce n'est pas vraiment significatif. Car, cdr et les inconvénients sont intrinsèquement liés à des cellules contre. Puisque par contre les cellules ne sont pas du tout impliquées dans les réseaux Ruby, une telle méthode serait un abus de langage. – Chuck