Оценка обратной кавычки Common Lisp: разделитель и оператор

Как это, что в

`(1 ,(+ 1 1) (- 4 1) 4) ; '(1 2 (- 4 1) 4)

знак минус ("-") рассматривается не как оператор (а как символ; '- вместо #'- - правильно?) (Эту часть я думаю, что понимаю.)

Но почему третья левая скобка действительно оценивается как '( -> (list ... (то есть разделитель списка/выражения, а не просто литерал, как '- выше?) Интерпретатор "заглядывает вперед" для закрывающий разделитель или он просто говорит: «Хорошо, это должен быть список. Если справа нет разделителя, выражение недействительно, и это не моя проблема».

Извините за запутанный вопрос; чтобы свести это к минимуму, я думаю, мой вопрос: как интерпретатор шаг за шагом правильно оценивает приведенный выше список? (Также не стесняйтесь исправлять терминологию.)


person Emanuel Berg    schedule 22.07.2012    source источник


Ответы (2)


Я пытаюсь представить, что вы думаете, что вызывает путаницу. я предполагаю, что проблема в следующем:

если обратная кавычка цитирует вещи, почему круглые скобки по-прежнему означают списки, а не просто еще один фрагмент текста?

если это то, о чем вы спрашиваете, то ответ (примерно - такие люди, как райнер, знают о lisp гораздо больше, чем я), что цитирование не так просто, как вы думаете. когда код читается lisp, он обрабатывается вещью, называемой «читателем». который превращает код в синтаксическое дерево — набор списков, образующих дерево, содержащее программу.

цитирование — это просто инструкция читателю, которая говорит что-то вроде:

обрабатывать `(a ,b) как (список 'a b)

и запятая работает примерно так

не обращайте внимания на вышесказанное - делайте то, что обычно делаете

я не знаю, поможет ли это. если я противоречу Райнеру, то он (я предполагаю, что это мужское имя?) побеждает. я просто пытаюсь получить больше в вашей голове.

о - еще кое-что. цитирование не делает вещи "текстовыми". он делает слова атомами (и списками скобок). так что это действительно не так просто, как "сделать этот текст".

person andrew cooke    schedule 22.07.2012
comment
если обратная кавычка цитирует вещи, почему круглые скобки по-прежнему означают списки, а не просто еще один фрагмент текста? В том-то и дело, за исключением того, что я знал, что это не текст. (Я написал символ, но ваше слово атом наверное лучше.) Что касается вашего ответа - справедливо ли будет сказать - сначала делается дерево по спискам, потом выполняются операции, а обратная кавычка - это тип оператора, поэтому список внутри обратной кавычки все еще является списком? (Долгое замешательство.) - person Emanuel Berg; 23.07.2012
comment
это применяется читателем. это делается в то же время, что и преобразование в списки. обратная кавычка не является оператором в том же смысле, что и все, что происходит во время выполнения. это специальная инструкция для кода, который анализирует ввод. это происходит до того, как что-либо будет оценено. - person andrew cooke; 23.07.2012

`(1 ,(+ 1 1) (- 4 1) 4)

Backquote — макрос для чтения. Он преобразует выражение во ВРЕМЯ ЧТЕНИЯ.

Сделай это:

 (read-from-string "`(1 ,(+ 1 1) (- 4 1) 4)")

Это читается как конкретная форма реализации. Что-то похожее на это:

 (list* 1 (+ 1 1) '((- 4 1) 4))

Стандарт CL не указывает, что анализирует обратная кавычка.

Таким образом, приведенное выше преобразование выполняется ЧИТАТЕЛЕМ.

Затем оценка проводится по обычным правилам. Ничего особенного.

LIST* берет первые аргументы и записывает их перед последним аргументом, который является списком.

person Rainer Joswig    schedule 22.07.2012
comment
Когда наступает время чтения? О CL я слышал только о времени компиляции и времени выполнения (последнее в интерпретативном режиме) - и я должен сказать, что это было в контексте расширения макросов. - person Emanuel Berg; 23.07.2012
comment
@Emanual Berg: «ВРЕМЯ ЧТЕНИЯ» - это когда работает ЧТЕНИЕ. Когда текстовые s-выражения считываются в данные Лиспа. - person Rainer Joswig; 23.07.2012
comment
Вы пишете выражение, затем нажимаете Enter, интерпретатор читает его — вот когда? И вы load файл, затем одну строку за раз читаете, эта строка оценивается, читаете следующую строку, ...? - person Emanuel Berg; 23.07.2012
comment
@ Эмануэль Берг: «Переводчик» ничего не читает. Переводчик интерпретирует. READ читает вещи. См. документацию по функции READ. READ также запускает макросы чтения. - person Rainer Joswig; 23.07.2012
comment
Я целыми днями читаю документацию и учебные пособия, но я думаю, что вы можете многому научиться в социальном контексте. Я говорю это, потому что ты кажешься действительно раздраженным моими вопросами. Если это на самом деле не так, то моя ошибка. Конечно, поищу ЧИТАТЬ. - person Emanuel Berg; 23.07.2012