Задачи, не подходящие для динамического определения объема работ - PullRequest
6 голосов
/ 26 августа 2010

Можете ли вы дать мне несколько примеров задач, не подходящих для динамически ограниченных лиспов? Я не могу понять, насколько лексическая область намного лучше, а не просто изменить стиль кодирования, поэтому я бы с удовольствием что-то написал и увидел это своими глазами.

Спасибо!

Ответы [ 2 ]

7 голосов
/ 26 августа 2010
(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 не страдают от этой проблемы так напрямую, используя такие вещи, как двойное пространство имен и правила затенения «встроенных» привязок.

0 голосов
/ 26 августа 2010

Стоит прочитать статью из Википедии о scope .

Функционально это имеет значение, только если у вас есть переменные, которые не связаны в текущей области. Так что, если у вас нет свободных переменных, это не имеет значения.

Ответ Элиза Барзилай - хороший пример лямбда-функции с символом (n), который будет иметь различную привязку в динамической / статической области видимости.

Из того, что я знаю, языки с лексической областью видимости могут быть скомпилированы немного больше, потому что во время компиляции компилятор может определять все ссылки на переменные, в отличие от динамической области, которая должна искать ссылку на переменную во время выполнения.

...