2012-10-19 111 views
12

讓Emacs/Clojure環境啓動並運行,我現在遇到了我不確定的行爲是否正常。特別是,當我啓動一個nREPL並編譯(C-c C-k)我的緩衝區時,我被放入除core.clj文件頂部定義的命名空間之外的東西。我應該加上一個聲明,我對Clojure和命名空間有點新鮮,所以我對這一切的理解可能會很模糊。我願意向我展示一個更好的方式™的褒獎答案。nrepl.el和leiningen 2默認命名空間?

首先,關於我的設置:

我的emacs的環境是可可的Emacs 24,設置大多從Melpa庫emacs的入門工具包,通過包管理器添加的Clojure和nrepl包。

我的leiningen 2項目使用lein new test-clj設置。

project.clj

(defproject test-clj "0.1.0-SNAPSHOT" 
    :description "A geospatial test app example mostly ripped off from http://datamangling.com/blog/2010/05/26/geotools-quickstart-in-clojure/" 
    :repositories {"osgeo-geotools" "http://download.osgeo.org/webdav/geotools"} 
    :url "FIXME" 
    :license {:name "Eclipse Public License" 
      :url "http://www.eclipse.org/legal/epl-v10.html"} 
    :dependencies [[org.clojure/clojure "1.4.0"] 
       [org.geotools/gt-main "8.2"] 
       [org.geotools/gt-shapefile "8.2"] 
       [org.geotools/gt-epsg-hsql "8.2"] 
       [org.geotools/gt-swing "8.2"]]) 

core.clj

(ns test-clj.core 
    (:import [org.geotools.data CachingFeatureSource FeatureSource FileDataStore FileDataStoreFinder]) 
    (:import [org.geotools.map DefaultMapContext MapContext]) 
    (:import [org.geotools.swing JMapFrame]) 
    (:import [org.geotools.swing.data JFileDataStoreChooser])) 


(defn show-shapefile 
    "Prompts the user for a shapefile and displays its content" 
    [] 
    (if-let [shapefile (JFileDataStoreChooser/showOpenFile "shp" nil)] 
    (let [fs (.getFeatureSource (FileDataStoreFinder/getDataStore shapefile))] 
     (doto (DefaultMapContext.) 
     (.setTitle "Quickstart") 
     (.addLayer fs nil) 
     (JMapFrame/showMap))))) 

認爲我應該能夠

  1. 負載了我core.clj文件和玩偶(M-x nrepl-jack-in
  2. C-c C-k加載緩存到REPL
  3. 型(顯示-shape文件),並在我的聰明才智所折服

在現實中,我得到的,看起來像clojure.lang.Compiler$CompilerException: java.lang.RuntimeException: Unable to resolve symbol: show-shapefile in this context, compiling:(NO_SOURCE_PATH:1)錯誤

如果從REPL I第一種類型(in-ns`test-clj.core)中,我是黃金。另外,如果我輸入(test-clj.core/show-shapefile),我就設置好了。

當我在逆時針方向加載REPL時,我自動將其放入test-clj.core命名空間,這似乎很方便。然後

我的問題是雙重的:

  1. 這是不是我看到正確的行爲? (即我只是懶惰?)
  2. 有沒有辦法被放到這個命名空間(或者相反,告訴我這是一個愚蠢的想法)?

回答

12

只是一對夫婦的變化,以您的工作流程:

  1. 負載了我的核心。CLJ文件和插孔式(的Mx nrepl插孔式)
  2. 抄送加載文件
  3. 立方厘米到REPL切換到命名空間
  4. 類型( show-shapefile),並留下深刻的印象我的聰明

第2步編譯文件,它創建命名空間
步驟3只是短於切換到repl並運行in-ns

+1

啊,優秀!看起來我可以繼續使用'C-c C-k'加載我的當前緩衝區。 「C-C M-n」似乎是魔術。除此之外:如何在StackOverflow註釋中獲得格式良好的emacs鍵盤快捷鍵? – Peter

+1

CtrlAltDel

+0

Danke!我的google-fu顯然沒有找到那些。 – Peter