Uso delle funzioni clojure.contrib di melma REPL
Domanda
Voglio utilizzare le funzioni nello spazio dei nomi clojure.contrib.trace nella melma al REPL. Come posso ottenere melma per caricare automaticamente? Una questione collegata, come posso aggiungere una specifica namespace in una repl in esecuzione?
Al API clojure.contrib che descrive l'utilizzo in questo modo:
(ns my-namespace
(:require clojure.contrib.trace))
Ma l'aggiunta di questo per i miei risultati di codice nel file di essere in grado di caricare con "Impossibile risolvere il simbolo" di errore per qualsiasi funzione dallo spazio dei nomi traccia.
Io uso Leiningen 'Lein Swank' per avviare il ServerSocket e gli sguardi dei file project.clj come questo
(defproject test-project "0.1.0"
:description "Connect 4 Agent written in Clojure"
:dependencies [[org.clojure/clojure "1.2.0-master-SNAPSHOT"]
[org.clojure/clojure-contrib "1.2.0-SNAPSHOT"]]
:dev-dependencies [[leiningen/lein-swank "1.2.0-SNAPSHOT"]
[swank-clojure "1.2.0"]])
Tutto sembra fino ad oggi, vale a dire 'Lein dipendenze' non produce alcuna modifica. Allora, cosa succede?
Soluzione
-
Stai diventando "Impossibile risolvere il simbolo" eccezioni perché
:require
non tirare in alcun Vars dalla data namespace, rende lo spazio dei nomi per sé solo.Pertanto, se si
(:require foo.bar)
nel modulons
, bisognafoo.bar/quux
scrittura per accedere alquux
Var dallafoo.bar
namespace. È inoltre possibile utilizzare(:require [foo.bar :as fb])
essere in grado di abbreviare tale afb/quux
. Un possiblity finale è(:use foo.bar)
scrittura invece; che fa la Vars dafoo.bar
disponibile nello spazio dei nomi. Si noti che è generalmente considerato un cattivo stile di:use
librerie esterne; è probabilmente ok all'interno di un unico progetto, però. -
Re: rendere automaticamente roba disponibili al REPL:
Le clausole
:require
,:use
e:refer
delle formens
hanno controparti nelle funzionirequire
,use
erefer
inclojure.core
. Ci sono anche le macro corrispondenti a:refer-clojure
e:import
.Ciò significa che, al fine di rendere disponibili al
clojure.contrib.trace
REPL si può fare qualcosa di simile(require 'clojure.contrib.trace)
o(require '[clojure.contrib.trace :as trace])
. Si noti che a causarequire
è una funzione, è necessario citare la specifica libreria. (use
erefer
anche prendere citati lib specifiche;.import
erefer-clojure
non richiedono citando)Il modo più semplice per avere alcuni spazi dei nomi disponibili ogni volta che si lancia un Clojure REPL (anche quando lo si fa con SLIME) è quello di mettere le chiamate
require
appropriate in~/.clojure/user.clj
. Vedere la richiedono tutti i possibili spazi dei nomi post sul blog di John Lawrence Aspden per una descrizione di quello che si potrebbe mettere inuser.clj
di tirare in tutti di contrib (cosa che non faccio, personalmente, anche se ho un(use 'clojure.contrib.repl-utils)
in là).