कैसे बनाएं: कीवर्ड?


16

प्रश्न: कोई कैसे निर्माण और उपयोग करता है :keywords?

निम्नलिखित खिलौने की पहुंच का उपयोग करने के लिए एक भोले (जाहिरा तौर पर) प्रयास पर विचार करें:

(setf alist '((:key-1 "Key no. 1")
              (:key-2 "Key no. 2")))

(assq :key-1 alist)                 ; => (:key-1 "Key no. 1")
(assq (make-symbol ":key-1") alist) ; => nil

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

मूल प्रेरणा: मुझे एक स्ट्रिंग को लुकअप कुंजी में बदलने की आवश्यकता है जो एक प्रतीक है जिस पर मैं putगुण कर सकता हूं ।

इस प्रश्न को तैयार करने की प्रक्रिया में, मैंने उत्तर के कम से कम हिस्से को प्राप्त कर लिया है, जिसे मैं अलग से पोस्ट कर रहा हूं। मुझे उम्मीद है कि मेरा दिमाग इससे बेहतर हो सकता है।


1
(eq :foo (read ":foo"))
abo-abo

जवाबों:


9

आप सही हैं जो make-symbolएक ऐसा कीवर्ड बनाएगा जो eqकिसी भी मौजूदा कीवर्ड के लिए नहीं है, और internनए प्रतीक के साथ वैश्विक बाधा को प्रदूषित कर सकता है। उन लोगों के बीच, आपके पास intern-soft, जो प्रतीक को लौटाता है यदि यह पहले ही बनाया जा चुका है, या nilयदि यह नहीं है:

ELISP> (intern-soft ":key-1")
nil
ELISP> :key-1
:key-1
ELISP> (intern-soft ":key-1")
:key-1

यह आपके उद्देश्य के लिए उपयुक्त होना चाहिए: यदि कीवर्ड मौजूद नहीं है, तो यह एलिस्ट में मौजूद नहीं हो सकता है, इसलिए यह जाँचने के लिए कि यह वहां है, इसे बनाने की कोई आवश्यकता नहीं है। कुछ इस तरह:

(let ((maybe-keyword (intern-soft ":key-1")))
  (and maybe-keyword (assq maybe-keyword alist)))

चतुर - मैंने देखा है, intern-softलेकिन इस तरह से इसका इस्तेमाल करने के लिए नहीं सोचा था।
दान

6

शायद मैं सवाल को सही ढंग से नहीं समझ रहा हूँ। लेकिन आप अगर एक कीवर्ड का उपयोग करना (यानी, आप संतुष्ट करना चाहते हैं keywordp) तो आप चाहते हैं प्रतीक वैश्विक obarray में प्रशिक्षु होने के लिए , obarray

यह AFAICT को संतुष्ट करने के लिए वहाँ रखा जाना चाहिए keywordp, और C-h f keywordpऐसा कहते हैं।

तो आपके सवाल का जवाब, AFAICT, बस उपयोगintern करने के लिए है

मुझे ऐसा लगता है कि आप शायद अपना असली सवाल नहीं पूछ रहे हैं - एक XY प्रश्न की तरह लगता है। आप वास्तव में क्या करने की कोशिश कर रहे हैं? (शायद यह एक अलग प्रश्न के रूप में है।)

[आपकी टिप्पणी के जवाब में कि इंटर्निंग विशिष्ट नहीं है :keyword, जैसा कि यह सभी प्रतीकों पर लागू होता है ": सही, इंटर्निंग कीवर्ड के लिए विशिष्ट नहीं है। लेकिन इंटर्निंग (इन obarray) और symbol-nameउस का उपयोग :करना कीवर्ड के लिए विशिष्ट है।]


यह निश्चित रूप से एक एक्सवाई सवाल है कि मैं वाई की कोशिश कर रहा हूं, लेकिन वाई को पाने के मेरे प्रयास में एक्स में वास्तव में दिलचस्पी है। मुझे कुछ विचार देने के लिए कि वाई के बारे में इस तरह से सवाल कैसे करें दूसरों के लिए भी उपयोगी है।
दान

महान। वह मददगार होगा। धन्यवाद।
आकर्षित किया

2

इस प्रश्न का आंशिक उत्तर यहां दिया जा रहा है। संक्षिप्त और पूरी तरह से संतोषजनक संस्करण नहीं लगता है: उपयोग intern

:key-1 दोनों को संतुष्ट करता है:

(symbolp :key-1)                    ; => t
(keywordp :key-1)                   ; => t

जबकि (make-symbol ":key-1")पहले को संतुष्ट करता है लेकिन दूसरे को नहीं:

(symbolp (make-symbol ":key-1"))    ; => t
(keywordp (make-symbol ":key-1"))   ; => nil

अब, डॉकस्ट्रिंग का make-symbolकहना है कि यह होगा:

एक नए आवंटित किए गए बिना अंक वाले प्रतीक को लौटाएं जिसका नाम NAME है।

मम्के, और डॉकस्ट्रिंग का keywordpकहना है कि यह होगा:

tयदि OBJECT एक कीवर्ड है तो वापस लौटें । इसका मतलब है कि यह एक प्रतीक है जिसका प्रिंट नाम : प्रारंभिक बाधा में नजर आता है।

तो यह प्रतीत होता है कि internकाम करेगा:

(assq (intern ":key-1") alist)      ; => (:key-1 "Key no. 1")

क्योंकि internहोगा:

विहित चिन्ह लौटाएँ जिसका नाम STRING है। यदि कोई नहीं है, तो इस फ़ंक्शन द्वारा एक बनाया जाता है और वापस आ जाता है। एक दूसरा वैकल्पिक तर्क उपयोग करने के लिए बाधा को निर्दिष्ट करता है; के मूल्य के लिए यह चूक है obarray

लेकिन यह :keywordविशिष्ट प्रतीत नहीं होता , क्योंकि यह सभी प्रतीकों पर लागू होता है। डिफ़ॉल्ट रूप से, यह वैश्विक प्रदूषित करने के लिए भी प्रकट होता है obarray, जो ए बिग डील हो भी सकता है और नहीं भी।

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