2008-10-17 16 views

उत्तर

31

यहां एक make-keyword फ़ंक्शन है जो कीवर्ड निर्माण प्रक्रिया को संकुल करता है (internKEYWORD पैकेज में नाम का आईएनजी)। :-)

(defun make-keyword (name) (values (intern name "KEYWORD"))) 
+0

लगभग, लेकिन काफी नहीं। जब आप कोई कीवर्ड बनाते हैं, तो आपको यह भी सुनिश्चित करना होगा कि आप इसके मूल्य को बाध्यकारी बना दें। – Vatine

+0

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

+9

@ वैटिन [11.1.2.3.1 कुंजीशब्द पैकेज में एक प्रतीक को शामिल करना] (http://www.lispworks.com/documentation/HyperSpec/Body/11_abca.htm) कहते हैं (जोर जोड़ा गया), * "कुंजीशब्द पैकेज है उस विशेष क्रियाओं में अन्य पैकेजों की तुलना में अलग-अलग व्यवहार किया जाता है जब एक प्रतीक को इसमें प्रशिक्षित किया जाता है। विशेष रूप से, जब एक कुंजी को KEYWORD पैकेज में प्रशिक्षित किया जाता है, तो यह स्वचालित रूप से बाहरी प्रतीक बन जाता है और ** स्वचालित रूप से एक बनने के लिए बनाया जाता है एक मूल्य के रूप में अपने आप के साथ स्थिर चर। ** "* –

-5
(intern "foo" "KEYWORD") -> :foo 

अन्य स्ट्रिंग/प्रतीक रूपांतरण और प्रतीकों और संकुल की विस्तृत चर्चा के लिए Common Lisp Cookbook की Strings section देखें।

+3

नाम की आवश्यकता है "KEYWORD" के पैकेज में प्रशिक्षु जा करने के लिए एक कीवर्ड किया जाना है। उदाहरण के लिए, (इंटर्न "फूड" "कुंजीशब्द") –

+0

आह हाँ। (इंटर्न "फू" "कुंजीशब्द") काफी अच्छी तरह से काम करता है। धन्यवाद। – nathan

+0

मेरे उत्तर में, मैंने इसे एक साफ छोटे फ़ंक्शन में पैक किया है, जिसका आप आनंद ले सकते हैं। :-) –

35

मोटे तौर पर सही होने पर दिए गए उत्तरों प्रश्न के उदाहरण के लिए सही समाधान नहीं देते हैं।

पर विचार करें:

CL-USER(4): (intern "foo" :keyword) 

:|foo| 
NIL 
CL-USER(5): (eq * :foo) 

NIL 

आमतौर पर आप इसे होना शामिल होने से पहले स्ट्रिंग के लिए STRING-UPCASE लागू करना चाहते हैं, इस प्रकार:

(defun make-keyword (name) (values (intern (string-upcase name) "KEYWORD"))) 
+1

यह निश्चित रूप से हो सकता है कि ओपी के पास केवल प्रिंट-केस सेट 'डाउनकेस' था ... –

2

Alexandria पुस्तकालय में एक make-keyword समारोह नहीं है, हालांकि यह करता है मामले को सुरक्षित रखें ताकि आप जो चाहते हैं उसे प्राप्त करने के लिए आपको पहले स्ट्रिंग को अपनाना होगा।

+0

या' प्रिंट-केस' को 'डाउनकेस' पर सेट करें। 'इंटर्न' कोई मामला संशोधन नहीं करता है, इसलिए यहां समाधान शायद नहीं होना चाहिए। (हालांकि प्रश्न में उदाहरण '(कीवर्ड "foo") =>: foo' कहता है, शायद यह संभव है कि' (... "foo") =>: | foo | 'या' (... " FOO ") =>: FOO'।) –

1

इस उदाहरण यह भी रिक्त स्थान के साथ तार (उन्हें डॉट्स द्वारा की जगह) के साथ संबंधित हैं:

(defun make-keyword (name) (values (intern (substitute #\. #\space (string-upcase name)) :keyword))) 
+1

क्या कोई कारण है कि आप रिक्त स्थान को डॉट्स के साथ बदलना चाहते हैं? यदि आप 'foo bar' को प्रशिक्षित करते हैं, तो आपको 'foo bar' नाम के साथ प्रतीक मिलता है, और इसमें कोई समस्या नहीं है। 'intern' रिक्त स्थान को बिंदुओं के साथ प्रतिस्थापित नहीं करता है, या तो। –

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