我一直试图找出错误,我正在做一种编程语言并有下一个代码,使用 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
我的问题: 为什么 IF 子句 LET 是假的? ¿我可以比较这两种类型并且没有 FOR 结果是真的吗?
关于函数的文档:
最佳答案
每段代码都在做完全不同的事情,我将向您展示如何让每段代码发挥作用。第一个使用 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 中,它们很难处理,请注意我是如何通过用竖线围绕它们来逃避它们的。
关于scheme - LISP clause for and clause let ¿why?, making a programming language in racket using ragg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37668088/