14

我想在 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”不会产生任何变化。那么这是什么一回事?

4

1 回答 1

18
  1. 您会收到“无法解析符号”异常,因为:require不会从给定的命名空间中提取任何 Var,它只会使命名空间本身可用。

    因此,如果您(:require foo.bar)在您的ns表单中,您必须写入以从命名空间foo.bar/quux访问 Var 。您也可以使用能够将其缩短为. 最后一种可能是改写;这使您的命名空间中的所有变量都可用。请注意,对于外部库,它通常被认为是不好的风格;不过,在单个项目中可能没问题。quuxfoo.bar(:require [foo.bar :as fb])fb/quux(:use foo.bar)foo.bar:use

  2. 回复:自动在 REPL 上提供可用的东西:

    形式的:require,:use:refer子句在,和中ns具有对应的功能。还有对应于和的宏。requireusereferclojure.core:refer-clojure:import

    这意味着为了clojure.contrib.trace在 REPL 上可用,您可以执行类似(require 'clojure.contrib.trace)(require '[clojure.contrib.trace :as trace]). 请注意,因为require是一个函数,所以您需要引用库规范。(use并且refer还采用引用的库规范;import并且refer-clojure不需要引用。)

    每次启动 Clojure REPL 时(包括使用 SLIME 执行此操作时)使某些命名空间可用的最简单方法是将适当的require调用放入~/.clojure/user.clj. 请参阅John Lawrence Aspden的要求所有可能的名称空间user.clj博客文章,了解您可能会放入什么来拉入所有contrib(我个人不这样做,虽然我确实有一个(use 'clojure.contrib.repl-utils))。

于 2010-05-18T05:27:42.753 回答