在slime REPL中使用clojure.contrib函数

时间:2010-05-18 04:45:42

标签: clojure slime

我想在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'不会产生任何变化。怎么了?

1 个答案:

答案 0 :(得分:18)

  1. 您收到“无法解析符号”异常,因为: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外部库通常被认为是不好的样式;但是,在一个项目中,它可能还可以。

  2. Re:在REPL自动提供内容:

    :require表单的:use:referns条款与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(包括使用SLIME执行此操作时)时,使用某些命名空间的最简单方法是在require中放置相应的~/.clojure/user.clj调用。请参阅John Lawrence Aspden撰写的Requiring all possible namespaces博客文章,了解您可能会在user.clj中提取所有的贡献(我个人不会做的事情)虽然我的确有(use 'clojure.contrib.repl-utils)