Подтвердить что ты не робот

Не удается заставить 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, но я нахожу это случаем с кучей примеров... Я не могу запустить их, хотя кажется, что им просто нужно импортировать/использовать/требовать/включать их.

4b9b3361

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