在Racket中,如何创建一个可以处理多个参数的语法规则?

时间:2016-10-10 17:20:06

标签: racket

很难在标题中说出问题。

(define-syntax func
  (syntax-rules ()
    ((func a b c (d e) ...) (cond ((and (not (empty? d)) (not (empty? e))) (+ d e))
                                  )
                            )
    )
  )

如果有人拨打(func a b c (1 1) (2 2)),我希望将所有de添加到一起。首先,我上面的代码产生错误

syntax: missing ellipsis with pattern variable in template in: d

如果它甚至没有给我这个错误,我甚至不确定它是否会将它们全部加在一起。如果没有提供de,我还希望它做其他事情,所以我把它放在cond中。

谢谢。

编辑:

(define-syntax func
  (syntax-rules ()
    ((func a b c (d e) ...)
     (cond
       ((and
         (not (empty? d))
         (not (empty? e)))
        (+ d e))))))

1 个答案:

答案 0 :(得分:1)

模式something ...将匹配零个或多个元素。因此,在您模式(func a b c)将符合规则。

如果模式中的模式有缺点,则需要在扩展中使用elipses。例如。

(define-syntax test
  (syntax-rules ()
    ((_ a b ...)
     (if a (begin #t b ...) #f))))

(test 1)    ; ==> #t
(test 1 2)  ; ==> 2
(test #f 2) ; ==> #f