2012-08-02 13 views
6

मूल रूप से ...क्या मैं परमाणु का उपयोग कर रहा हूं? गलत या कुछ और है ....?

=> (atom? 5)

CompilerException java.lang.RuntimeException: Unable to resolve symbol: atom? in this context, compiling:(NO_SOURCE_PATH:1)

=> (atom? /a)

RuntimeException Invalid token: /a clojure.lang.Util.runtimeException (Util.java:156) RuntimeException Unmatched delimiter:) clojure.lang.Util.runtimeException (Util.java:156)

=> (atom? "hello world")

CompilerException java.lang.RuntimeException: Unable to resolve symbol: atom? in this context, compiling:(NO_SOURCE_PATH:1)

तो क्या किसी को पता है कि क्या हो रहा है ?? मैं ग्रहण जूनो 4.2, काउंटरक्लॉकवाइड प्लगइन का उपयोग कर रहा हूं।

उत्तर

12

क्लोजर में परमाणु कहलाता है जिसे अन्य लिस्पस में परमाणु कहा जाता है उससे बिल्कुल अलग है।

(define (atom? x) 
    (not (or (pair? x) 
      (null? x)))) 

Clojure में एक परमाणु संगामिति संदर्भ प्रकार है: क्लासिक लिस्प में एक परमाणु एकल मान, अशक्त या नहीं एक विपक्ष सेल (जोड़ी) नहीं होने के रूप में परिभाषित किया गया है। क्लोजर में परमाणु या तो एकल मूल्यवान या संग्रह/अनुक्रम हो सकते हैं, जहां अद्यतन (परिवर्तनीय राज्य परिवर्तन) परमाणु रूप से होने की गारंटी है।

क्लोजर में लिस्प में विपक्ष सूची की तुलना में कहीं अधिक संदर्भ प्रकार हैं, और वहां सभी जावा इंटरऑप संग्रह प्रकारों के साथ गणना की जा सकती है। इससे सिंगल-वैल्यू पर चेक को परिभाषित करना मुश्किल हो जाता है।

यदि आप चाहते हैं, तो सबसे सरल जांच यह देखने के लिए है कि कुछ गिना जा सकता है या नहीं। (source counted) पर देखकर, यह clojure.lang.RT/गिनती और गिनती से संदर्भित करता है। वहाँ, कई वर्गों/इंटरफेस निर्दिष्ट कर रहे हैं, जो मैं निम्नलिखित समारोह में शामिल:

=> (defn single-valued? 
    [x] 
    (not (or (nil? x) 
       (.. x getClass isArray) 
       (some #(instance? % x) [clojure.lang.Counted 
             clojure.lang.IPersistentCollection 
             java.util.Collection 
             java.util.Map])))) 

=> (map single-valued? [1 "foo" \a 'x true not nil]) 
(true true true true true true false) 

=> (map single-valued? ['(1 2 3 4) 
         [1 2 3 4] 
         {:a 1 :b 2} 
         #{1 2 3 4} 
         (seq [1 2 3 4]) 
         (seq {:a 1 :b 2}) 
         (seq "foo") 
         (int-array [1 2 3 4]) 
         (seq [])]) 
(false false false false false false false false false) 

(seq []) चूंकि यह एकल महत्वपूर्ण नहीं माना जाता है nil मूल्यांकन करता है। बेशक, कई क्षेत्रों के साथ जावा ऑब्जेक्ट्स, साथ ही क्लोजर डेफ्टीप्स/डिफ्रॉर्ड्स इस तरह पंजीकृत होंगे, भले ही वे समग्र वस्तुएं हों।

3

परमाणु? एक समारोह नहीं है

आप

(def x (atom 5)) 
(instance? clojure.lang.Atom x) 
+0

'अगर परमाणु' है नहीं एक समारोह, 'सूची कैसे आती है?' है? मैं 'सूची' का उपयोग किसी फ़ंक्शन की तरह कर सकता हूं और यह काम करता है, लेकिन 'परमाणु?' नहीं। यह सब बहुत संदिग्ध लगता है ... – Zchpyvr

+6

@Zchpyvr 'list? 'केवल एक फ़ंक्शन की तरह नहीं है, लेकिन _is_ मानक लाइब्रेरी में स्पष्ट रूप से कार्यान्वित किया गया एक फ़ंक्शन और http://clojure.org/cheatsheet पर प्रलेखित किया गया है; 'परमाणु? 'नहीं है। –

6

इस्तेमाल कर सकते हैं मुझे लगता है कि आप इस योजना की तरह कुछ में एक atom के साथ एक clojure atom भ्रमित कर रहे हैं।

  • योजना में एक परमाणु एक मौलिक इकाई है।
  • क्लोजर में एक परमाणु क्लोजर के संदर्भ प्रकारों (जैसे रेफरी और var) में से एक है जिसे परमाणु रूप से अपडेट किया जा सकता है।

यह क्लोजर के समरूपता मॉडल के साथ अच्छी तरह से फिट बैठता है।

उदा।

user> (def a (atom '(1 2 3)]); create an atom with value (1 2 3) 
user> @a ; look up (deference) the atoms value 
(1 2 3) 
user> (swap! a (fn [v] (map inc v))) ; add 1 to each element, v is the 
            ; old value of the atom. other threads will 
            ; see the three values in a change atomically 
user> @a 
(2 3 4) 
user> (reset! a '(5 10 15)) 
user> @a 
(5 10 15) 
1

आप परमाणु बना सकते हैं? समारोह इस तरह:

(defn atom? [x] 
      (not (coll? x)) 
    ) 
0

complement समारोह किसी भी विधेय तर्क के रूप में इसे करने के लिए पारित कर दिया के विपरीत देता है, तो आप इसके साथ एक atom? कर सकते हैं:

(defn atom? 
    [x] 
    ((complement coll?) x)) 

(atom? []) ;=> false 
(atom?()) ;=> false 
(atom? {}) ;=> false 
(atom? 4) ;=> true 
संबंधित मुद्दे