LISP clause for and clause let ¿why?, making a programming language in racket using ragg

LISP clause for and clause let ¿why?,making a programming language in racket using ragg

我一直在试图找出错误,我正在做一种编程语言并有下一个代码,使用 ragg,我有一个 syntax-object(resto ...) 有一个括号作为数据,我将此语法对象转换为数据:

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

输出为:

Content: (})
false

但是如果我这样做

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

输出为:

Content: }
true

我的问题: 为什么 IF 子句 LET 是假的? ¿因为我可以比较这两种类型并且没有 FOR 结果是正确的?

关于函数的文档:

syntax->datum

每段代码都在做完全不同的事情,我将向您展示如何让每段代码发挥作用。第一个使用 letsyntax->datum 返回的整个列表分配给变量,然后将其与另一个列表进行比较(最好使用 equal? 来测试相等性,它更通用):

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

第二段代码使用 for 遍历列表中的每个元素,直到找到符号 }:

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

附带说明一下,您必须非常小心地处理所有这些花括号 {} 在您的语言中,它们被解释为普通括号 ()在 Racket 中,它们很难处理,请注意我是如何通过用竖线围绕它们来逃避它们的。