我想在 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
不会从给定的命名空间中提取任何变量,它只会使命名空间本身可用。
因此如果你(:require foo.bar)
在你的ns
表格,你必须写foo.bar/quux
访问变量quux
从命名空间foo.bar
。您还可以使用(:require [foo.bar :as fb])
能够将其缩短为fb/quux
。最后的可能性是写(:use foo.bar)
反而;这使得所有 Var 都来自foo.bar
在您的命名空间中可用。请注意,通常认为以下方式是不好的风格::use
外部库;不过,在单个项目中可能没问题。
-
回复:自动在 REPL 上提供可用的内容:
The :require
, :use
and :refer
的条款ns
表格中有对应的require
, use
and refer
功能于clojure.core
。还有对应的宏:refer-clojure
and :import
.
这意味着为了使clojure.contrib.trace
在 REPL 上可用,你可以做类似的事情(require 'clojure.contrib.trace)
or (require '[clojure.contrib.trace :as trace])
。请注意,因为require
是一个函数,您需要引用库规范。 (use
and refer
还采用引用的 lib 规格;import
and refer-clojure
不需要引用。)
每次启动 Clojure REPL(包括使用 SLIME 时)时让某些名称空间可用的最简单方法是放置适当的名称空间require
来电~/.clojure/user.clj
。请参阅需要所有可能的命名空间John Lawrence Aspden 撰写的博客文章,描述了您可以输入的内容user.clj
拉进来all的贡献(我个人不这样做,尽管我确实有(use 'clojure.contrib.repl-utils)
在那里)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)