Не могу заставить pprint работать в ближайшем будущем - PullRequest
17 голосов
/ 11 марта 2011

Вопрос Noob, используя Win7 64-bit, Clojure 1.2.0, Java 1.6.0_22

Когда я запускаю clojure из командной строки, функция pprint становится легко доступной.

user=> pprint
#<pprint$pprint clojure.pprint$pprint@16dfa45>
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

Я не понимаю общей идеи того, что здесь происходит. Почему один работает, а другой нет? Это имеет отношение к пространствам имен? ? Пути к классам Другое простое исправление? Ясно, что вопросы нуб, но я нахожу, что это происходит с кучей примеров ... Я не могу их запустить, хотя кажется, что импортировать / использовать / требовать / включать их просто.

Ответы [ 2 ]

26 голосов
/ 11 марта 2011

Вы получаете require, смешанный с use и / или import. require вызывает загрузку библиотеки, и каждый открытый символ, который она экспортирует, будет доступен, например, clojure.pprint/pprint. Если вы хотите использовать более удобное имя, например pprint, вам нужно refer в пространство имен. use - это удобное сокращение для загрузки библиотеки без префикса пространства имен.

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

0 голосов
/ 17 ноября 2017

Вот несколько примеров:

;; как его использовать с: 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)
...