2017-11-08 10 views
1

構文パターンパラメータが空リストであるかどうかをテストするにはどうすればよいですか?私は狡猾でテストしています。マクロパラメータがsyntax-case内の空のリストであることを確認する方法はありますか?

(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

そこに余分な引用があることが表示されます。

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

するか、回避策として、次のようなマクロを呼び出すことができます:マクロでは、このようにチェックを実行する必要があり

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

おかげでそんなに、これは厄介な謎でしたの! –

関連する問題