2012-04-10 18 views
8

私は、キーワード引数を受け入れることができる構文形式をRacketで作成したいと思います。ラケットマクロはキーワード引数を取ることができますか?

は、単純な例にそれを縮小したので、私は書き込みを試してみました:

(sum-of-products ([2 2] [3 3])) → 13 
(sum-of-products ([2 2] [3 3]) #:extra 5) → 18 

は残念ながら、ラケットはそう明らかに、この「不正な構文」を呼び出します。以下は、その後、仕事であろうと、このような

(define-syntax sum-of-products 
    (syntax-rules (#:extra) 
    [(sum-of-products ([a b] ...)) 
    (+ (* a b) ...)] 
    [(sum-of-products ([a b] ...) #:extra extra) 
    (+ extra (* a b) ...)])) 

をその試行は正しくありませんでした。

これはできますか?

答えて

12

構文パターンのキーワードは、数字などのリテラルと同じように扱われるため、キーワードとして指定する必要はありません。 (これは、識別子のための唯一のを必要としています。)したがって、次の作品(私はあなたが第二の例では持っていた誤植を修正していることに注意してください):

#lang racket 
(define-syntax sum-of-products 
    (syntax-rules() 
    [(sum-of-products ([a b] ...)) 
    (+ (* a b) ...)] 
    [(sum-of-products ([a b] ...) #:extra extra) 
    (+ extra (* a b) ...)])) 
(sum-of-products ([2 2] [3 3])) 
(sum-of-products ([2 2] [3 3]) #:extra 5) 

parsing keywordsを容易にすることができますユーティリティのためにもsyntax-parse参照してください。

+3

特に、 'syntax-parse'ドキュメントにはキーワード引数を持つマクロを書く際の[section](http://docs.racket-lang.org/syntax/Optional_Keyword_Arguments.html)があります。 –

+0

(うわー、そのリンクを追加するのを忘れた...) –

関連する問題