2016-10-21 75 views
1

例如,在我的main.scm文件中,我有(load "util.scm")util.scm是與main.scm相同的文件夾中的文件。這兩個文件位於~/documents/myproject/如何導入相對於主文件而不是當前目錄的文件? ((Chez)Scheme)

現在,當我在這個目錄中,我運行$ chez-scheme main.scm一切工作正常。但是,如果我在我的主目錄並運行$chez-scheme documents/myproject/main.scm它抱怨,無法找到文件util.scm。我想這是因爲當前目錄是我的相關主目錄,因此util.scm確實不存在,它實際上是在documents/myproject/。這就是說,我用(用其他語言)相對於包含要導入的指令的文件來查看這些路徑的功能,並且我也希望在這裏有。我已經試過在./前面加上前綴,或者將文件定義爲庫文件並執行(import (util)),但它們都不在documents/myproject/之外。有什麼方法可以讓我按照我的意圖工作?

我認爲這是Chez-Scheme特有的。如果不是,我更喜歡一個與實現無關的答案。

回答

1

load在R5RS中有些尷尬,因爲報告指出系統界面在報告中是脫離主題的,但它們包括load這是一個半心半意的解決方案。該報告沒有說明load是否相對於當前目錄或load表單源自的文件,因此爲了便於攜帶,我想您需要從當前目錄運行腳本,並將加載的文件與兩者相關。

由於Chez Scheme實現R6RS load並不是真正正確的使用形式。 R6RS刪除load有利於圖書館。你應該讓你的文件成爲一個庫,並諮詢如何安裝它。在一些只需將文件放在正確路徑中的系統中,在配置中添加庫位置或運行安裝腳本。在所有實現中,使用庫的方式都是相同的,通過使用import

根據Chez documentation,你可以通過--libdirs給它一個或多個路徑來考慮加載庫。您可以通過評估來看到它掃描的路徑(library-directories)

0

有幾種不同的方式可以完成您想要做的事情(我認爲),但最終他們都歸結爲讓Chez知道在哪裏尋找東西。當給定相對路徑時,includeload使用source-directories參數來搜索請求的文件。當它們被加載或編譯時,庫的路徑會自動添加到source-directories,所以如果您的main.scm是庫定義,那麼它會按照您的預期找到util.scm

但是,聽起來好像main.scm不是圖書館,它是一個頂級程序。遺憾的是,Chez沒有命令行選項來設置source-directories,就像它對庫目錄所做的那樣。這讓你的靈活性稍差。以下任意一項都可以工作:

  • util.scm圖書館和調用切斯與--libdirs選項,讓它知道到哪裏尋找庫。
  • 設置source-directories並從REPL內部加載main.scm而不是從命令行。
  • 編寫一個封裝外殼腳本,通過將命令回顯到scheme來完成上述操作,因此您不必親自輸入。 (只有在您不需要輸入計劃會話的情況下才適用)。
  • 在運行scheme(假設完成後大概cd s回到原始目錄)之前,將包裝程序腳本寫入您的項目目錄中。
相關問題