2017-11-08 2 views
1

Wie kann ich testen, ob ein Syntaxmusterparameter eine leere Liste ist? Ich teste mich in List.Wie überprüft man, dass ein Makroparameter eine leere Liste in Syntax-Case ist?

(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) 

Allerdings, wenn ich gegen eine Reihe testen, funktioniert es:

(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) 

Antwort

1

Es scheint, dass es ein zusätzliches Zitat drin. Im Makro, sollten Sie die Prüfung wie folgt durchführen:

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

Oder als Problem zu umgehen, können Sie das Makro wie folgt aufrufen:

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

Vielen Dank, das war eine peinliche Geheimnis! –

Verwandte Themen