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

Tay*_*mon 11 macros scheme keyword-argument racket

我想在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) ...)]))
Run Code Online (Sandbox Code Playgroud)

这样以下就可以了:

(sum-of-products ([2 2] [3 3])) ? 13
(sum-of-products ([2 2] [3 3]) #:extra 5) ? 18
Run Code Online (Sandbox Code Playgroud)

不幸的是,Racket称这种"语法错误",显然这种尝试不正确.

可以这样做吗?

Eli*_*lay 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)
Run Code Online (Sandbox Code Playgroud)

另请参阅syntax-parse可以使解析关键字更容易的实用程序.

  • 特别是,`syntax-parse`文档在编写带有关键字参数的宏时有一个完整的[section](http://docs.racket-lang.org/syntax/Optional_Keyword_Arguments.html). (4认同)