我想在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称这种“语法错误”,显然这种尝试不正确。
可以这样做吗?
答案 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更轻松的实用程序。