2015-04-02 50 views
-1

这是我正在做的解释器的一部分。我不断收到此错误:方案定义错误(短)

define not allowed in an expression context in: (define ret1 (list->string wl)) 

我使用DrScheme版本371,语言标准(R5RS)。

(define (read-command) 
    (set! com '('())) 
    (set! wl (read-as-list)) 
    (define ret1 (list->string wl)) 
    (commRead) 
    ret1 
) 

类似的问题在这里:

(define repl(
 
       lambda() 
 
        (display "\nUofL>") 
 
        (define inp (read-command)) 
 
        (define lengtha (length com)

+1

为什么你在地球上使用371版本?这差不多五年了!最新版本是6.1.1,现在称为[球拍](http://racket-lang.org/)。 – 2015-04-02 20:19:27

回答

1

在你的解释,似乎定义只能出现在函数的开始。您应该使用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 
    ))) 

作为一个侧面说明,你的代码似乎是写在一个程序性的风格 - 与所有这些set!和为特效执行的函数调用。如果您不将它作为commRead的参数传递给ret1,该如何修改?我建议你阅读一本关于Scheme编程的好书,并开始以更实用的风格编写代码,目前你的代码不是惯用的,你迟早会遇到麻烦。

+0

谢谢,类似 – zero6142 2015-04-02 20:27:51

+0

啊好吧,我有一个smilar问题在这里(定义REPL( 拉姆达() (显示 “\ nUofL>”) (定义INP(读指令)) (定义lengtha(长度COM) – zero6142 2015-04-02 20:32:19

+0

刚刚做了,你能帮助编辑示例: – zero6142 2015-04-02 20:34:55