Хорошее обсуждение этого вопроса здесь . Самая полезная часть, которая относится к вашему вопросу:
Динамические привязки отлично подходят для
изменение поведения подсистем.
Предположим, вы используете функцию «foo»
который генерирует вывод, используя «print».
Но иногда вы хотели бы
захватить вывод в буфер вашего
Выбор. С динамическим связыванием это
легко:
(let ((b (generate-new-buffer-name " *string-output*"))))
(let ((standard-output b))
(foo))
(set-buffer b)
;; do stuff with the output of foo
(kill-buffer b))
(И если бы вы использовали такие вещи,
много, вы бы заключили это в макрос -
но к счастью это уже было сделано как
'С-выход-на-ТЕМП-буфера.)
Это работает, потому что "foo" использует
динамическая привязка имени
«Стандартный вывод», так что вы можете
замените свою собственную привязку для этого
имя, чтобы изменить поведение "foo"
- и из всех функций, которые "foo"
вызовов.
На языке без динамического связывания,
вы, вероятно, добавили бы
аргумент 'foo' для указания буфера
и тогда «фу» передаст это любому
звонки на «печать». Но если "Фу" звонит
другие функции, которые сами называют
«Распечатать», вам придется изменить эти
функции также. И если «печать» имел
другой вариант, скажем, «уровень печати»,
Вы должны добавить это в качестве дополнительного
аргумент, а ... В качестве альтернативы, вы
мог вспомнить старую ценность
«Стандартный вывод», замените свой новый
значение, вызовите «foo», а затем восстановите
старое значение И не забудьте справиться
нелокальные выходы с использованием «throw». когда
вы покончили с этим, вы увидите
что вы внедрили динамический
связывание!
Тем не менее, лексическое связывание ИМХО намного лучше в 99% случаев. Обратите внимание, что современные Lisps не только для динамического связывания, как Emacs lisp.
- Common Lisp поддерживает обе формы привязки, хотя лексическая используется гораздо чаще
- Спецификация Scheme даже не определяет динамическое связывание (только лексическое), хотя многие реализации поддерживают оба.
Кроме того, современные языки, такие как Python и Ruby, которые были в некоторой степени вдохновлены Lisp, обычно поддерживают лексическое связывание прямым способом, с динамическим связыванием, также доступным, но менее простым.