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 #,@
は、`
、,
、および,@
のような構文です。
これは(マクロではなく)関数としてどのように作成できますか? – rnso
@mso 'if'は熱心な言語で決して機能することはできませんが、パターンマスティング構文規則の代わりに関数を使って構文を作成することがあります。私は例を追加しました。 – Sylwester
私はmyif 'function'または 'procedure'(マクロまたは構文ではありません)を持っていました。(define myif condition body(body2 #f)).........)。出来ますか? – rnso