В lisp парены иногда означают конструктор списка, а иногда и оценку? - PullRequest
0 голосов
/ 10 февраля 2019

Я абсолютный новичок в Лиспе.Рассмотрим два следующих примера:

guile -c "(display 2)" # prints 2
guile -c "display 2" # doesn't print 2

Я думал о паренах как о конструкторах списков, полагая, что они не нужны для группировки на этом языке, поскольку нет приоритета операторов.Но в этом случае кажется, что у паренов есть эффект оценки выражения, что, я думаю, действует как своего рода сопоставление с образцом: если интерпретатор видит нечто, похожее на display X, определение displayзаставляет это преобразовать это во что-то еще.

Правильно ли я интерпретирую это поведение?Если это так, то как мне сгенерировать список, первым элементом которого была бы функция display?

Если у паренов есть эффект запуска вычисления, то это особый случай, который происходит только тогда, когда первый элементиз списка есть функция?Например, я могу сделать это

guile -c "(display display)"

, который выводит описание типа и имени функции display.

1 Ответ

0 голосов
/ 10 февраля 2019

Вы должны иметь четкое различие между чтением и оценкой форм:

  • Прежде всего, код читается, преобразовывая строку в дерево выражений.В случае Lisp AST также является значением Lisp.Если вы вводите строку "(display 1)", вы читаете литеральный список, первое значение которого является символом display, а второй элемент равен 1.

  • Когда вы берете это выражениеи оцените его, либо автоматически из REPL, либо путем вызова eval, вы просите язык интерпретировать данные Lisp как код.Когда это значение является списком, по обычным правилам оценки, это вызов функции.Если ваша форма заключена в кавычки, например (quote (display 1)), в которой можно написать '(display 1), то результатом оценки будут просто цитируемые данные, вот список.

Что выхочу, чтобы код генерировал во время выполнения список, чей первый элемент display.Как показано выше, вы можете легко заключить в кавычки список времени чтения, если возвращаемые вами данные являются постоянными, например '(display).Но в большинстве случаев данные, которые вы генерируете во время выполнения, состоят из других оцененных данных, и способ создания списка заключается в вызове функции list:

(list 'display 1)

.из трех элементов, а именно символа list, списка (quote display) и числа 1. При оценке этот список является вызовом функции, поэтому все аргументы оцениваются: (quote display) оценивается как символ display, и 1оценивает как себя.Наконец, функция, связанная с list, вызывается для этих значений.

Обратите внимание, что читатель в Лиспе также, вероятно, вызывает list под капотом, что является одним из забавных аспектов мета-циклов в Лиспе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...