2011-06-14 13 views
6

मैं कॉमन लिस्प में एक कार्यक्रम है, जिसमें मैं इस बुनियादी रूपरेखा के साथ एक समारोह की जरूरत है लिख रहा हूँ:चर मुसीबत तुतलाना

(defun example (initial-state modify mod-list) 
    (loop for modification in mod-list 
     collecting (funcall modify initial-state modification))) 

समस्या यह है कि मैं initial-state जरूरत है हर बार यह पारित हो जाता है एक ही हो रहा है modify पर, लेकिन modify विनाशकारी हो सकता है। मैं बस एक प्रतिलिपि बनाउंगा, लेकिन मैं इस बारे में कोई धारणा नहीं बनाना चाहता कि किस प्रकार का डेटा initial-state है।

मैं यह कैसे कर सकता हूं? या यह भी संभव है?

धन्यवाद!

उत्तर

7

यदि फ़ंक्शन विनाशकारी हो सकता है और आप इसके बारे में कुछ भी नहीं कर सकते हैं तो यह स्पष्ट है कि आपको initial-state की प्रतियां बनाने की आवश्यकता है।

initial-state में किस तरह का डेटा पूर्व-कॉन्फ़िगर करने से बचने की संभावना है, कॉलर के लिए स्पष्ट रूप से एक समस्या प्रदान करने या इसे एक सामान्य ऑपरेशन करने और विधि प्रदान करने के लिए किसी और पर भरोसा करने के लिए है।

;; Version 1: the caller must provide a function that 
;;   returns a new fresh initial state 
(defun example (build-initial-state modify mod-list) 
  (loop for modification in mod-list 
        collecting (funcall modify (funcall build-initial-state) modification))) 

;; Version 2: copy-state is a generic function that has been 
;;   specialized for the state type 
(defun example (initial-state modify mod-list) 
  (loop for modification in mod-list 
        collecting (funcall modify (copy-state initial-state) modification))) 

पहले संस्करण अधिक सामान्य है क्योंकि यह राज्य किसी भी वस्तु होने के लिए है, जबकि दूसरा संस्करण में प्रतिलिपि आपरेशन (राज्य ऑब्जेक्ट प्रकार पर निर्भर करता है और इसका मतलब है कि आप दो कॉल दोनों के साथ राज्य के रूप में सूची का उपयोग नहीं हो सकता है की अनुमति देता है एक अलग प्रति अर्थपूर्ण)। हालांकि copy-state एक सामान्य ऑपरेशन है जिसे शायद अन्य स्थानों में उपयोग किया जा सकता है और ऑपरेशन को सामान्य वृद्धि उपयोगिता (आपको इसके बजाय बिल्डर फ़ंक्शन को पास करने की आवश्यकता नहीं है); यह compare-state, write-state, read-state जैसे अन्य सामान्य परिचालनों की शुरूआत की अनुमति देता है ...

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