Почему Схема нуждается в специальном понятии тега местоположения процедуры?
Почему Схема нуждается в специальном понятии тега местоположения процедуры?
Стандарт гласит:
Каждая процедура, созданная в результате оценки лямбда-выражения, (концептуально) помечена местом хранения, чтобы сделать eqv? и экв? работа над процедурами
Экв? процедура возвращает #t, если:
- obj1 и obj2 - процедуры, теги местоположения которых равны
Уравнение? и экв? гарантированно будет вести себя одинаково на... процедурах...
Но в то же время:
Переменные и объекты, такие как пары, векторы и строки, неявно обозначают местоположения или последовательности местоположений
Экв? процедура возвращает #t, если:
- obj1 и obj2 - это пары, векторы или строки, обозначающие одинаковые места в магазине
Уравнение? и экв? гарантированно будет иметь одинаковое поведение на... pair... и непустых строках и векторах
Почему бы просто не применять "неявно обозначать местоположения или последовательности местоположений" и к процедурам?
Я думал, что это касается и их
Я не вижу ничего особенного в процедурах в этом отношении
2 ответа
Пары, векторы и строки изменчивы. Следовательно, идентичность (или местоположение) таких объектов имеет значение.
Процедуры являются неизменяемыми, поэтому их можно произвольно копировать или объединять без видимых различий в поведении. На практике это означает, что некоторые оптимизирующие компиляторы могут встроить их, фактически делая их "множественными копиями". R6RS, в частности, говорит, что для выражения вроде
(let ((p (lambda (x) x)))
(eqv? p p))
результат не гарантируется как истинный, так как он мог быть (eqv? (lambda (x) x) (lambda (x) x))
,
Идея R7RS о тегах местоположения заключается в том, чтобы обеспечить уверенность в том, что это выражение действительно приводит к истине, даже если реализация делает встраивание.
Обработка процедур как значений работает в таких языках, как ML, где они действительно неизменны. Но в Схеме процедуры могут быть видоизменены, потому что их локальные переменные могут быть. В сущности, процедуры - это объекты бедняков (хотя можно также утверждать, что объекты в стиле ОО являются просто процедурами бедняков!) Тег местоположения служит той же цели, что и идентификатор объекта, который различает две пары с одинаковыми машинами и CDR.
В частности, присвоение идентификатора глобальным процедурам означает, что можно напрямую спросить, является ли предикат, который мы передали, именно eq? или экв? или равно?, что невозможно в R6RS (хотя это возможно в реализациях R6RS на практике).