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