2012-10-19 4 views
12

Ottenere un ambiente Emacs/Clojure attivo e funzionante, ora sto imbattendo in un comportamento che non sono sicuro sia normale. In particolare, quando avvio un nREPL e compilo (C-c C-k) il mio buffer, mi ritrovo in qualcosa di diverso dallo spazio dei nomi definito nella parte superiore del mio file core.clj. Dovrei aggiungere la dichiarazione di non responsabilità che sono un po 'nuovo per Clojure e namespace, e quindi la mia comprensione di tutto ciò potrebbe essere torbida. Sono aperto a risposte convinte che mi mostrano un modo migliore ™.nrepl.el e leiningen 2 namespace predefinito?

In primo luogo, per la mia messa a punto:

Il mio ambiente emacs è Cocoa Emacs 24, costituito per lo più con il kit d'avviamento emacs dal repository Melpa, con i Clojure e nrepl pacchetti aggiunti tramite il gestore di pacchetti.

Il mio progetto leiningen 2 è stato impostato utilizzando lein new test-clj.

mio 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"]]) 

mio 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))))) 

Io penso dovrei essere in grado di

  1. carico il mio core.clj e jack-in (M-x nrepl-jack-in)
  2. C-c C-k per caricare il buffer nel
  3. tipo REPL (mostra-shapefile) ed essere impressionato la mia intelligenza

In realtà, ottengo un errore che assomiglia clojure.lang.Compiler$CompilerException: java.lang.RuntimeException: Unable to resolve symbol: show-shapefile in this context, compiling:(NO_SOURCE_PATH:1)

Se, dal REPL I prima digito (in-ns `test-clj.core), sono d'oro. Inoltre, se digito (test-clj.core/show-shapefile) sono impostato.

Quando carico un REPL in senso antiorario, vengono automaticamente rilasciati nello spazio dei nomi clj.core, che sembra molto comodo.

La mia domanda quindi è duplice:

  1. È questo il comportamento corretto che sto vedendo? (io sono solo pigro?)
  2. C'è un modo per essere lasciato cadere in questo spazio dei nomi (o al contrario, dimmi che questa è un'idea stupida)?

risposta

12

solo un paio di modifiche al flusso di lavoro:

  1. carico la mia anima.lima CLJ e jack-in (Mx nrepl-jack-in)
  2. CcCl per caricare il file
  3. ccMn per commutare il repl allo spazio
  4. tipo (show-shapefile) ed essere impressionato dalla mia intelligenza

passaggio 2 compila il file, che crea lo spazio dei nomi
passaggio 3 è solo più breve di passare al repl e in esecuzione in-ns

+1

Ah, eccellente! Sembra che possa continuare a caricare anche il mio buffer corrente con 'C-c C-k'. Il 'C-c M-n' sembra essere la magia. A parte: come si ottengono le scorciatoie da tastiera emacs ben formattate nei commenti StackOverflow? – Peter

+1

CtrlAltDel

+0

Danke! Il mio google-fu apparentemente mancava nel trovarli. – Peter