2012-04-10 71 views
8

我想在Racket中創建一個可以接受關鍵字參數的語法形式,就像一些函數一樣。Can Racket宏可以使用關鍵字參數嗎?

有它減少到一個簡單的例子,我試着寫:

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

使得下面會再工作:

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

不幸的是,球拍稱此爲「語法錯誤」,所以很明顯該嘗試不正確。

可以這樣做嗎?

回答

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) 

syntax-parse見一個實用工具,可以讓parsing keywords更容易。

+3

特別是,在使用關鍵字參數編寫宏時,'syntax-parse'文檔有一個完整的[section](http://docs.racket-lang.org/syntax/Optional_Keyword_Arguments.html)。 – 2012-04-10 18:51:21

+0

(呃,我忘了添加鏈接...) – 2012-04-10 19:17:23

相關問題