Представьте себе простой (составленный) язык, в котором функции выглядят так:
function f(a, b) = c + 42
where c = a * b
(скажем, это подмножество Lisp, которое включает в себя 'defun' и 'let'.)
Также представьте, что он включает в себя неизменяемые объекты, которые выглядят так:
struct s(a, b, c = a * b)
Снова аналогично Lisp (на этот раз надмножество), скажем, что определение структуры, подобное этому, сгенерирует функции для:
make-s(a, b)
s-a(s)
s-b(s)
s-c(s)
Теперь, учитывая простую настройку, кажется очевидным, что есть много общего между тем, что происходит за сценой, когда вы называете «f» или «make-s». Как только 'a' и 'b' предоставлены во время вызова / создания экземпляра, информации достаточно для вычисления 'c'.
Можно подумать, что создание экземпляра структуры напоминает вызов функции, а затем сохранение результирующей символической среды для последующего использования при вызове сгенерированных функций доступа. Или вы можете подумать о том, чтобы оценить функцию как создание скрытой структуры, а затем использовать ее как символическую среду для оценки выражения конечного результата.
Моя модель игрушки настолько упрощена, что бесполезна? Или это действительно полезный способ подумать о том, как работают настоящие языки? Существуют ли какие-либо реальные языки / реализации, о которых кто-то, не имеющий опыта работы с CS, но с интересом к языкам программирования (т.е. мне), должен узнать больше, чтобы изучить эту концепцию?
Спасибо.
РЕДАКТИРОВАТЬ: Спасибо за ответы до сих пор. Чтобы уточнить немного, я думаю, что мне интересно, есть ли какие-то реальные языки, когда люди, изучающие язык, говорят, например, «Вы должны думать об объектах как о замыканиях». Или, если есть какие-либо реализации на реальном языке, в которых экземпляр объекта и вызов функции фактически совместно используют какой-то общий (нетривиальный, то есть не просто вызов библиотеки) код или структуру данных.
Идет ли аналогия, которую я провожу, которую, как я знаю, уже делали другие, куда глубже, чем простая аналогия в реальных ситуациях?