Когда использовать обратную цитату в схеме? - PullRequest
0 голосов
/ 22 сентября 2018

Для реализации схемы, поддерживающей R5RS, определение макроса может быть выполнено путем сопоставления с шаблоном в синтаксическом правиле, в этом случае зачем нам обратная кавычка?

Я изучаю некоторый очень простой lisp через emacs lisp, в elisp мы должны использовать много обратных цитат для написания макроса, но для схемы, которая поддерживает сопоставление с образцом, есть ли ситуации, в которых наличие обратных цитат может быть полезным?Или мне следует спросить, при каких обстоятельствах программист обычно использует кавычки, чтобы помочь им решить проблему?

Ответы [ 3 ]

0 голосов
/ 23 сентября 2018

Похоже, единственное время, когда мы составляем списки, - это создание кодаЭто не вариант.

Синтаксис обратной цитаты является просто синтаксическим сахаром для некоторых литералов и некоторых расширений.Поэтому вместо записи:

(list 'this 'is expr)

Вы можете написать

`(this is ,expr)

Они имеют практически одинаковый объектный код.Итак, чтобы ответить на ваш вопрос: в случае, если вы собираетесь создать список или дерево (списки списков), которые содержат части, которые являются литералами, а некоторые части, которые нет, использование backquote и unquote значительно упрощает код до чего-точто легче читать, что опять же уменьшает количество ошибок.

Кстати: поскольку syntax-rules имеет ограничения, в большинстве реализаций имеется хотя бы одна альтернативная система макросов, и она может иметь quasiquote unquote или даже специальную версию для синтаксиса.Из R6RS syntax-case имеет #` и #,.

0 голосов
/ 23 сентября 2018

Квазицитат (то есть обратная цитата) - это просто синтаксический 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, это даст вам хороший совет для начала.

0 голосов
/ 22 сентября 2018

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

`(ul (li "the first item")
     (li ,placeholder)
     (li "the third item"))
...