2011-03-15 12 views
8

में एक स्ट्रिंग से एक चर नाम का निर्माण करें मैं एक स्ट्रिंग लेने की कोशिश कर रहा हूं, और इसे एक चर नाम में परिवर्तित कर रहा हूं। हालांकि मैं (मेक-प्रतीक) या (इंटर्न) ऐसा करूँगा, लेकिन स्पष्ट रूप से यह काफी नहीं है जो मैं चाहता हूं, या मैं इसे गलत तरीके से उपयोग कर रहा हूं।लिस्प

उदाहरण के लिए:

> (setf (intern (string "foo")) 5) 
> foo 
    5 

यहाँ मैं 5. सिवाय के एक मूल्य के साथ 'foo' नामक एक चर बनाने की कोशिश कर रहा होगा, इसके बाद के संस्करण कोड मुझे एक त्रुटि देता है। मैं क्या आदेश ढूंढ रहा हूं?

उत्तर

10

चीजों की एक संख्या यहाँ पर विचार करने के होते हैं:

  1. SETF अपनी पहली तर्क का मूल्यांकन नहीं करता है। यह एक प्रतीक या एक फॉर्म की अपेक्षा करता है जो अद्यतन करने के लिए एक स्थान निर्दिष्ट करता है। इसके बजाय SET का उपयोग करें।

  2. आपके सामान्य लिस्प कार्यान्वयन के विंटेज और सेटिंग्स के आधार पर, प्रतीक नाम ऊपरी मामले में डिफ़ॉल्ट हो सकते हैं। इस प्रकार, foo का दूसरा संदर्भ वास्तव में एक प्रतीक का संदर्भ ले सकता है जिसका नाम "FOO" है। इस मामले में, आपको (intern "FOO") का उपयोग करने की आवश्यकता होगी।

  3. STRING पर कॉल हानिरहित लेकिन अनावश्यक है यदि मान पहले से ही एक स्ट्रिंग है।

यह सबको एक साथ रखें, इस प्रयास करें:

> (set (intern "FOO") 5) 
> foo 
    5 
+0

अरे, यह काम किया! अच्छी तरह की। मैं वास्तव में (सेट) का उपयोग करके मूल्यों को असाइन करने की कोशिश नहीं कर रहा हूं लेकिन एक अन्य फ़ंक्शन का उपयोग करके (एड-डीएम) जिसे मैंने नहीं बनाया है। जाहिर है, (ऐड-डीएम) में समान सीमा है (setf), जहां पहली अभिव्यक्ति का मूल्यांकन नहीं किया जाता है, इसलिए मुझे एक और तरीका पता लगाना होगा। लेकिन उसने चीजों पर कुछ प्रकाश डाला, इसलिए धन्यवाद! (साथ ही, मुझे एहसास है कि (स्ट्रिंग) अनावश्यक है, हालांकि मेरा अंतिम लक्ष्य समेकित तारों से प्रतीक बनाना है, इसलिए मैंने इसे एक फर्क पड़ने पर ही रखा है)। – Jeff

+2

@ जेफ अगर 'एडीडी-डीएम' एक मैक्रो है, तो यह एक निर्यात किए गए फ़ंक्शन में विस्तारित हो सकता है जिसका उपयोग 'एसईटी' के समान तरीके से किया जा सकता है। '(Macroexpand-1 '(add-dm ...)) के परिणाम का निरीक्षण करने का प्रयास करें, यह देखने के लिए कि क्या आप भाग्य में हैं या नहीं। – WReach

+2

एसईटी आवश्यक नहीं है। –

5

उपयोग:

CL-USER 7 > (setf (SYMBOL-VALUE (INTERN "FOO")) 5) 
5 

CL-USER 8 > foo 
5 

यह भी एक चर के साथ काम करता है:

CL-USER 11 > (let ((sym-name "FOO")) 
       (setf (SYMBOL-VALUE (INTERN sym-name)) 3)) 
3 

CL-USER 12 > foo 
3 

भी याद रखें कि डिफ़ॉल्ट रूप से प्रतीक आंतरिक रूप से अपरकेस के रूप में बनाए जाते हैं। यदि आप स्ट्रिंग के माध्यम से किसी प्रतीक को एक्सेस करना चाहते हैं, तो आपको तब अपरकेस स्ट्रिंग का उपयोग करना होगा।