Используя clojure.contrib функционирует в слизи REPL

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

На clojure.contrib API это описывает использование как это:

(ns my-namespace
  (:require clojure.contrib.trace))

Но добавление этого к моему коду приводит к неспособности файла загрузиться с "Не могущий разрешить символ" ошибка для любой функции от пространства имен трассировки.

Я использую leiningen 'lein чванство' для запуска 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' не вызывает изменений. Так что происходит?

14
задан Limpoch 18 May 2010 в 04:45
поделиться

1 ответ

  1. Вы получаете исключения «Невозможно разрешить символ», потому что : require не извлекает никаких переменных из заданного пространства имен, а только делает доступным само пространство имен.

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

  2. Re: автоматическое предоставление материалов в REPL:

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

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

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

18
ответ дан 1 December 2019 в 13:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: