Racket宏可以使用关键字参数吗?

时间:2012-04-10 18:31:37

标签: macros scheme racket keyword-argument

我想在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

不幸的是,Racket称这种“语法错误”,显然这种尝试不正确。

可以这样做吗?

1 个答案:

答案 0 :(得分:13)

句法模式中的关键字与数字等文字相同,因此您无需将它们指定为关键字。 (这需要标识符。)所以下面的工作(注意我修复了你在第二个例子中的拼写错误):

#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更轻松的实用程序。