2011-12-29 28 views
2
(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

目前還不清楚你想要用上面的代碼。如果你正在嘗試加載一個文本文件,並在可變稱爲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它在整個表達式之外。如果你只需要let內的from-file的功能,你可以得到一個更簡單的方法相同的結果:

(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")) 
+1

謝謝!我需要第二個變體(bootstrap-c-code) – Cynede 2011-12-30 04:00:53

+0

好!然後考慮傳遞「llvm.c」作爲函數的參數,而不是硬編碼,值 – 2011-12-30 04:03:38

+0

,但等待......它不起作用:(參考未定義的標識符:讀文本文件從輸入端口 – Cynede 2011-12-30 04:52:50

1

According to R5RS,內部定義只能在let,let *,lambda等一堆表單的開頭髮生。在你的代碼的情況下,情況並非如此,因爲你有一個內部定義非程序性的定義。你可以通過將`bootstrap-c-code'綁定到一個過程來修復它。

相關問題