Macros Racket宏可以接受关键字参数吗?

Macros Racket宏可以接受关键字参数吗?,macros,scheme,racket,keyword-argument,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) .

我想在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称之为“糟糕的语法”,所以很明显,这种尝试是不正确的


这可以做到吗?

语法模式中的关键字被视为与数字等文字相同的词,因此您不需要将它们指定为关键字。(这仅用于标识符。)因此,下面的工作(注意,我修复了您在第二个示例中的打字错误):


另请参阅,以获得一个更简单的实用程序。

尤其是
语法分析
文档提供了一个关于使用关键字参数编写宏的完整说明。
#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)