我想在REPL的slime中使用clojure.contrib.trace命名空间中的函数.如何让粘液自动加载?一个相关的问题,如何将特定的命名空间添加到正在运行的repl中?
在clojure.contrib API上,它描述了这样的用法:
(ns my-namespace
(:require clojure.contrib.trace))
Run Code Online (Sandbox Code Playgroud)
但是将其添加到我的代码会导致无法使用跟踪命名空间中的任何函数加载"无法解析符号"错误的文件.
我使用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"]])
Run Code Online (Sandbox Code Playgroud)
一切似乎都是最新的,即'lein deps'不会产生任何变化.那么这是什么一回事?
Mic*_*zyk 18
您将获得"无法解析符号"异常,因为:require它不会从给定的命名空间中提取任何Vars,它只会使命名空间本身可用.
因此,如果您(:require foo.bar)在ns表单中,则必须编写foo.bar/quux以quux从命名空间访问Var foo.bar.您也可以使用(:require [foo.bar :as fb])它来缩短它fb/quux.最后的可能性是写作(:use foo.bar); 这使得foo.bar命名空间中的所有Vars都可用.请注意,它通常被认为是:use外部库的不良风格; 但是,在一个项目中它可能还可以.
Re:自动在REPL上提供东西:
的:require,:use和:refer的条款ns形式有同行require,use和refer功能clojure.core.也有相应的宏: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执行此操作时),使用某些命名空间的最简单方法是将相应的require调用放入~/.clojure/user.clj.请参阅要求所有可能的命名空间由约翰·劳伦斯阿斯普登博客文章的你可以考虑加入一个描述user.clj在拉所有的contrib的(东西我不这样做,就个人而言,虽然我有一个(use 'clojure.contrib.repl-utils)在那里).