Могут ли макросы 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)...)]))

Так, чтобы работало следующее:

(sum-of-products ([2 2] [3 3])) → 13
(sum-of-products ([2 2] [3 3]) #:extra 5) → 18

К сожалению, Racket называет это "плохим синтаксисом", поэтому очевидно, что эта попытка была неправильной.

Можно ли это сделать?

11
задан Taymon 10 April 2012 в 18:37
поделиться