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