Scheme 方案定义错误(短)

Scheme 方案定义错误(短),scheme,racket,r5rs,Scheme,Racket,R5rs,这是我正在制作的口译员的一部分。我不断地发现这个错误: define not allowed in an expression context in: (define ret1 (list->string wl)) 我使用的是DrScheme版本371,语言标准(R5RS) 类似问题如下: (定义repl( lambda() (显示“\nUofL>”) (定义inp(读取命令)) (define lengtha(length com)在您的解释器中,定义似乎只能出现在函数的开头。您应该

这是我正在制作的口译员的一部分。我不断地发现这个错误:

define not allowed in an expression context in: (define ret1 (list->string wl))
我使用的是DrScheme版本371,语言标准(R5RS)

类似问题如下:

(定义repl(
lambda()
(显示“\nUofL>”)
(定义inp(读取命令))

(define lengtha(length com)
在您的解释器中,定义似乎只能出现在函数的开头。您应该使用
let*

(define (read-command)
  (let* ((com '('())) ; are you sure you didn't mean '(()) ?
         (wl (read-as-list))
         (ret1 (list->string wl)))
  (commRead ret1)))
对于第二个问题,请尝试以下操作:

(define repl
  (lambda ()
    (display "\nUofL>")
    (let ((inp (read-command))
          (lengtha (length com)))
      ; return a value here
      )))

作为旁注,您的代码似乎是以过程式的方式编写的—所有这些
都设置了!
并执行了函数调用。如果您不将
ret1
作为参数传递给
commRead
,那么它到底会被修改吗?我建议您阅读一本关于Scheme编程的好书,并开始在上编写代码更具功能性的风格是,目前您的代码不是惯用的,您迟早会遇到麻烦。

您到底为什么要使用371版?这已经快五年了!最新版本是6.1.1,现在称为。啊,好吧,我这里有一个小问题(定义repl(lambda()(display“\nUofL>”)(define inp(read command))(define lengtha(length com)刚刚做了,你能帮我编辑一下这个例子吗。解决方法是一样的:停止在函数中使用
define
,而是在开始时使用
let*
来声明局部变量。这给了我错误;let*:bad语法(不是标识符序列--表达式绑定)位于:inp@zero6142好的,我编辑了我的答案。但说真的,你们必须读一本好书或是一本教程,这是基本方案。
(define repl
  (lambda ()
    (display "\nUofL>")
    (let ((inp (read-command))
          (lengtha (length com)))
      ; return a value here
      )))