【问题标题】:Using clojure.contrib functions in slime REPL在 slime REPL 中使用 clojure.contrib 函数
【发布时间】:2010-05-18 04:45:41
【问题描述】:

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

【问题讨论】:

  • 您可能希望将 Michal 的答案标记为正确。
  • Tyler,您应该将 Michal 的答案标记为该问题的已接受答案,因为它似乎已经解决了您的问题。这样做不仅被认为是一种很好的形式,而且还可以提高您的声誉得分。只需单击问题分数附近的复选标记即可。

标签: clojure slime


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

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

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

    ns 表单的:require:use:refer 子句在clojure.core 中的requireuserefer 函数中有对应项。还有对应:refer-clojure:import的宏。

    这意味着为了使clojure.contrib.trace 在 REPL 中可用,您可以执行(require 'clojure.contrib.trace)(require '[clojure.contrib.trace :as trace]) 之类的操作。请注意,因为require 是一个函数,所以您需要引用库规范。 (userefer 也采用引用的库规范;importrefer-clojure 不需要引用。)

    每次启动 Clojure REPL 时(包括使用 SLIME 执行此操作时)使某些命名空间可用的最简单方法是将适当的 require 调用放入 ~/.clojure/user.clj。请参阅 John Lawrence Aspden 的 Requiring all possible namespaces 博客文章,了解您可能会在 user.clj 中添加的内容以引入 all 的 contrib(我个人不这样做,虽然我确实有(use 'clojure.contrib.repl-utils) 在那里)。

【讨论】:

  • 非常感谢!现在在 Emacs 中调试要容易得多。
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 2011-02-23
  • 1970-01-01
相关资源
最近更新 更多