Использование локальных специальных переменных - PullRequest
2 голосов
/ 23 июня 2019

Для удобства создания прототипов я опирался на ряд глобальных переменных, которые интенсивно используются в коде.Но теперь я хотел бы сделать некоторые из них локальными (но динамическими).Есть ли существенный недостаток (например, эффективность, что-то еще), чтобы объявить их локально special вместо глобального?

1 Ответ

1 голос
/ 24 июня 2019

Непопулярные особенности специальных переменных включают в себя:

  • Отсутствие ссылочной прозрачности

Это усложняет функциональные рассуждения о вашем коде. Это означает, что ваша функция дает разные результаты с синтаксически эквивалентными вызовами.

  • Ввести ошибки

Если где-то в вашем коде определена лексическая переменная (например, в системной функции), вы перезапишете ее и вызовете ошибки.

  • Заблуждение

Специальная (динамическая) привязка непопулярна и приведет в замешательство ваших читателей, которые не знакомы с ней.

  • Ненужное

Просто используйте лексическое связывание или даже анафорические макросы.

Дополнительная информация:

Анафорические макросы См. «Пусть больше лямбда» Дуга Хойта, или анафорические макросы Пола Грэма.

В LiSP (Lisp in Small Pieces) есть раздел о связывании и динамическом связывании

Elisp имеет динамическое связывание по умолчанию и принудительное динамическое связывание в течение длительного времени

Многие ранние лиспы имели динамическое связывание, но отбрасывали его.

...