Использование функций clojure.contrib в слизе REPL

Я хочу использовать функции в пространстве имен clojure.contrib.trace в slime на 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

  • Вы получаете исключение "Невозможно разрешить символ", потому что :require не вытягивает никакие Vars из данного пространства имен, это только делает доступным пространство имен.

    Таким образом, если вы (:require foo.bar) в форме ns, вам нужно написать foo.bar/quux для доступа к Var quux из пространства имен foo.bar. Вы также можете использовать (:require [foo.bar :as fb]), чтобы сократить это до fb/quux. Последней возможностью является написать (:use foo.bar); что делает все Vars из foo.bar доступными в вашем пространстве имен. Обратите внимание, что это обычно считается плохим стилем для :use внешних библиотек; это, вероятно, хорошо в рамках одного проекта.

  • Re: автоматическое создание материалов в REPL:

    В разделах :require, :use и :refer форм ns есть экземпляры в функциях require, use и refer в clojure.core. Существуют также макросы, соответствующие :refer-clojure и :import.

    Это означает, что для того, чтобы сделать clojure.contrib.trace доступным в REPL, вы можете сделать что-то вроде (require 'clojure.contrib.trace) или (require '[clojure.contrib.trace :as trace]). Обратите внимание, что поскольку require является функцией, вам нужно указать спецификацию библиотеки. (use и refer также принимают цитируемые спецификации lib; import и refer-clojure не требуют цитирования.)

    Самый простой способ иметь определенные пространства имен при каждом запуске Clojure REPL (в том числе, когда вы делаете это с SLIME), - это разместить соответствующие вызовы require в ~/.clojure/user.clj. См. Требование обо всех возможных пространствах имен в блоге Джона Лоуренса Аспдена для описания того, что вы можете положить в user.clj, чтобы вытащить весь вклад (что-то я не делаю, лично, хотя у меня есть (use 'clojure.contrib.repl-utils) там).