假设我有一个宏(define/custom (name (arg type) ...) body ...)
扩展为(define (name arg ...) body ...)
. 这很容易。
现在,我不仅要允许(arg type)
作为参数传递,而且要简单地传递arg
. 好的,所以我写了第二个子句,将 where(define/custom (name arg ...) body ...)
扩展为(define (name arg ...) body ...)
. 也很容易。
但是有了这样的解决方案,要么所有参数都带有类型,要么都没有。我怎样才能允许在同一个语法列表(或任何...
所谓的)中混合这两个选项?我该怎么做,例如。(define/custom (name arg1 (arg2 type2)) #f)
适当扩展为(define (name arg1 arg2) #f)
? 直觉是使用辅助宏,它会扩展(helper a)
为a
、 和(helper (a b))
,a
并使(define/custom (name arg_or_arg+type ...) body ...)
扩展为(define (name (helper arg_or_arg+type) ...) body ...)
,但正如您可能知道并猜测到的那样,这是行不通的,因为define
扩展发生在helper
扩展之前。