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

标签 scheme lisp racket dr.racket

我一直试图找出错误,我正在做一种编程语言并有下一个代码,使用 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 结果是真的吗?

关于函数的文档:

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 中,它们很难处理,请注意我是如何通过用竖线围绕它们来逃避它们的。

关于scheme - LISP clause for and clause let ¿why?, making a programming language in racket using ragg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37668088/

相关文章:

ide - 适用于 Windows 的方案 IDE

clojure - 学习一种 Lisp 有助于学习另一种吗?

emacs - 在 emacs 中运行 Chicken计划

lisp - 抑制 Lisp 中打印函数的输出

list - 如何附加到方案中的列表?

lisp - 方案:关于条件

linux - 如何在 Ubuntu 8.10 中为 6.001 设置 MIT Scheme

scheme - Racket 中的各种续传

macros - 诡计在 Racket 中的程序来源?

scheme - 在Scheme中使用cons、list、append