2011-03-23 15 views
13

मैं कैसे जांच सकता हूं कि कुछ परमाणु है या नहीं? मैं number? या list? जैसे कुछ ढूंढ रहा हूं।जांचें कि कोई तर्क एक सूची है या परमाणु

+3

मामले में यह नीचे दिए गए उत्तर से स्पष्ट नहीं है: शब्द "परमाणु" अलग-अलग लेखकों द्वारा और विभिन्न प्रणालियों में अलग ढंग से किया जाता है। यदि आप एक विशेष पाठ पढ़ रहे हैं, तो आप शायद पाठ में दिए गए 'परमाणु' की परिभाषा का उपयोग करना चाहते हैं। शायद यह मुख्य कारण है कि कोई 'परमाणु' नहीं है? आप जिस प्रणाली का उपयोग कर रहे हैं उसमें आदिम मौजूद है। –

उत्तर

3

विभिन्न योजनाएं यह जानकारी शामिल नहीं करते, मैं अक्सर देखा है atom? इस तरह से परिभाषित:

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

यह सच वापस आ जाएगी अगर x एक जोड़ी (या एक सूची) नहीं है। यह संख्याओं, तारों, पात्रों और प्रतीकों के लिए सच होगा, जबकि symbol? केवल स्वाभाविक रूप से प्रतीकों के लिए सच होगा। यह हो सकता है कि आप जो चाहते हैं वह हो या न हो। की तुलना करें यासिर Arsanukaev की मिसाल:

1 ]=> (map atom? (list 42 'a-symbol (list 12 13) 'foo "yiye!")) 

;Value 13: (#t #t #f #t #t) 

यह pair? का उपयोग करता है, क्योंकि इस (1 2 3) तरह उचित सूचियों की जांच करता है, जोड़े (a . b) की तरह है, जबकि list? बिंदीदार जोड़े और डॉटेड-पूंछ सूचियों के लिए अवास्तविक लौटाते हैं।

20

आमतौर पर, आप भी खाली सूची को बाहर करना चाहेंगे:

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

या, यदि आप और अधिक पंडिताऊ होना चाहते हैं, तो वैक्टर भी न करे:

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

और निश्चित रूप से आप यहां और अधिक जोड़ सकते हैं - चूंकि इसे रैकेट प्रश्न के रूप में चिह्नित किया गया है, इसलिए आप हैश टेबल, structs इत्यादि जोड़ना चाहेंगे। इसलिए यह आपके द्वारा परमाणुओं के रूप में विचार करने वाले मानों को निर्दिष्ट करना आसान हो सकता है:

(define (atom? x) 
    (ormap (lambda (p) (p x)) (list number? symbol? boolean? string?))) 

या रैकेट अनुबंध प्रणाली का उपयोग कर:

(define atom? (or/c number? symbol? boolean? string?)) 
संबंधित मुद्दे