12

我想在 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 将此称为“错误语法”,因此显然这种尝试是不正确的。

这可以做到吗?

4

1 回答 1

15

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

#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可以使解析关键字更容易的实用程序。

于 2012-04-10T18:38:50.273 回答