2009-10-06 8 views
111

मेरे पास वापस से अन्य लिस्पस (विशेष रूप से योजना) का गुजरना ज्ञान है। हाल ही में मैं Clojure पढ़ रहा हूं। मैं देखता हूं कि इसमें दोनों "प्रतीक" और "कीवर्ड" हैं। प्रतीक जिन्हें मैं परिचित हूं, लेकिन कीवर्ड के साथ नहीं।क्लोजर के पास "प्रतीकों" के अतिरिक्त "कीवर्ड" क्यों हैं?

क्या अन्य लिस्पस में कीवर्ड हैं? कीवर्ड अलग-अलग नोटेशन (यानी: कोलन) के अलावा अन्य प्रतीकों से अलग कैसे हैं?

+0

भी देखें: [Clojure में, क्यों है स्ट्रिंग्स, कीवर्ड और प्रतीकों?] (Http://stackoverflow.com/q/11655080/405550) – Zaz

उत्तर

119

कीवर्ड और प्रतीकों के लिए Clojure documentation यहां है।

कीवर्ड प्रतीकात्मक पहचानकर्ता हैं जो स्वयं का मूल्यांकन करते हैं। वे बहुत तेजी से समानता परीक्षण प्रदान करते हैं ...

प्रतीक पहचानकर्ता हैं जिनका उपयोग आमतौर पर किसी और चीज के संदर्भ में किया जाता है। वे कार्यक्रम रूपों में इस्तेमाल किया जा सकता समारोह मापदंडों का उल्लेख करने, बाइंडिंग, वर्ग के नाम और वैश्विक वार्स हैं ...

कीवर्ड आम तौर पर हल्के "निरंतर तार" के रूप में उपयोग किया जाता है, उदाहरण के लिए एक हैश-मैप की कुंजी या बहुमूल्य के प्रेषण मानों के लिए। प्रतीक आमतौर पर परिवर्तनीय और कार्यों के नाम के लिए उपयोग किए जाते हैं और मैक्रोज़ और इस तरह के अलावा उन्हें सीधे ऑब्जेक्ट्स के रूप में उपयोग करने के लिए कम आम है। लेकिन जब भी आप किसी कीवर्ड का उपयोग करते हैं तो आपको प्रतीक का उपयोग करने से रोक नहीं है (यदि आप उन्हें हर समय उद्धृत नहीं करते हैं)।

अंतर देखने का सबसे आसान तरीका क्लोजर स्रोत में Keyword.java और Symbol.java पढ़ना है। कुछ स्पष्ट कार्यान्वयन मतभेद हैं। उदाहरण के लिए क्लोजर में एक प्रतीक मेटाडेटा हो सकता है और एक कीवर्ड नहीं कर सकता है।

सिंगल-कोलन सिंटैक्स के अतिरिक्त, आप नामस्थान-योग्य कीवर्ड बनाने के लिए डबल-कोलन का उपयोग कर सकते हैं।

user> :foo 
:foo 
user> ::foo 
:user/foo 

आम लिस्प में रूबी और अन्य भाषाओं के रूप में कीवर्ड हैं। वे निश्चित रूप से उन भाषाओं में थोड़ा अलग हैं। सामान्य लिस्प कीवर्ड और क्लोजर कीवर्ड के बीच कुछ अंतर:

  1. क्लोजर में कीवर्ड प्रतीक नहीं हैं।

    user> (symbol? :foo) 
    false 
    
  2. कीवर्ड किसी भी नाम स्थान से संबंधित नहीं है जब तक आप विशेष रूप से उन्हें योग्य: (। मुझे चीजों के विचार देखने के देने के लिए धन्यवाद Rainer Joswig)

    user> (namespace :foo) 
    nil 
    user> (namespace ::foo) 
    "user" 
    

+9

में प्रतीक नहीं हैं यह बताता है कि मतभेद हैं, लेकिन दो अलग-अलग संरचनाओं की आवश्यकता क्यों नहीं है। क्लोजर ने कीवर्ड और सिंबल दोनों की क्षमताओं के संघ के साथ कुछ नहीं बनाया है? – mtnygard

+20

कीवर्ड हल्के वजन वाले हैं और एक सुविधाजनक वाक्यविन्यास है, मुझे लगता है कि इसके बारे में सब कुछ है। भाषा उनके बिना ठीक काम करेगी लेकिन वे अच्छे हैं और उनका व्यापक रूप से उपयोग किया जाता है। आपके पास उनकी क्षमताओं का एक संघ नहीं हो सकता है क्योंकि कीवर्ड हमेशा आत्म-मूल्यांकन कर रहे हैं (यानी आप उन्हें चर या फ़ंक्शन नामों के रूप में उपयोग नहीं कर सकते हैं) और सामान्य रूप से प्रतीक हमेशा आत्म-मूल्यांकन नहीं कर सकते हैं। –

+1

ऐसा लगता है कि कीवर्ड हैशैप्स आदि में चाबियों के रूप में अधिक उपयोगी हैं क्योंकि वे एक बार मूल्यांकन नहीं करते हैं: '(eval (eval ': a))' बनाम' (eval (eval '' a)) '। क्या अन्य फायदे हैं? प्रदर्शन के अनुसार, वे समान हैं? – kristianlm

5

कीवर्ड ऐसे प्रतीक हैं जो स्वयं का मूल्यांकन करते हैं, इसलिए आपको उन्हें उद्धृत करने की आवश्यकता नहीं है।

+5

यह है कि है? टाइपिंग: 'बड़ी जीत की तरह प्रतीत नहीं होता है, खासकर जब से: अधिकांश कीबोर्ड पर एक अतिरिक्त कीप्रेस है। –

+8

ठीक है, यह वास्तव में चरित्र से भी अधिक है। कीवर्ड मूल्यांकन के बाद कीवर्ड बने रहते हैं, जबकि प्रतीकों का मूल्यांकन उनके द्वारा किए जाने वाले कार्यों के लिए किया जाता है। यह एक अर्थपूर्ण अंतर की तरह है, क्योंकि वे आम तौर पर विभिन्न उद्देश्यों के लिए उपयोग किए जाते हैं। –

+12

कीवर्ड क्लोजर –

26

आम लिस्प में कीवर्ड प्रतीक हैं।

कीवर्ड भी प्रतीक हैं।

(symbolp ':foo) -> T 

क्या विशेष कीवर्ड बनाता है:

  • : foo प्रतीक कीवर्ड के रूप में कॉमन लिस्प पाठक :: foo
  • कीवर्ड खुद को मूल्यांकन से पार्स किया गया है: foo ->: foo
  • कीवर्ड प्रतीकों का घर पैकेज कुंजीशब्द पैकेज है: कीवर्ड: foo ->: foo
  • कीवर्ड पैकेज से निर्यात किए जाते हैं KEYWORD
  • कीवर्ड स्थिरांक हैं, इसे एक अलग मान

अन्यथा कीवर्ड सामान्य प्रतीक असाइन करने की अनुमति नहीं है। तो कीवर्ड फ़ंक्शंस का नाम या संपत्ति सूचियां रख सकते हैं।

याद रखें: सामान्य लिस्प प्रतीकों में एक पैकेज से संबंधित है। यह के रूप में लिखा जा सकता है:

  • foo, जब प्रतीक वर्तमान पैकेज में पहुँचा जा सकता है
  • foo: बार, जब प्रतीक FOO पैकेज बार से निर्यात किया जाता है
  • foo :: बार, जब foo, कीवर्ड: foo और कीवर्ड :: foo सभी एक ही प्रतीक हैं प्रतीक fOO पैकेज बार

कीवर्ड प्रतीकों के लिए इसका मतलब है कि में है। इस प्रकार बाद के दो नोटेशन आमतौर पर उपयोग नहीं किया जाता है।

तो: foo को केवल पैकेज में होने के लिए पार्स किया गया है, यह मानते हुए कि प्रतीकात्मक नाम से पहले कोई पैकेज नाम नहीं देना डिफ़ॉल्ट रूप से KEYWORD पैकेज है।

2

: कुछ विशेष रूप से सुविधाजनक वाक्यविन्यास के लिए कीवर्ड को विशेष रूप से कई संग्रहों से भी व्यवहार किया जाता है।

(:user-id (get-users-map)) 

((get-users-map) :user-id) 

रूप में ही है इस बातें सिर्फ एक छोटे से अधिक flexable

+19

यह प्रतीकों के लिए भी सच है, ('a {' a 1 'b 2}) => 1 और ({' a 1 'b 2}' b) => 2। – Jonas

3

कीवर्ड के लिए बनाता है, हैश मान की गणना की और कैश नहीं किया जाता जब कीवर्ड पहले का निर्माण किया है। एक हैश कुंजी के रूप में एक कीवर्ड को देखते समय, यह केवल प्रीकंप्यूटेड हैश मान देता है। तारों और प्रतीकों के लिए, हैश प्रत्येक लुकअप पर पुनर्मूल्यांकन किया गया है।

क्यों नामित कीवर्ड हमेशा समान होते हैं, उनमें उनके अपने हैश मान होते हैं। हैश कुंजी से बने नक्शे और सेट में खोज के रूप में यह खोज में नहीं, कई खोजों के मामले में बेहतर खोज दक्षता प्रदान करता है।

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