Когда использовать обратную цитату в схеме?
Для реализации схемы, поддерживающей R5RS, определение макроса может быть выполнено путем сопоставления с шаблоном в синтаксическом правиле, в этом случае зачем нам обратная цитата?
Через emacs lisp я изучаю очень простой lisp, в elisp мы должны использовать множество обратных цитат для написания макроса, но для схемы, которая поддерживает сопоставление с образцом, есть ли ситуации, в которых наличие обратных цитат может быть полезным? Или я должен спросить, при каких обстоятельствах программист обычно использует кавычки, чтобы помочь им решить проблему?
3 ответа
Квазицитат (то есть обратная цитата) - это просто синтаксический suger для построения списка времени выполнения.
Это тоже очень полезно. Прежде всего, это дает вам очевидное быстрое построение списка, позволяя вам быстро перейти от оценки к контексту цитаты.
Например код (cons (append (list a 'b) c) d))
можно записать как `(,a b ,@c ,@d)
(без цитирования, обозначается как ,@
используется для добавления списка в результате выражения).
Во-вторых, это позволяет очень быстро отслеживать отладку фрагмента кода. Скажем, у вас есть следующий код:
(define string-split
(lambda (s delim)
(reverse (car (fold-left
(lambda (p ch)
(let ((str-lst (car p))
(char-lst (cdr p)))
(if (char=? ch delim)
(if (null? char-lst)
(cons str-lst '())
(cons (cons (list->string (reverse char-lst)) str-lst) '()))
(cons str-lst (cons ch char-lst)))))
`(() ())
(append (string->list s) `(,delim)))))))
Если вы называете это с аргументами "abc def"
а также #\space
вы получите ошибку от list->string
, Трудно понять, что пошло не так и где, но если квазицитировать к list->string
и отменить кавычки (используя ,
) Аргумент char-lst
, это даст вам хороший совет, чтобы начать.
Вы делаете это похоже на единственный раз, когда мы делаем списки, это генерировать код. Это не вариант.
Синтаксис обратной цитаты - это просто синтаксический сахар для некоторых литералов и некоторых расширений. Поэтому вместо того, чтобы писать:
(list 'this 'is expr)
Ты можешь написать
`(this is ,expr)
Они имеют практически одинаковый объектный код. Итак, чтобы ответить на ваш вопрос: В случае, если вы собираетесь создать список или дерево (списки списков), которые имеют части, которые являются литералами, а некоторые части, которые не являются, используя backquote
а также unquote
значительно упрощает код до чего-то, что легче читать, что снова уменьшает количество ошибок.
Кстати: с syntax-rules
имеют ограничения, большинство реализаций имеет как минимум одну альтернативную систему макросов и может иметь quasiquote
unquote
или даже специальная версия для синтаксиса. От R6RS syntax-case
имеет #`
а также #,
,
Обратная цитата чрезвычайно полезна в "шаблонизации". В качестве простого примера, скажем, я хочу создать html-подобный элемент, содержащий неупорядоченный список, второй элемент которого происходит из программной переменной с именем placeholder
, Я бы написал это так:
`(ul (li "the first item")
(li ,placeholder)
(li "the third item"))