`प्रतीक-मूल्य` क्या करता है?


13

डॉक्स ने मुझे कोई समझदार नहीं बनाया:

यह फ़ंक्शन प्रतीक के मूल्य सेल में संग्रहीत मान लौटाता है। यह वह जगह है जहां चर का वर्तमान (गतिशील) मान संग्रहीत होता है। यदि चर में कोई स्थानीय बंधन नहीं है, तो यह बस इसका वैश्विक मूल्य है। यदि चर शून्य है, तो शून्य-चर त्रुटि का संकेत दिया जाता है।

प्रतीक-मूल्य की बात क्या है? मुझे इसका उपयोग कहाँ और कब करना है?


3
Emacs पूछकर जवाब खोजने की कोशिश करने के लिए धन्यवाद। यह सही तरीका है: पहले Emacs से पूछें, और फिर जो कुछ अभी भी स्पष्ट नहीं है, उसके बारे में यहां पूछें, हमें अपने प्रश्न में बताएं कि आपने पहले से क्या प्रयास किया है। कुडोस!
आकर्षित किया

जवाबों:


13

आपको इसकी आवश्यकता तब होती है, जब Elisp कोड में, आप एक प्रतीक के मान को प्राप्त करना चाहते हैं, अर्थात, जब चर के रूप में माना जाता है।

ध्यान रखें कि एक एलिसिप चिन्ह में कई विशेषताएं / विशेषताएं हैं:

  • इसका एक नाम है (कौन सा फ़ंक्शन symbol-nameदेता है)
  • इसका एक मान हो सकता है, जब एक चर के रूप में माना जाता है (जो symbol-valueदेता है)
  • यह एक फ़ंक्शन का नाम दे सकता है, जब एक फ़ंक्शन के रूप में माना जाता है (जो symbol-functionदेता है)
  • इसकी एक संपत्ति सूची है (जो symbol-plistदेता है)

एक प्रतीक के रूप में एक वस्तु के रूप में, विभिन्न विशेषताओं के साथ सोचो।


1
यह भी ध्यान दें कि (जैसा कि प्रलेखन इंगित करता है) symbol-valueहमेशा प्रतीक के लिए गतिशील बंधन देता है । आप इस तरह से शाब्दिक मूल्य प्राप्त नहीं कर सकते।
फिल्स

2
C-h i g (elisp) Symbol Components RETइन विभिन्न प्रतीक कोशिकाओं / घटकों पर प्रलेखन के लिए भी देखें ।
फिल्स

@ एफिल्स: एचएम, मुझे आश्चर्य है (setq lexical-binding t) (let ((v 42)) (message "lex: %S, val: %S" lexical-binding (symbol-value 'v))):। लेकिन हाँ, यह वही है जो (elisp) कहता है Lexical Binding: " जैसे कार्य करता है symbol-value, boundp'और set'केवल चर के गतिशील बंधन (यानी, इसके प्रतीक के मूल्य सेल की सामग्री) को पुनः प्राप्त या संशोधित करता है "। हालाँकि, इसके बारे में कुछ नहीं कहा जाता है Symbol Components
ड्रू

10

(दो, @ ड्रू ने पहले से ही निम्नलिखित में से कुछ डाल दिया है। वैसे भी, यहां कुछ अतिरिक्त विवरण हैं।)

जैसा कि प्रतीक घटकों पर मैनुअल पेज बताते हैं, प्रत्येक प्रतीक के चार घटक (सेल) हैं: इसका प्रिंट नाम सेल, इसका मूल्य सेल, इसकी कार्य परिभाषा और इसकी संपत्ति सूची। या तो मान सेल या फ़ंक्शन सेल शून्य हो सकता है, और संपत्ति सूची शून्य हो सकती है।

जैसा कि मैनुअल भी बताता है:

क्योंकि प्रत्येक प्रतीक के अलग-अलग मूल्य और फ़ंक्शन सेल होते हैं, चर नाम और फ़ंक्शन नाम संघर्ष नहीं करते हैं।

इसलिए आपके पास हो सकता है, उदाहरण के लिए:

(setq test "kittens")
(defun test ()
  (message "puppies"))
(symbol-value 'test)    ; => "kittens"
(symbol-function 'test) ; => (lambda nil (message "puppies"))

1
आह, कि यह कार्य के विपरीत मूल्य है, यह समझने में बहुत आसान बना दिया। धन्यवाद।
अनफुन कैट

8

यहां थोड़ा सा ऐतिहासिक संदर्भ है (मैं अभी तक पैदा नहीं हुआ हूं जब वर्णित घटनाएं हुई थीं, इसलिए शायद कोई और जानकार मुझे सही करेगा। यह सब पुराने लेखों और कुछ पुस्तकों को पढ़ने से है)।

डिस्क्लेमर के साथ तिरस्कृत होने के बाद, ऐसा लगता है कि फोरट्रान बनाम लिस्प के दिनों में "प्रतीकात्मक" एक तरह का उहापोह था जैसा कि "वस्तु उन्मुख" आज है। Ie कार्यक्रमों को आम तौर पर केवल विशाल गणितीय सूत्रों के रूप में देखा जाता था, जहां संख्याओं को अंततः प्लग किया जाएगा और संख्याओं के लिए प्लेसहोल्डर अपरिवर्तित थे। एक कार्यक्रम में निहित सभी प्रतीकात्मक जानकारी जैसे ही उस कार्यक्रम को चलाने, संकलित या व्याख्या करने के बाद गायब हो जाएगी। लिस्प की नवीनता यह थी कि यह एक कार्यक्रम को चलाने, संकलित या व्याख्या करने के बाद भी प्रतीकों को बनाए रखने की अनुमति देता था। इसने इस तरह की शब्दावली को "प्रतीकात्मक बीजगणित" के रूप में प्रेरित किया (जैसा कि बीजगणितीय सूत्रों पर हेरफेर के रूप में कागज / ब्लैकबोर्ड पर किया गया था बजाय प्रत्यक्ष गणना के)। इस (और अन्य प्रतीकात्मक चीजों) का समर्थन करने के लिए प्रतीकों को एक नाम और कुछ गुणों से सुसज्जित किया जाना था। गैर-प्रतीकात्मक दृष्टिकोण से, कोई कह सकता है कि "प्रतीकों को केवल संकेतकर्ता कहा जाता है", और जबकि यह सच नहीं है, अगर कुछ भी वे बिंदुओं से संरचना के अधिक हैं, लेकिन व्यावहारिक उद्देश्यों के लिए, प्रतीक बाईं ओर के डिजाइनर हैं एक चर-मूल्य जोड़ी के हाथ की ओर। यह भी देखने के लिए संभव बनाता हैsymbol-value गैर-प्रतीकात्मक भाषाओं में पॉइंटर डेरेफेरिंग के रूप में कार्य करते हैं।

आधुनिक लिस्प्स इस मायने में भिन्न होते हैं कि एक प्रतीक के साथ कितने मूल्य जुड़े हो सकते हैं (मान लीजिए कि आपके पास कई मेमोरी स्टैक / ढेर के साथ एक गैर-प्रतीकात्मक भाषा थी, आप एक ऐसी स्थिति की कल्पना कर सकते हैं जहां एक ही पॉइंटर का अर्थ है जब विभिन्न स्टैक्स के संदर्भ में व्याख्या की गई हो ढेर)। तो, Lisp2 भाषाएं (Emacs Lisp ऐसी ही एक भाषा है) में फ़ंक्शंस और वेरिएबल्स के लिए अलग-अलग स्टोरेज है, यही कारण है कि वहाँ भी है symbol-function, जो "एक फ़ंक्शन स्टोरेज की ओर इशारा करते पॉइरेफेरेंस" है। स्कीम में यह विशेष भंडारण नहीं है और क्लोजर AFAIK, के पास न तो ऐसा है और न ही symbol-plist


7

छोटा डेमो:

(setq v1 10)
;;10
v1
;;10
(setq v2 'v1)
;;v1
v2
;;v1
(symbol-value v2)
;;10 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.