Исток-Системы - Форумы
Поддержка пользователей программных продуктов и библиотек

Лексическое замыкание. Динамическое связывание

Начать новую тему Новая темаОтветить в тему Ответить    
Зарегистрирован 01 июн 2022
Сообщений 1
Сообщение Дата 03 июн 2022 16:58
Лексическое замыкание. Динамическое связывание  
Здравствуйте!

Мне кажется, обнаружил некоторую неточность в описании лексического замыкания:

http://lisp.ystok.ru/fp/lisp/1_58.html#_h62

“Определение f порождает объект-функцию, называемую лексическим замыканием. Оно включает не только исполняемый код, но и часть вычислительного окружения со значениями всех свободных переменных, встречающихся в теле определения.”

Однако, если я правильно понял, лексическое замыкание содержит не сами значения свободных переменных, а их связывания. Вот пример:

Код:
(let ((pair
       (let ((x 0))
         (cons (lambda (a) (setq x a))
               (lambda () x)))))
  (setf (symbol-function 'setit) (car pair))
  (setf (symbol-function 'getit) (cdr pair)))

(getit)

(setit 1)

(getit)


И ещё такой вопрос: до меня никак не доходит в чём прелесть концепции динамического связывания?
Вы упоминали на одной из лекций, что это одна из уникальных черт Лиспа, которая в других языках отсутствует, но в чём же заключается её практическое удобство?
Тем более, что в Лиспе существует механизм необязательны и ключевых параметров, при том, что значением по умолчанию необязательного параметра может быть результат вычислениях произвольной формы, а не как в C# - только литералы, значениях, которых известны на момент компиляции. Не могу придумать какой-то пример, в котором ключевые\необязательные параметры не были бы более безопасным решением.

У меня сложилось впечатление, что переменные с динамическим связыванием представляют собой чуть менее вредную разновидность глобальных переменных. Однако использование глобальных переменных считается плохим стилем в любом из известных мне языков/парадигм, поэтому очень хочется увидеть как-нибудь конкретный пример.
     
Показать профиль участника
Администратор
Зарегистрирован 11 окт 2011
Сообщений 36
Сообщение Дата 03 июн 2022 18:36
Лексическое замыкание. Динамическое связывание  
Цитата:
Однако, если я правильно понял, лексическое замыкание содержит не сами значения свободных переменных, а их связывания. Вот пример:

Конечно, правильнее сказать "связывыния", а не "значения", поскольку связанное значение может быть изменено.

Цитата:
И ещё такой вопрос: до меня никак не доходит в чём прелесть концепции динамического связывания?

Динамическая похоже на глобальную с той разницей, что конкретное её связывание "обычно имеет" меньшее время жизни: с момента входа в кусок кода до выхода из него. Прелести две (показано на примере функции print-matrix):

В целом это придаёт стилю программирования большую дисциплину. Что касается безопасности, по-моему в С++ и клонах это нарочито раздутая тема. (Как и в повседневной жизни).
     
Показать профиль участника
 
Начать новую тему Новая тема Ответить в тему Ответить
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения
cron