clojure - 在 Slime REPL 中使用 clojure.contrib 函数

标签 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' 不会产生任何变化。那么这是什么一回事?

最佳答案

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

    因此,如果您 (:require foo.bar)在您的 ns表格,你必须写foo.bar/quux访问 Var quux来自命名空间 foo.bar .您也可以使用 (:require [foo.bar :as fb])能够将其缩短为 fb/quux .最后一种可能是写 (:use foo.bar)反而;这使得来自 foo.bar 的所有 Vars在您的命名空间中可用。请注意,通常认为 :use 的风格不好外部图书馆;不过,在单个项目中可能没问题。
  • 回复:自动在 REPL 上提供可用的东西:
    :require , :use:refer ns的条款表格在 require 中有对应, userefer clojure.core 中的函数.也有对应的宏: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 .见 Requiring all possible namespaces约翰·劳伦斯·阿斯普登 (John Lawrence Aspden) 的博客文章,描述了您可能会放入的内容 user.clj拉入所有的贡献(我个人不做的事情,尽管我确实有一个 (use 'clojure.contrib.repl-utils))。
  • 关于clojure - 在 Slime REPL 中使用 clojure.contrib 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2854618/

    相关文章:

    memory - 程序拒绝持续消耗内存

    arrays - 在 Clojure 中优化数组变异

    clojure - 我可以从同一映射中的另一个值引用 clojure hashmap 值吗?

    clojure - 为什么我的代码打印不出来?

    emacs - Clojure 导入与 :import

    namespaces - 在 clojure 中,如何取消命名空间中的 var 定义?

    lisp 作为 shebang 脚本与在 SLIME 中运行的 lisp

    emacs - windows下无法用emacs + sbcl启动slime

    emacs - SLIME 和 Quicklisp 相处得不好

    clojure - 在 Clojure 中使用元数据创建相互递归的局部函数