2011-03-11 8 views
16
pregunta

Noob, usando Win7 de 64 bits, Clojure 1.2.0, Java 1.6.0_22no puede conseguir pprint para trabajar en clojure

Cuando comienzo clojure de línea de comandos, la función pprint es fácilmente disponible.

user=> pprint 
#<pprint$pprint [email protected]> 
user=> (pprint "hi") 
"hi" 
nil 
user=> 

Pero cuando intento usar pprint de un archivo, aparece un error. Esto sucede con y sin espacio de nombres (NS ...: requiere ...) como se muestra en la documentación pprint

archivo clj de la siguiente manera:

(ns whatevah 
(:require clojure.pprint)) 

(pprint "hi") 

error de la siguiente manera:

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 

I no entiendo la idea general de lo que está pasando aquí. ¿Por qué funciona uno pero no el otro? ¿Eso tiene que ver con los espacios de nombres? Classpaths? ¿Alguna otra solución simple? Claramente, las preguntas de los novatos, pero me parece que esto sucede con un montón de ejemplos ... No puedo ejecutarlos a pesar de que parece sencillo importarlos/usarlos/exigirlos/incluirlos.

Respuesta

25

Obtiene require mezclado con use y/o import. require hace que la biblioteca se cargue, y todos los símbolos públicos que exporta serán accesibles, por ejemplo, clojure.pprint/pprint. Si desea utilizar un nombre más conveniente como pprint, necesita refer en el espacio de nombres. use es una abreviatura conveniente para "require, then refer", para cargar la biblioteca sin el prefijo del espacio de nombres.

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 

Editar: No estoy seguro de por qué funciona para usted de la REPL. Como puede ver, no funciona para mí. Me imagino que hiciste algo de configuración anterior que lo hace funcionar y luego lo olvidaste, o posiblemente tienes algún script de inicio que hace estas cosas por ti en el REPL pero no al cargar desde un archivo.

+0

impresionante, gracias, funcionó :). Sabía que era simple. Entonces, ¿por qué la réplica automáticamente 'use' clojure.pprint? ¿Cómo averiguo qué espacios de nombres ha cargado la réplica, así que la próxima vez que tenga este problema puedo resolverlo? – Sonicsmooth

+3

La réplica no hace eso automáticamente. Tienes algún script loco de repl-launching que lo hace por ti; Si entró en más detalles sobre cómo está lanzando su réplica, es posible que obtenga una respuesta. – amalloy

0

Aquí hay un par de ejemplos:

;; cómo usarlo con: requiere y: utilizar

;; :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) 
Cuestiones relacionadas