2016-06-06 12 views
0

Ich habe lange versucht, den Fehler zu finden, ich mache eine Programmiersprache und habe den nächsten Code, mit ragg, ich habe eine Syntax-Objekt (resto ...), was eine Klammer als Daten hat, verwandeln ich dieses Syntax-Objekt zu einem Datum:LISP-Klausel für und Klausel lassen? Warum ?, Erstellen einer Programmiersprache in Schläger mit Ragg

(let ([i (syntax->datum #'(resto ...))]) 
      (display "Content i:") 
      (display i) 
      (if (eq? i (string->symbol "(})")) 
       (display "true") 
       (display "false") 
      ) 
    ) 

und der Ausgang ist:

Content: (}) 
false 

Aber wenn ich dies tun

(for ([i (syntax->datum #'(resto ...))]) 
    (displayln "Content:") 
    (displayln i) 
    (if (eq? i (string->symbol "}")) 
      (display "true") 
      (display "false") 
    ) 
    ) 

und der Ausgang ist:

Content: } 
true 

meine Frage: ¿WARUM DIE WENN KLAUSEL LET IST FALSCH? ¿WIE KANN ICH DIESE ZWEI TYPEN VERGLEICHEN UND DASS DAS ERGEBNIS WAHR OHNE DAS IST?

Dokumentation über Funktionen:

syntax->datum

+0

Vielleicht sollten Sie ein Beispiel der Eingabe, die Sie analysieren möchten, enthalten, ich habe das Gefühl, dass Sie das komplizierter als nötig tun. –

Antwort

1

Jedes Stück Code ist eine ganz andere Sache zu tun, werde ich Ihnen zeigen, wie jede einzelne Arbeit zu machen. Die erste let verwendet in eine Variable zurück die ganze Liste zuweisen von syntax->datum und danach vergleichen Sie sie gegen eine andere Liste (bessere Nutzung equal? für die Prüfung der Gleichheit, ist es allgemein):

(let ([i (syntax->datum #'(|}|))]) ; `i` contains `(})` 
    (display "Content i: ") 
    (displayln i) 
    (if (equal? i '(|}|)) ; a list with a single element, the symbol `}` 
     (displayln "true") 
     (displayln "false"))) 

Das zweite Stück Code ist for mit über jedes Element in einer Liste zu durchlaufen, bis sie das Symbol } finden:

(for ([i (syntax->datum #'(|}|))]) ; `i` contains `}` 
    (display "Content i: ") 
    (displayln i) 
    (if (equal? i '|}|) ; the symbol `}` 
     (displayln "true") 
     (displayln "false"))) 

Als Randbemerkung, haben Sie mit der Art und Weise wirst du sehr vorsichtig sein, alle diese geschweiften Klammern zu verarbeiten {} in Ihrem LAN Sie werden als normale Klammern () in Racket interpretiert und sie werden schwierig zu handhaben sein, merke, wie ich ihnen entkommen musste, indem ich sie mit vertikalen Balken umgab.