nrepl.el和leiningen 2默认命名空间?

时间:2012-10-19 22:10:45

标签: emacs clojure leiningen

启动并运行Emacs / Clojure环境,我现在遇到的行为我不确定是否正常。特别是,当我启动一个nREPL并编译(C-c C-k)我的缓冲区时,我会被放入除core.clj文件顶部定义的命名空间之外的其他内容。我应该添加免责声明,我对Clojure和名称空间有点新,所以我对这一切的理解可能是模糊的。我愿意接受那些能够向我展示Better Way™的自以为是的答案。

首先,关于我的设置:

我的emacs环境是Cocoa 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文件和jack-in(M-x nrepl-jack-in
  2. C-c C-k将缓冲区加载到REPL中
  3. 键入(show-shapefile)并对我的聪明才智留下深刻印象
  4. 实际上,我收到的错误看起来像clojure.lang.Compiler$CompilerException: java.lang.RuntimeException: Unable to resolve symbol: show-shapefile in this context, compiling:(NO_SOURCE_PATH:1)

    如果,从REPL我第一次输入(in-ns`test-clj.core),我是金色的。另外,如果我输入(test-clj.core / show-shapefile),我就设置了。

    当我在逆时针加载REPL时,我会自动进入test-clj.core命名空间,这看起来很方便。

    我的问题是双重的:

    1. 这是我看到的正确行为吗? (即我只是懒惰?)
    2. 有没有办法放入这个命名空间(或者相反,告诉我这是一个愚蠢的想法)?

1 个答案:

答案 0 :(得分:12)

只需对您的工作流程进行一些更改:

  1. 加载我的core.clj文件和jack-in( M-x nrepl-jack-in)
  2. C-c C-l 加载文件
  3. c-c M-n 将repl切换到命名空间
  4. 键入(show-shapefile)并对我的聪明才智留下深刻印象
  5. 第2步编译文件,创建命名空间
    第3步比切换到repl并运行in-ns

    更短