Использование функций clojure.contrib в слизи REPL - PullRequest
14 голосов
/ 18 мая 2010

Я хочу использовать функции в пространстве имен clojure.contrib.trace в slime в REPL. Как я могу получить слизь, чтобы загрузить их автоматически? Смежный вопрос, как я могу добавить определенное пространство имен в работающую реплику?

В API clojure.contrib это описывает использование следующим образом:

(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 Ответ

18 голосов
/ 18 мая 2010
  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 внешних библиотек; это, вероятно, нормально в рамках одного проекта.

  2. 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. См. Требование о всех возможных пространствах имен в блоге Джона Лоуренса Аспдена (John Lawrence Aspden) для описания того, что вы могли бы вставить в user.clj, чтобы получить всех ресурса (что я не делаю, лично у меня там есть (use 'clojure.contrib.repl-utils)).

...