Frage

Ich habe Common Lisp-Makros geschrieben, so Scheme R5RS Makros ein bisschen unnatürlich zu mir sind. I denken ich auf die Idee kam, mit der Ausnahme, dass ich verstehe nicht, wie ein Vektor-Muster in der Syntax-Regeln verwenden würde:

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

Ich sehe nicht, wie ich einen Makro verwenden würde, der seine Argumente erfordert als Vektor geschrieben werden:

(mac #(1 2 3 4))
=>
1
4

Gibt es irgendeine Art von Technik, die diese Muster verwendet?

Danke!

War es hilfreich?

Lösung

Ein Makro möglicherweise nicht ihre Argumente erfordern als Vektor geschrieben wird, noch nützliches Verhalten, wenn sie sind. Das bemerkenswerteste Beispiel wäre wahrscheinlich 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)

Als ein anderes Beispiel, siehe Dieses Musterabgleich Paket , die auf passende Vektoren ermöglicht und somit verwendet Vektor-Muster in seinen Makrodefinitionen (auf dem verlinkten Seiten zusammen mit den Paket-Metadaten).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top