2012-08-11 68 views
1

我在Windows XP(JVM = 1.6.0)上使用Clojure 1.4.0。我的clojure函數在repl中定義時起作用,但在從腳本中加載時不起作用

我的help.clj腳本包含我覺得很有用的Clojure代碼片段。

在Clojure repl我可以從當前目錄(load-file "help.clj")訪問它。

試圖看中我寫(defn clojure-help [] (load-file "help.clj"))。現在一個簡單的(clojure-help)加載它。

然後我試着把clojure-help函數放入我使用的repl啓動腳本中。

但現在要求(clojure-help)導致以下異常:

CompilerException java.lang.RuntimeException: Unable to resolve symbol: clojure-help in this context

我缺少什麼?

+0

你的啓動腳本是什麼樣的?你如何開始repl?它看起來像'defn'根本不被評估。 – opqdonut 2012-08-11 20:13:01

+0

這是我的啓動腳本'prompt.clj' - > '(defn my-prompt [](printf「\ n [%s]>」(ns-name * ns *))) (defn p1 [] (clojure.main/REPL:提示我的提示符)) (P1) (DEFN閉合幫助[](負載文件 「help.clj」))' 它開始在命令行上。 'java -cp clojure-1.4.0.jar clojure.main prompt.clj''my-prompt'函數可以正常工作。 – exbctel 2012-08-11 21:43:10

+0

對不起大家。我用's'拼寫'clojure'('closure'!) – exbctel 2012-08-11 21:58:16

回答

2

感謝您在上述評論中發佈代碼!沒有代碼,就不可能知道實際發生了什麼。製作一個簡單的改變似乎來解決這個問題:

(defn my-prompt [] (printf "\n[%s]> " (ns-name *ns*))) 

(defn p1 [] (clojure.main/repl :prompt my-prompt)) 

(defn clojure-help [] (load-file "help.clj")) 

(p1) 

的變化是移動(p1)調用腳本的年底。如果調用不在腳本的末尾,那麼在評估腳本中的其餘功能之前,Clojure會放入REPL中,因此它們在REPL中不可用。由於clojure-help被定義爲之後(p1)調用腳本,直到退出REPL之後纔會對其進行評估。

+0

感謝DaoWen,解決了它。我對Clojure很陌生,所以你的建議非常有價值。我習慣Python,編譯順序並不那麼重要。 – exbctel 2012-08-13 00:14:23

+0

@exbctel - 我很高興你決定嘗試Clojure!由於Clojure和Python都是逐行編譯/解釋的,所以我非常確定代碼類似於上面的代碼,也會導致Python中的錯誤。當我運行'print f()<> def f():return 5'時,它會拋出一個錯誤,說'f'沒有被定義。相比之下,Java在編譯時會執行兩次遍歷代碼以執行前向解析,因此調用稍後在文件中聲明的方法不是問題。 – DaoWen 2012-08-13 03:00:36

1

如果你不使用REPL來加載其他腳本,你可以做這樣的事情:

clojure --init replstartup.clj --repl 

凡replstartup.clj會包含您的封閉,幫助功能。

或者,您可以創建一個批處理文件,命名爲clojure-repl.bat(或者其他類似的東西),看起來像這樣。

@echo off 
java -cp %userprofile%\clojure-1.4.0.jar clojure.main --init repl-startup.clj --repl 
@echo on 
相關問題