6

簡単な例を挙げると:

(define-macro-variable _iota 0) ; define-macro-variable does not really exist

(define-syntax (iota stx)
  (syntax-case stx ()
    ((iota)
     (let ((i _iota))
       (set! _iota (+ i 1))
       #`#,i))))

そのような与えられた:

(define zero (iota))
(define one-two-three (list (iota) (iota) (iota)))
(define (four) (iota))

以下はすべて に評価され#tます。

(equal? zero 0)
(equal? one-two-three '(1 2 3)) ; possibly in a different order
(equal? (four) 4)
(equal? (four) 4)
(equal? (four) 4)

define-macro-variable上記の例で想定されていることを実行する実際のラケット機能はありますか?

編集:

回避策を見つけました:

(define-syntaxes (macro-names ...)
  (let (macro-vars-and-vals ...)
    (values macro-bodies-that-nead-the-macro-vars ...)))

しかし、マクロ変数を使用するすべてのマクロを 1 つの式にする必要のないソリューションを希望します。

4

1 に答える 1

10

あなたはdefine-for-syntax(ラケットで)欲しいです。

(define-for-syntax _iota 0)

(define-syntax (iota stx)
  (syntax-case stx ()
    ((iota)
     (let ((i _iota))
       (set! _iota (+ i 1))
       #`#,i))))

(define zero (iota))
(define one-two-three (list (iota) (iota) (iota)))
(define (four) (iota))

(equal? zero 0)
(equal? one-two-three '(1 2 3))
(equal? (four) 4)
(equal? (four) 4)
(equal? (four) 4)

すべて true を生成します。

于 2013-08-14T18:05:36.700 に答える