![](/img/trans.png)
[英]clojure.contrib with slime and inferior-lisp-program question
[英]Using clojure.contrib functions in slime REPL
我想在REPL的slime中使用clojure.contrib.trace命名空間中的函數。 如何讓粘液自動加載? 一個相關的問題,如何將特定的命名空間添加到正在運行的repl中?
在clojure.contrib API上,它描述了這樣的用法:
(ns my-namespace
(:require clojure.contrib.trace))
但是將其添加到我的代碼會導致無法使用跟蹤命名空間中的任何函數加載“無法解析符號”錯誤的文件。
我使用leiningen'lein swank'啟動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"]])
一切似乎都是最新的,即'lein deps'不會產生任何變化。 那么這是什么一回事?
您將獲得“無法解析符號”異常,因為:require
不會從給定的命名空間中提取任何Vars,它只會使命名空間本身可用。
因此,如果您(:require foo.bar)
在ns
的形式,你必須寫foo.bar/quux
訪問瓦爾quux
從命名空間foo.bar
。 您也可以使用(:require [foo.bar :as fb])
將其縮短為fb/quux
。 最后的可能性是寫(:use foo.bar)
; 這使得命名空間中的foo.bar
所有Vars foo.bar
可用。 請注意,它通常被認為是不好的風格:use
外部庫; 但是,在一個項目中它可能還可以。
Re:自動在REPL上提供東西:
:require
, :use
和:refer
ns
表單的:refer
子句在clojure.core
中的require
, use
和refer
函數中有對應項。 還有一些宏對應於:refer-clojure
和:import
。
這意味着為了使clojure.contrib.trace
在REPL上可用,您可以執行類似(require 'clojure.contrib.trace)
或(require '[clojure.contrib.trace :as trace])
。 請注意,因為require
是一個函數,所以需要引用庫規范。 ( use
和refer
也引用引用的lib規范; import
和refer-clojure
不需要引用。)
每次啟動Clojure REPL時(包括使用SLIME執行此操作時)都可以使用某些命名空間的最簡單方法是在~/.clojure/user.clj
放入相應的require
調用。 請參閱John Lawrence user.clj
的“ 要求所有可能的命名空間博客文章”,以了解您可能會在user.clj
中提取所有內容的內容(我不做的事情,就個人而言,雖然我確實有(use 'clojure.contrib.repl-utils)
在那里)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.