Почему Схема нуждается в специальном понятии тега местоположения процедуры?

Почему Схема нуждается в специальном понятии тега местоположения процедуры?
Стандарт гласит:

Каждая процедура, созданная в результате оценки лямбда-выражения, (концептуально) помечена местом хранения, чтобы сделать 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 на практике).

Другие вопросы по тегам