2011-03-11 14 views
16

Noob सवाल में काम करने के लिए,, Win7 64-बिट का उपयोग कर Clojure 1.2.0, जावा 1.6.0_22clojure

pprint प्राप्त नहीं कर सकते मैं कमांड लाइन से clojure शुरू, pprint समारोह आसानी से उपलब्ध है।

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

लेकिन जब मैं किसी फ़ाइल से पप्रिंट का उपयोग करने का प्रयास करता हूं, तो मुझे एक त्रुटि मिलती है। इस के साथ और नाम स्थान के बिना होता है (एनएस ...: की आवश्यकता होती है ...) के रूप में 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 

मैं यहां क्या हो रहा है सामान्य विचार समझ में नहीं आता है। एक काम क्यों करता है लेकिन दूसरा नहीं? क्या उन्हें नेमस्पेस के साथ क्या करना है? Classpaths? कुछ और सरल फिक्स? स्पष्ट रूप से नोब प्रश्न, लेकिन मुझे लगता है कि यह उदाहरणों के समूह के साथ होता है ... मैं उन्हें चलाने में असमर्थ हूं, भले ही यह आयात/उपयोग/आवश्यकता/उन्हें शामिल करने के लिए सीधा लगता है।

उत्तर

25

आपको requireuse और/या 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 

संपादित करें: यह सुनिश्चित नहीं है कि यह आपके लिए आरईपीएल से क्यों काम कर रहा है। जैसा कि आप देख सकते हैं, यह मेरे लिए काम नहीं करता है। मैंने कल्पना की है कि आपने पहले कुछ सेटअप किया था जो इसे काम करता है और फिर इसके बारे में भूल जाता है, या संभवतः आपके पास कुछ init स्क्रिप्ट है जो आपके लिए आरपीएल पर यह सामान करती है लेकिन फ़ाइल से लोड होने पर नहीं।

;; कैसे साथ इसका इस्तेमाल करने की: आवश्यकता होती है और:

+0

बहुत बढ़िया है, धन्यवाद, यह काम किया :)। मुझे पता था कि यह आसान था। तो प्रतिलिपि स्वचालित रूप से 'उपयोग' clojure.pprint क्यों उपयोग करता है? मैं कैसे पता लगा सकता हूं कि प्रतिलिपि किस नामस्थान को लोड कर चुकी है, इसलिए अगली बार जब मुझे यह समस्या मिलती है तो मैं इसे समझ सकता हूं? – Sonicsmooth

+3

प्रतिलिपि स्वचालित रूप से ऐसा नहीं करती है। आपके पास कुछ पागल प्रतिकृति-लॉन्चिंग स्क्रिप्ट है जो आपके लिए यह करती है; यदि आप अपनी प्रतिलिपि लॉन्च करने के तरीके के बारे में अधिक जानकारी देते हैं तो आपको एक उत्तर मिल सकता है। – amalloy

0

यहाँ उदाहरण के एक जोड़े हैं का उपयोग

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