sicp.io
2.3.1 · Цитирование и символьные данные

Цитирование и равенство символьных данных

Символы и списки остаются невычисленными с помощью quote, что позволяет отличать символьную идентичность от рекурсивного структурного равенства.

Вопрос для размышления

Как вычислитель узнает, когда (+ x 3) является применением для запуска, а когда списком для анализа?

  • Восприятие синтаксиса quote как границы между вычислением и символьными данными
  • Анализ списка в форме выражения с помощью обычных селекторов
  • Построение нового символьного списка с вычислением только выбранных элементов
  • Использование eq? для проверки идентичности символов или объектов
  • Использование equal? для рекурсивного структурного сравнения

Цитированное выражение (+ x 3) представляет собой список из трех элементов. Первый элемент это символ +, а второй это символ x, и ни одно из этих имен не ищется в окружении при создании цитированного списка. Напротив, (list '+ x 3) цитирует только символ +, вычисляет x со значением 10 и строит список данных (+ 10 3).

eq? проверяет, обозначают ли операнды один и тот же символ или идентичный объект. equal? спускается по составным данным и сравнивает структуру и листья. Поэтому вторая программа отличает один разделяемый список от отдельного списка с тем же содержимым, признавая при этом их структурное равенство.

Код SICP245 из 1,048,576 байт UTF-8
Примеры
Результат
Вывод
Значение
Диагностика
Трасса выполнения0 / 0 событий
    Запуски происходят внутри браузера с отображением результата программы и трассы выполнения.
    Ожидаемый результат

    Первая программа возвращает ((+ 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?.

    Показать подсказку

    Процитируйте первое выражение целиком. Для второго объедините цитированные символы операций с построением списка вокруг единственного элемента, который требуется вычислить.

    Завершить этот урок

    В этой главе пройдено 0 из 20 уроков0%