0

我一直在试图找到错误,我正在做一种编程语言并有下一个代码,使用 ragg,我有一个语法对象(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

我的问题: ¿ 为什么 LET 的 IF 是错误的?¿ 我可以比较这两种类型,如果没有 FOR,结果是否正确?

关于函数的文档:

语法->数据

4

1 回答 1

1

每段代码都在做非常不同的事情,我将向您展示如何使每段代码工作。第一个用于let将返回的整个列表分配给一个变量syntax->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 中被解释为普通括号,并且它们很难处理,请注意我是如何处理的通过用竖条包围它们来逃避它们。

于 2016-06-07T02:13:21.660 回答