2012-07-19 10 views
11

मुझे एक ऐसा फ़ंक्शन चाहिए जो रनटाइम पर मान का प्रकार प्राप्त करे। उदाहरण उपयोग:मैं योजना में मूल्य का प्रकार कैसे प्राप्त करूं?

(get-type a) 

जहां a किया गया है define घ कुछ मनमाने ढंग से योजना मूल्य किया जाना है।

मैं यह कैसे कर सकता हूं? या क्या मुझे boolean?, number? आदि के कंड स्टैक का उपयोग करके इसे स्वयं लागू करना है?

उत्तर

11

एक छोटे-सीएलओएस जैसी ऑब्जेक्ट सिस्टम के साथ योजना कार्यान्वयन में, आप केवल class-of का उपयोग कर सकते हैं। यहाँ रैकेट में एक नमूना सत्र, ठगी का उपयोग कर रहा है:

$ racket -I swindle 
Welcome to Racket v5.2.1. 
-> (class-of 42) 
#<primitive-class:exact-integer> 
-> (class-of #t) 
#<primitive-class:boolean> 
-> (class-of 'foo) 
#<primitive-class:symbol> 
-> (class-of "bar") 
#<primitive-class:immutable-string> 

और इसी तरह छल का उपयोग कर GOOPS साथ:

[email protected](guile-user)> ,use (oop goops) 
[email protected](guile-user)> (class-of 42) 
$1 = #<<class> <integer> 14d6a50> 
[email protected](guile-user)> (class-of #t) 
$2 = #<<class> <boolean> 14c0000> 
[email protected](guile-user)> (class-of 'foo) 
$3 = #<<class> <symbol> 14d3a50> 
[email protected](guile-user)> (class-of "bar") 
$4 = #<<class> <string> 14d3b40> 
4

कुछ के प्रकार के जांच करने के लिए सिर्फ अगर एक्स एक संख्या है की जाँच करने के लिए, टाइप के बाद एक प्रश्न चिह्न जोड़ें उदाहरण के लिए:

(define get-Type 
    (lambda (x) 
    (cond ((number? x) "Number") 
      ((pair? x) "Pair") 
      ((string? x) "String") 
      ((list? x) "List")))) 

बस उस के साथ जारी है।

+6

ओपी ने विशेष रूप से पूछा कि क्या इस दृष्टिकोण का कोई विकल्प था। इसके अलावा, जब आप 'cond' का उपयोग कर सकते हैं तो नेस्टेड 'if's का उपयोग क्यों करें? \ * boggles \ * –

+0

@ewein @Chris जेस्टर-यंग क्या यह कोई याद आ रही है? 'के लिए (प्राप्त करें टाइप (कार (स्ट्रिंग-> सूची (संख्या-> स्ट्रिंग 5))) 'यह कुछ भी वापस नहीं करता है। – ArtB

+1

मेरे मामले के लिए बाहर निकलता है लापता बिट 'चरित्र' था। पूर्णता के लिए 'वेक्टर भी है?'। – ArtB

9

रैकेट में, आप describe पैकेज डौग विलियम्स द्वारा ग्रह से उपयोग कर सकते हैं। यह इस तरह से काम करता है:

> (require (planet williams/describe/describe)) 
> (variant (λ (x) x)) 
'procedure 
> (describe #\a) 
#\a is the character whose code-point number is 97(#x61) and 
general category is ’ll (letter, lowercase) 
+0

यह पैकेज वास्तव में सहायक है। काश यह कोर रैकेट का हिस्सा था। – Salil

3

सभी उत्तर यहाँ सहायक होते हैं, लेकिन मुझे लगता है कि लोगों को समझाने के लिए क्यों यह कठिन हो सकता है उपेक्षित कर दिया है; स्कीम मानक में एक स्थिर प्रकार प्रणाली शामिल नहीं है, इसलिए मूल्यों को केवल एक "प्रकार" नहीं कहा जा सकता है। चीजें उपप्रकारों के आसपास और आसपास दिलचस्प होती हैं (उदा। संख्या बनाम फ़्लोटिंग-पॉइंट-नंबर) और यूनियन प्रकार (आप किसी फ़ंक्शन को किस प्रकार देते हैं जो या तो संख्या या स्ट्रिंग देता है?)।

यदि आप अपने वांछित उपयोग का थोड़ा और वर्णन करते हैं, तो आप पाएंगे कि अधिक विशिष्ट उत्तर हैं जो आपको और अधिक मदद करेंगे।

+5

वह "रनटाइम पर" कहता है, इसलिए इसमें स्थिर प्रकारों से कोई लेना देना नहीं है। यह – newacct

+0

के बाद के गतिशील (रनटाइम) प्रकारों के मान हैं, आप जॉन के बिंदु को याद कर रहे हैं, इस अर्थ में कि गतिशील रनटाइम प्रकारों में हमेशा असंबद्ध होने के लिए पर्याप्त जानकारी नहीं होती है। कंक्रीट उदाहरण: मान लें कि मेरे पास एक ऐसा प्रोग्राम है जो रंगों और नामों से संबंधित है। मैं केवल इन तारों के साथ इन प्रकार के मानों का प्रतिनिधित्व करना चुन सकता हूं। फिर यदि मुझे "ग्रे" शब्द दिखाई देता है, तो मेरे पास इस प्रकार को अलग करने के लिए पर्याप्त जानकारी नहीं है क्योंकि मैं एक ही प्रतिनिधित्व का उपयोग कर रहा हूं। – dyoo

+0

डितो; आप मेरी पोस्ट से "स्थैतिक" शब्द को हटा सकते हैं, और यह अभी भी समझ में आता है। डैनी का उदाहरण एक अच्छा है। वास्तव में, सी भाषा में एक ही समस्या है: "इस मान का प्रकार क्या है" ऑपरेटर नहीं है, क्योंकि कई मानों का एक ही प्रतिनिधित्व होता है। –

संबंधित मुद्दे