6

私は Common Lisp マクロを書いてきたので、Scheme の R5Rs マクロは私にとって少し不自然です。シンタックスルールでベクトルパターンをどのように使用するか理解していないことを除いて、私はアイデアを得たと思います:

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

引数をベクトルとして記述する必要があるマクロを使用する方法がわかりません。

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

それらのパターンを使用する何らかのテクニックはありますか?

ありがとうございました!

4

1 に答える 1

1

マクロは、引数をベクトルとして記述する必要がない場合がありますが、ベクトルとして記述されている場合に便利な動作を提供します。最も顕著な例は、おそらく 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)

別の例として、このパターン マッチング パッケージを参照してください。これは、ベクターでのマッチングを可能にし、マクロ定義でベクター パターンを使用します (リンク先のページにパッケージ メタデータと共に含まれています)。

于 2010-04-01T03:35:19.253 に答える