Представьте себе простой (составлено) язык, где функция выглядит следующим образом:Есть ли связь между вызовом функции и экземпляром объекта в чистых функциональных языках?
function f(a, b) = c + 42
where c = a * b
(Скажите это подмножество Lisp, который включает в себя «определении функции» и «пусть».)
И представьте себе, что она включает в себя неизменной объекты, которые выглядят как:
struct s(a, b, c = a * b)
Снова в Лисп проводящей аналогии (это время надмножества), скажем, определение структуры как это будет генерировать функции для:
make-s(a, b)
s-a(s)
s-b(s)
s-c(s)
Теперь, учитывая простую настройку, кажется очевидным, что существует много сходства между тем, что происходит за кулисами, когда вы вызываете «f» или «make-s». Когда «a» и «b» предоставляются во время вызова/создания экземпляра, для вычисления «c» достаточно информации.
Вы можете подумать о том, как создать структуру как функцию вызова функции, а затем сохранить результирующую символическую среду для последующего использования при вызове генерируемых функций доступа. Или вы могли бы подумать об оценке функции как о создании скрытой структуры, а затем ее использовании в качестве символической среды, с помощью которой можно было бы оценить окончательное выражение результата.
Является ли моя игрушечная модель настолько упрощенной, что она бесполезна? Или это действительно полезный способ подумать о том, как работают настоящие языки? Существуют ли какие-либо реальные языки/реализации, которые кто-то, не имеющий опыта работы с CS, но с интересом к языкам программирования (то есть мне), должен узнать больше, чтобы изучить эту концепцию?
Спасибо.
EDIT: Спасибо за ответы до сих пор. Чтобы немного разобраться, я думаю, что мне интересно, есть ли какие-либо реальные языки, где это происходит, когда люди, изучающие язык, говорят, например. «вы должны думать о том, что объекты являются, по сути, закрытием». Или, если есть какие-либо реалии реального языка, где это происходит, когда экземпляр объекта и вызов функции фактически имеют общие (нетривиальные, т. Е. Не только вызовы библиотеки) кодовые или структурные данные.
Является ли аналогия, которую я делаю раньше, какие-либо другие, раньше, чем любая другая аналогия в любых реальных ситуациях?
Ну, конечно, есть аналогия. 'make-s' можно рассматривать как фабрику, которая по определению является функцией. И я действительно нашел интересным, хотя и не слишком важным для моего кодирования-fu, подумать о методах (включая фабрики/конструкторы) как функции и области функции как символ (/ string) => отображение значений. Python делает оба. +1, потому что я люблю такие вещи. – delnan
Вид связанного: http://stackoverflow.com/questions/2497801/closures-are-poor-mans-objects-and-vice-versa-what-does-this-mean – missingfaktor