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!

Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top