(define (add n) (lambda (m) (+ n m)))
(define add4 (add 4))
(map (add 7) (list 1 2 3))
Но это только один крошечный случайный пример.Если вы будете копать достаточно далеко, вы найдете несколько тонн дополнительных причин.Для более тщательного обсуждения, вы действительно должны пройти некоторый учебник.Моя рекомендация для этого будет PLAI .
Вот еще одна демонстрация:
(define tax 0.17)
(define (add-tax amt) (+ amt (* amt tax)))
Похоже, add-tax
- это функция, которая возвращает заданную сумму сдобавлена правильная налоговая ставка - но вы никогда не можете полагаться на это.Например, это можно назвать так:
(let ((tax -0.17)) (add-tax 100))
, и вы получите совершенно неправильные ответы.Но все еще хуже, если ваш язык действительно динамически ограничен: вы не можете полагаться на любое связывание, включая функции.Подумайте об этом:
(let ((+ -)) (add-tax 100))
Кстати, Elisp и CL не страдают от этой проблемы так напрямую, используя такие вещи, как двойное пространство имен и правила затенения «встроенных» привязок.