Когда использовать обратную цитату в схеме?

Для реализации схемы, поддерживающей 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 имеют ограничения, большинство реализаций имеет как минимум одну альтернативную систему макросов и может иметь quasiquoteunquote или даже специальная версия для синтаксиса. От R6RS syntax-case имеет #` а также #,,

Обратная цитата чрезвычайно полезна в "шаблонизации". В качестве простого примера, скажем, я хочу создать html-подобный элемент, содержащий неупорядоченный список, второй элемент которого происходит из программной переменной с именем placeholder, Я бы написал это так:

`(ul (li "the first item")
     (li ,placeholder)
     (li "the third item"))
Другие вопросы по тегам