2011-12-14 27 views
6

मैं घोंसले वाले हिस्सों को अपने हिस्सों में गुजरने के लिए वस्तुओं की संरचना (सीएलओएस प्रकार) बनाने के लिए एक नेस्टेड प्लिस्ट का उपयोग कर रहा हूं। मैं नेस्टेड प्लिस्ट को एक पुनरावृत्ति तरीके से जोड़ना चाहता हूं, लेकिन इसलिए मैं समय और स्मृति के मामले में इसे कुशलता से करना चाहता हूं।सामान्य लिस्प: एक नेस्टेड प्लिस्ट को कुशलता से

नीचे दिए गए उदाहरण एक यात्रा की वजह से डेल्टा पता चलता है:

'(:airframer "Boeing" :type "777" :wing-plist ((:side :left :winglet? nil) 
               (:side :right :winglet? nil))) 

में

'(:airframer "Boeing" :type "777" :wing-plist ((:type :main-wing :side :left) 
               (:type :main-wing :side :right) 
               (:type :stabilizer :size :left))) 

मैं पहले से ही पढ़ा है कि सूचियों के बजाय वैक्टर का उपयोग, मदद कर सकता है के रूप में आप भी बिना तत्वों का उपयोग बहुत जुर्माना: Replace an item in a list in Common Lisp?। हालांकि, मैं वास्तव में वैक्टरों के उपयोग को बाईपास करना चाहता हूं।

इसके अलावा, मुझे लगता है कि एक विनाशकारी कार्य का उपयोग स्मृति और उम्मीदवार गणना समय को बचाएगा।

इस समय मैंने इसे हल किया है, लेकिन मुझे लगता है कि यह सुरुचिपूर्ण और कुशल नहीं है। कार्य fill विनाश के लिए प्रयोग किया जाता है।

(defun append-nested-plist (plist key sub-plist) 
    (let* ((key-pos (position key plist))) 
    (fill plist (append (getf plist key) (list sub-plist)) 
      :start (+ key-pos 1) :end (+ key-pos 2)))) 

मैं आपके उत्तरों की प्रतीक्षा कर रहा हूं।

उत्तर

3

इस बारे में कैसे?

(defmacro push-to-end (item place) 
    `(setf ,place (nconc ,place (list ,item)))) 
:

(defun append-nested-plist (plist key sub-plist) 
    (push-to-end sub-plist (getf plist key)) 
    plist) 

पुश-टू-एंड एक सामान्य रूप में परिभाषित किया गया मैक्रो है कि आम तुतलाना मानक का हिस्सा नहीं है