Не удается заставить pprint работать в clojure
Вопрос Noob, используя 64-разрядную версию Win7, Clojure 1.2.0, Java 1.6.0_22
Когда я запускаю Clojure из командной строки, функция pprint легко доступна.
user=> pprint
#<pprint$pprint [email protected]>
user=> (pprint "hi")
"hi"
nil
user=>
Но когда я пытаюсь использовать pprint из файла, я получаю сообщение об ошибке. Это происходит с и без пространства имен (ns...: require...), как показано в документации pprint
clj файл следующим образом:
(ns whatevah
(:require clojure.pprint))
(pprint "hi")
Ошибка:
C:\Users\mischw\code\Clojure>java -cp ";c:\users\mischw\code\clojure\classes\*;c:\Program Files (x86)\Java\SWT;c:\users\mischw\code\clojure\classes\bookcode\*" clojure.main swinglearn.clj
Exception in thread "main" java.lang.Exception: Unable to resolve symbol: pprint in this context (swinglearn.clj:14)
... 21 more
Output completed (0 sec consumed) - Normal Termination
Я не понимаю общей идеи о том, что происходит здесь. Почему одно работает, а не другое? Это связано с пространствами имен?? Пути к классам Некоторые другие простые исправления? Ясно, что вопросы noob, но я нахожу это случаем с кучей примеров... Я не могу запустить их, хотя кажется, что им просто нужно импортировать/использовать/требовать/включать их.
Ответы
Ответ 1
Вы получаете require
смешение с use
и/или import
. require
заставляет библиотеку загружаться, и каждый публичный символ, который он экспортирует, будет доступен, например, clojure.pprint/pprint
. Если вы хотите использовать более удобное имя, например просто pprint
, вам нужно refer
в пространство имен. use
является удобным сокращением для "require, then refer", для загрузки библиотеки без префикса пространства имен.
user> (ns user (:require clojure.pprint))
nil
user> (pprint 1)
; Evaluation aborted.
user> (clojure.pprint/pprint 1)
1
nil
user> (ns user (:use clojure.pprint))
nil
user> (pprint 1)
1
Изменить: Не знаете, почему он работает для вас из REPL. Как вы можете видеть, это не работает для меня. Я предполагаю, что вы сделали некоторую настройку раньше, что заставляет ее работать, а затем забывает об этом или, возможно, у вас есть init script, который делает это для вас в REPL, но не при загрузке из файла.
Ответ 2
Вот несколько примеров:
;; как использовать его с: require и: use
;; :require
(ns example.pprinter
(:require [clojure.pprint :as pp]))
(def myname "John Smith")
(pp/pprint myname)
;; :use
(ns example.pprinter
(:use clojure.pprint))
(def myname "John Smith")
(pprint myname)