Песочница

Код и есть данные

Сравните вызов с цитированным списком и извлеките значение из списка с решением.

Вы предскажете, как апостроф превращает вызов в данные. Вы также извлечёте решение из списка с помощью car и cdr.

Сначала прочитайте раздел Чтение скобок. Запускайте каждый пример отдельно на площадке, чтобы увидеть результат.

Здесь keep означает оставить заголовок раздела на текущей странице.

Сравните вызов и цитированный список

LISPEX
(+ 2 3)

Результат

ВЫВОД
5

Этот код вызывает + с числами 2 и 3. Теперь добавьте апостроф.

LISPEX
'(+ 2 3)

Результат

ВЫВОД
(+ 2 3)

В результате получается список из трёх элементов, символа + и чисел 2 и 3. Символ обозначает значение, которое можно использовать как имя в коде. Здесь + остаётся символом в списке, поэтому сложение не выполняется.

Начальный ' сокращённо обозначает quote. Она возвращает следующие за ней данные без вычисления их как кода. Вызовы и списки данных используют одинаковую запись со скобками.

Прочитайте решение из списка

LISPEX
(define answer '(decision keep))
(car (cdr answer))

Результат

ВЫВОД
keep

answer именует список из двух символов, decision и keep. Первый символ обозначает вид результата. Второй содержит решение.

Для непустого списка car возвращает первый элемент, а cdr возвращает оставшийся список. Здесь (cdr answer) возвращает (keep). Внешний car извлекает его первый элемент, символ keep.

Теми же операциями можно разобрать цитированный вызов, например '(+ 2 3). Программа также может создавать списки, представляющие новые программные выражения.

Узнайте связанные обозначения

quote сохраняет фиксированные данные. Чтобы построить список с вычисляемыми частями, можно использовать quasiquote. Эти четыре строки показывают обозначения, а не программу для запуска.

'x
`x
,x
,@xs
ЗаписьНазваниеЗначение
'xquoteСохранить x как данные
`xquasiquoteЗадать шаблон данных с вычисляемыми частями
,xunquoteВнутри quasiquote вставить значение x
,@xsunquote-splicingВнутри quasiquote вставить элементы списка xs

Обозначения с запятой используются внутри quasiquote. В этом уроке для всех фиксированных списков достаточно quote.

Попробуйте сами

Предскажите оба элемента результата до запуска.

LISPEX
(list (+ 1 2) '(+ 1 2))
Показать ответ

Результат равен (3 (+ 1 2)). Первый аргумент list вызывает + и возвращает 3. Второй аргумент цитируется и возвращает список из трёх элементов (+ 1 2). list объединяет два значения в один список.

Объясните, почему (car (cdr answer)) возвращает символ, а (cdr answer) возвращает список. Затем перейдите к разделу Данные, условия и решения, чтобы выбрать решение по условию.