Ответ 1
-
Вы получаете исключение "Невозможно разрешить символ", потому что
:require
не вытягивает никакие Vars из данного пространства имен, это только делает доступным пространство имен.Таким образом, если вы
(:require foo.bar)
в формеns
, вам нужно написатьfoo.bar/quux
для доступа к Varquux
из пространства имен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)
там).