2008-11-17 22 views
9

मेरे पास वैश्विक चर की एक बड़ी सूची है जिसमें प्रत्येक का अपना सेटअप फ़ंक्शन है। मेरा लक्ष्य इस सूची में जाना है, प्रत्येक आइटम के सेटअप फ़ंक्शन को कॉल करना है, और मिलान करने वाले चर में लोड किए गए डेटा पर कुछ आंकड़े उत्पन्न करना है। हालांकि, अब मैं जो कोशिश कर रहा हूं वह काम नहीं कर रहा है और मुझे अपने प्रोग्राम को सेटअप कार्यों को कॉल करने में मदद की ज़रूरत है।लिस्प में स्ट्रिंग के रूप में फ़ंक्शन नाम?

वैश्विक चर और उनके सेटअप फ़ंक्शन केस-संवेदी हैं क्योंकि यह XML से आया है और विशिष्टता के लिए आवश्यक है।

'(ABCD ABC\d AB\c\d ...) 

और सेटअप कार्यों इस तरह दिखेगा:

(defun setup_ABCD... 
(defun setup_ABC\d... 

मैं उन्हें एक साथ श्रृंखलाबद्ध और एक समारोह में जिसके परिणामस्वरूप स्ट्रिंग मोड़ की कोशिश की है,

डेटा इस तरह दिखता है लेकिन यह पहले लोड किए गए सेटअप फ़ंक्शन के नामस्थान में हस्तक्षेप करता है। यहाँ कैसे मुझे लगता है कि लागू करने की कोशिश की है:

(make-symbol (concatenate 'string "setup_" (symbol-name(first '(abc\d))))) 

लेकिन इस पर funcall का उपयोग कर काम नहीं करता। मैं इससे कॉल करने योग्य फ़ंक्शन कैसे प्राप्त कर सकता हूं?

+0

यदि कहीं भी आदमी का जवाब काम नहीं करता है, तो टिक पर क्लिक करके इसे स्वीकार करना अच्छा लगेगा। – Pablo

+0

लिस्प में नामांकन मानक हाइफ़न का उपयोग करना है, अंडरस्कोर नहीं। साथ ही, पाठक आंतरिक रूप से सभी प्रतीकों को अपरकेस करता है, और मानक उन्हें कम मामले में लिखना है, इसलिए आपके सेटअप फ़ंक्शन को कॉल करने का मानक तरीका 'setup-abcd' है। – Svante

+0

देरी टिक के लिए खेद है! इसके अलावा सेटअप एफएनएस एक गैर-लिस्पर द्वारा लिखे गए थे। मैंने तब से उसे Norvigs Lisp/AI पुस्तक की मेरी प्रतिलिपि दे दी है। – ktdh

उत्तर

12

ऐसा इसलिए है क्योंकि मेक-सिंबोल एक अनियंत्रित प्रतीक देता है। आपको इसके बजाय INTERN का उपयोग करना चाहिए।

+0

बिंगो! मैं उम्मीद कर रहा था कि यह इतना आसान होगा, धन्यवाद एक गुच्छा! – ktdh

+0

खैर, चेत, अगला कदम: उत्तर स्वीकार करें। – Svante

+0

क्या आप इसे मेरे लिए सीमेंट करने के लिए एक उदाहरण दे सकते हैं, मैं अभी भी थोड़ा उलझन में हूं :( – ajivani

0

मैं या तो इंटरन का उपयोग करता हूं या (संभवतः, आपको 100% सुनिश्चित करने के लिए प्रोफाइल करना होगा) यह एक सहायक कार्य है जो स्ट्रिंग कॉन्सटेनेशन और प्रारंभिक खोज करता है, फिर परिणाम को हैशटेबल (कुंजी मूल प्रतीक से बाहर)। यह एक शुद्ध INTERN/CONCATENATE समाधान से तेज़ हो सकता है, संभावित रूप से कम क्षणिक कचरा उत्पन्न करेगा, लेकिन अधिक दीर्घकालिक भंडारण का उपयोग करके अंततः समाप्त हो जाएगा।

की तर्ज पर

कुछ:

 
(defvar *symbol-function-map* (make-hash-table)) 

(defun lookup-symbol (symbol) 
    (or (gethash symbol *symbol-function-map*) 
     (let ((function-name (intern (concatenate 'string "setup_" (symbol-name symbol))))) 
     (setf (gethash symbol *symbol-function-map*) (symbol-function function-name))))) 

आप समारोह में ही समारोह के नाम पर है, बजाय की आवश्यकता है, प्रतीक-समारोह के लिए कॉल को छोड़ दें।

0
(funcall (read-from-string (concatenate 'string "setup_" (symbol-name(first '(abc\d)))))) 

भी काम करता है।

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