2010-05-18 66 views
14

我想在REPL的泥漿中使用clojure.contrib.trace命名空間中的函數。我怎樣才能讓史萊姆自動加載它們?一個相關的問題,我怎樣才能將一個特定的命名空間添加到正在運行的repl中?在泥漿中使用clojure.contrib函數REPL

在clojure.contrib API它描述了這樣的用法:

(ns my-namespace 
    (:require clojure.contrib.trace)) 

但在文件中添加以下內容到我的代碼的結果無法與「無法解析的符號」錯誤加載從任何功能跟蹤命名空間。

我用leiningen「雷音自吹」開始的ServerSocket和project.clj文件看起來像這樣

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

一切似乎是最新的,即「雷音的DEP」不會產生任何變化。那麼這是什麼一回事?

+1

您可能想要將Michal的答案標記爲正確。 – 2010-05-21 16:57:34

+1

Tyler,你應該把Michal的答案標記爲這個問題上的接受答案,因爲它似乎解決了你的問題。這樣做不僅是一種好的形式,它還可以讓你的聲譽得到一點提升。只需點擊問題評分附近的複選標記即可。 – 2010-11-29 13:17:41

回答

18
  1. 你得到「無法解析符號」異常,因爲:require不以任何瓦爾從給定的命名空間拉,它只會讓命名空間本身可用。

    因此,如果你在你的ns形式(:require foo.bar),你必須寫foo.bar/quux從命名空間foo.bar訪問瓦爾quux。您也可以使用(:require [foo.bar :as fb])將其縮短爲fb/quux。最後的可能性是寫(:use foo.bar),而不是;這使得您的命名空間中可以使用來自foo.bar的所有變量。請注意,:use外部庫通常被認爲是不好的風格;儘管在單個項目中可能沒有問題。

  2. 回覆:自動製作可在REPL的東西:

    ns形式:require:use:refer條款不得不在requireuserefer功能同行clojure.core。還有對應於:refer-clojure:import的宏。

    這意味着,爲了使REPL上的clojure.contrib.trace可用,您可以執行類似(require 'clojure.contrib.trace)(require '[clojure.contrib.trace :as trace])的操作。請注意,因爲require是一個函數,所以需要引用庫規範。 (userefer也採取引述LIB規格; importrefer-clojure不需要引用。)

    有一定的命名空間可在每次啓動一個Clojure的REPL時間(包括當你用泥做的)最簡單的方法是將在~/.clojure/user.clj中調用適當的require調用。請參閱John Lawrence Aspden的Requiring all possible namespaces博客文章,瞭解您可能會在user.clj中插入的所有(我不這麼做,但我個人確實有(use 'clojure.contrib.repl-utils))。

+0

非常感謝!在Emacs中調試現在更容易。 – Limpoch 2010-05-18 15:35:08