假设我有一个宏(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扩展之前。