如何测试语法模式参数是否为空列表?我在诡计中测试。
(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)
答案 0 :(得分:1)
似乎那里有额外的报价。在宏中,您应该执行以下检查:
(if (null? (cadr (syntax->datum #'params))) ; access the actual list
或者作为解决方法,您可以像这样调用宏:
((mkl s () s) '(100 200)) ; quote was removed