如何在syntax case中检查宏参数是否为空列表?

如何在syntax case中检查宏参数是否为空列表?,syntax,macros,scheme,Syntax,Macros,Scheme,如何测试语法模式参数是否为空列表?我在用诡计测试 (define-syntax mkl (lambda (x) (syntax-case x () [(_ var params code) (if (null? (syntax->datum #'params)); doesn't match anyway !!!??? #'(lambda (var) code) #'(lambda (var) (cons 1

如何测试语法模式参数是否为空列表?我在用诡计测试

(define-syntax mkl
  (lambda (x)
    (syntax-case x ()
      [(_ var params code)
       (if (null? (syntax->datum #'params)); doesn't match anyway !!!???
           #'(lambda (var) code)
           #'(lambda (var) (cons 1 code)))])))

;;; try: expecting: (100 200) but got: (1 100 200)
(display
  ((mkl s '() s) '(100 200)))
(newline)
但是,如果我针对一个数字进行测试,它会起作用:

(define-syntax mkl2
  (lambda (x)
    (syntax-case x ()
      [(_ var params code)
       (if (= (syntax->datum #'params) 0); matches OK
       #'(lambda (var) code)
       #'(lambda (var) (cons 1 code)))])))

;;; try: expecting: (100 200) and it works OK
(display
 ((mkl2 s 0 s) '(100 200)))
(newline)

看起来里面有一个额外的报价。在宏中,应执行如下检查:

(if (null? (cadr (syntax->datum #'params))) ; access the actual list
((mkl s () s) '(100 200)) ; quote was removed
或者,作为一种解决方法,您可以这样调用宏:

(if (null? (cadr (syntax->datum #'params))) ; access the actual list
((mkl s () s) '(100 200)) ; quote was removed

非常感谢,这是一个尴尬的谜!