Цитирование и равенство символьных данных
Символы и списки остаются невычисленными с помощью quote, что позволяет отличать символьную идентичность от рекурсивного структурного равенства.
Как вычислитель узнает, когда (+ x 3) является применением для запуска, а когда списком для анализа?
- Восприятие синтаксиса quote как границы между вычислением и символьными данными
- Анализ списка в форме выражения с помощью обычных селекторов
- Построение нового символьного списка с вычислением только выбранных элементов
- Использование eq? для проверки идентичности символов или объектов
- Использование equal? для рекурсивного структурного сравнения
Цитированное выражение (+ x 3) представляет собой список из трех элементов. Первый элемент это символ +, а второй это символ x, и ни одно из этих имен не ищется в окружении при создании цитированного списка. Напротив, (list '+ x 3) цитирует только символ +, вычисляет x со значением 10 и строит список данных (+ 10 3).
eq? проверяет, обозначают ли операнды один и тот же символ или идентичный объект. equal? спускается по составным данным и сравнивает структуру и листья. Поэтому вторая программа отличает один разделяемый список от отдельного списка с тем же содержимым, признавая при этом их структурное равенство.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Первая программа возвращает ((+ x 3) + x (+ 10 3) #t #t #f). Вторая программа возвращает (#t #f #t #t #t).
Обратите внимание, что quote создает данные без поиска + или x. Проследите за car и cadr для этого списка, а затем сравните это с построением (+ 10 3), где x вычисляется. В примере с идентичностью отличите связывание alias от отдельно выделенной копии copy перед тем, как equal? обойдет оба списка.
Измените программу и сравните результат.
Постройте символьное выражение (* (+ x 1) (+ x 1)) без вычисления x, затем постройте второй список, где только одна позиция x заменена текущим числовым значением. Сравните две структуры с помощью equal?.
Показать подсказку
Процитируйте первое выражение целиком. Для второго объедините цитированные символы операций с построением списка вокруг единственного элемента, который требуется вычислить.