Como os padrões de vetores são usados nas barras de sintaxe?
-
22-09-2019 - |
Pergunta
Eu tenho escrito macros Lisp comuns, portanto, as macros R5Rs do esquema são um pouco não naturais para mim. EU acho Eu tive a ideia, exceto que não entendo como alguém usaria padrões de vetores nas barras de sintaxe:
(define-syntax mac
(syntax-rules ()
((mac #(a b c d))
(let ()
(display a)
(newline)
(display d)
(newline)))))
(expand '(mac #(1 2 3 4))) ;; Chicken's expand-full extension shows macroexpansion
=> (let746 () (display747 1) (newline748) (display747 4) (newline748))
Não vejo como usaria uma macro que exige que seus argumentos sejam escritos como vetor:
(mac #(1 2 3 4))
=>
1
4
Existe algum tipo de técnica que usa esses padrões?
Obrigada!
Solução
Uma macro pode não exigir que seus argumentos sejam escritos como vetor, mas proporcionar comportamentos úteis para quando estão. O exemplo mais notável provavelmente seria Quasiquote:
;; a couple of test variables
(define foo 1)
(define bar 2)
;; vector literals in Scheme are implicitly quoted
#(foo bar) ; returns #(foo bar), i.e. a vector of two symbols
;; however quasiquote / unquote can reach inside them
`#(,foo ,bar) ; returns #(1 2)
Como outro exemplo, veja Este pacote de correspondência de padrões que permite a correspondência em vetores e, portanto, usa padrões de vetores em suas definições de macro (incluídas na página vinculada juntamente com os metadados do pacote).