(define (add n) (lambda (m) (+ n m)))
(define add4 (add 4))
(map (add 7) (list 1 2 3))
Pero eso es solo un pequeño ejemplo al azar. Si cavas lo suficiente, encontrarás varias toneladas de razones adicionales. Para una discusión más completa, realmente deberías revisar algunos libros de texto. Mi recomendación para esto sería PLAI.
Aquí es una demostración más:
(define tax 0.17)
(define (add-tax amt) (+ amt (* amt tax)))
Parece que add-tax
es una función que devuelve la cantidad dada con la tasa de impuestos correcta añadió - pero nunca se puede confiar en este es el caso. Por ejemplo, podría llamarse así:
(let ((tax -0.17)) (add-tax 100))
y obtendría respuestas completamente incorrectas. Pero las cosas son aún peores si su idioma tiene un alcance realmente dinámico: no puede confiar en vinculante, incluidas las funciones. Considere esto:
(let ((+ -)) (add-tax 100))
Y por cierto Elisp y CL no sufren de este problema tan directamente, usando cosas como un doble espacio de nombres, y las reglas sobre el remedo "construido en" consolidaciones.
La mayoría de las funciones dinámicas de reencuadernación no se realizan en CL, ya que CL utiliza por defecto el enlace léxico para funciones también. Diferente a Elisp, que no tiene ningún enlace léxico. –