2016-08-22 10 views
0

では動作しませんなぜ私は「」「他」ステートメントが使用されているそれ以外の場合は「場合」、与えられていない機能に適用するマクロ持ってしようとしています:、しかしこのマクロはラケット

(define-syntax-rule (myif condition body (body2 #f)) 
    (if (not body2) 
     (when condition body) 
     (if condition 
      body 
      body2))) 

(define x 15) 
(myif (> x 10) (println x)) 

にこれは動作していません。エラーは次のとおりです。

myif: use does not match pattern: 
    (myif condition body (body2 #f)) in: (myif (> x 10) (println x)) 

答えて

3

define-syntax-rulesオプションの引数を持つプロシージャのような引数を取りません。

(define-syntax-rule (myif condition body (body2 #f)) 
    ...) 

と同じです:有効な利用が(myif predicate consequence (alternative #f))だろうと、それは変身

(define-syntax myif 
    (syntax-rules() 
    [(myif condition body (body2 #f)) ...])) 

:あなたが実行する必要がありますコードを持ってしようとしているようだ

(if (not (alternative #f)) 
    (when predicate consequence) 
    (if predicate consequence (alternative #f))) 

コンパイル時間と拡張の一部ではないので、これは述語の前に代替を評価するためです。だから、関数がimlpementingと同じことをやって

(define-syntax myif 
    (syntax-rules() 
    [(_ predicate consequence alternative) (if predicate consequence alternative)] 
    [(_ predicate consequence) (when predicate consequence)]) 

EDIT

:それは単純化された構文を使用していない二つのパターンを持つしかし、あなたがやりたいことができ、syntax-rulesでは動作しません。代わりにマクロ。私は考えることができない特別な機能の実装はありません。 NB:これらのマクロについては、初心者です。

(define-syntax (myif stx) 
    (let ((lst (syntax->list stx))) 
    (if (= (length lst) 3) 
     #`(when #,@(cdr lst)) 
     #`(if #,@(cdr lst))))) 

lstの一部は、それがどこから来たの情報を持っている構文オブジェクトであることに注意してください。 `#, #,, and #,@は、`,、および,@のような構文です。

+0

これは(マクロではなく)関数としてどのように作成できますか? – rnso

+0

@mso 'if'は熱心な言語で決して機能することはできませんが、パターンマスティング構文規則の代わりに関数を使って構文を作成することがあります。私は例を追加しました。 – Sylwester

+0

私はmyif 'function'または 'procedure'(マクロまたは構文ではありません)を持っていました。(define myif condition body(body2 #f)).........)。出来ますか? – rnso

関連する問題