如何在语法大小写中检查宏参数是否为空列表?

时间:2017-11-08 15:41:22

标签: 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 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)

1 个答案:

答案 0 :(得分:1)

似乎那里有额外的报价。在宏中,您应该执行以下检查:

(if (null? (cadr (syntax->datum #'params))) ; access the actual list

或者作为解决方法,您可以像这样调用宏:

((mkl s () s) '(100 200)) ; quote was removed