y«0»
и y«1»
просто означают, что хотя переменная имеет имя y
, она отличается от y
, чем передаваемая. Флаг #:refers-to
используется для того, чтобы формы учитывали подстановку, избегающую захвата.
В общем, идея такова, каким должен быть результат этой программы:
((lambda (x) (lambda (y) x))
y)
Должна ли эта программа оценивать 4
или 3
? Если мы используем простую подстановку, то можем сказать, что программа сокращается до:
(lambda (y) y)
Что является функцией тождества. Это заметно, если мы, скажем, привязали y к 5 и назвали результат:
(let* ([y 5]
[f ((lambda (x) (lambda (y) x))
y)])
(f 6))
Здесь мы ожидаем, что результат будет 5
, даже если мы передаем 6
в f
. Это потому, что y
в результате указывает на первое y
в let*
. Вы можете увидеть это, если вы щелкнете мышью по y
в DrRacket.
Чтобы избежать этого, вместо простой замены всех x
с в выражении на y
с, он переименовывает все связующие вплоть до новых имен, поэтому вместо этого вы получите:
(lambda (y«0») y)
И теперь ясно, что два y
в этом выражении различны.