读取文件:语法错误(标识符后面的多个表达式)

时间:2011-12-29 11:39:56

标签: scheme racket r5rs

(define bootstrap-c-code
    (define (from-file file-name)
       (let* ((ip (open-input-file file-name))
            (res (read-text-file-from-input-port ip)))
         (close-input-port ip)
         res))
    (from-file "llvm.c"))

错误:定义:错误的语法(标识符后面的多个表达式)

但我看不出有什么不妥。有人可以解释/解决它。

2 个答案:

答案 0 :(得分:1)

According to R5RS,内部定义只能出现在诸如let,let *,lambda等一堆形式的开头。对于你的代码,情况并非如此,因为你有一个内部非程序定义中的定义。您可以通过将`bootstrap-c-code'绑定到一个过程来修复它。

答案 1 :(得分:1)

目前尚不清楚您对上述代码的意图。如果您尝试加载文本文件并将加载的值保留在名为bootstrap-c-code变量中,请尝试以下操作:

(define bootstrap-c-code
  (let ((from-file
         (lambda (file-name)
           (let* ((ip (open-input-file file-name))
                  (res (read-text-file-from-input-port ip)))
             (close-input-port ip)
             res))))
    (from-file "llvm.c")))

当然,from-file定义只会在let内显示,如果你需要在外面使用它,define它在整个表达式之外。如果您只需要from-filelet的功能,则可以更简单的方式获得相同的结果:

(define bootstrap-c-code
  (let* ((ip  (open-input-file "llvm.c"))
         (res (read-text-file-from-input-port ip)))
    (close-input-port ip)
    res))

另一方面,如果您打算创建一个名为bootstrap-c-code过程,那么正确的语法将是:

(define (bootstrap-c-code)
  (define (from-file file-name)
    (let* ((ip (open-input-file file-name))
           (res (read-text-file-from-input-port ip)))
      (close-input-port ip)
      res))
  (from-file "llvm.c"))