2009-02-08 5 views
5

आम तुतलाना में मैंने देखा है कि मैं यह लिख सकते हैं:क्या मैं अन्य स्लॉट को डिफस्ट्रक्ट में संदर्भित कर सकता हूं?

(defun foo (&key (a 1) (b 2) (c (+ a b))) (print (+ a b c))) 

और जब मैं (foo) फोन, 6 छपा है। तो तर्क ca और b के लिए मान सेट देख सकते हैं। लेकिन मुझे defstruct के साथ कुछ ऐसा करने का कोई तरीका नहीं दिख रहा है। कुछ ऐसा:

CL-USER> (defstruct thing a b c) 
THING 
CL-USER> (setq q (make-thing :a 1 :b 2 :c (+ a b))) 
; Evaluation aborted 
CL-USER> (setq q (make-thing :a 1 :b 2 :c (+ :a :b))) 
; Evaluation aborted 

क्या ऐसा करने का कोई तरीका है?

उत्तर

7

आप :constructordefstruct के विकल्प का उपयोग कर ऐसा कर सकते हैं।

CL-USER> (defstruct (thing 
         (:constructor make-thing (&key a b (c (+ a b))))) 
      a b c) 
THING 
CL-USER> (make-thing :a 1 :b 2) 
#S(THING :A 1 :B 2 :C 3) 

अधिक जानकारी के लिए, defstruct के लिए CLHS प्रविष्टि देखें।

+0

आह, यह मैं क्या के लिए ... धन्यवाद उम्मीद थी की तरह लगता है! – casper

3

इस तरह से नहीं। लेकिन लिस्प पाठक चाल का उपयोग कर आप कर सकते हैं:

(make-thing :a #1=1 :b #2=2 :c (+ #1# #2#)) 

अन्यथा defclass का उपयोग करें और सामान्य समारोह shared-initialize विशेषज्ञ हैं।

ध्यान दें कि ये पाठक मैक्रोज़ फॉर्म का संदर्भ लेंगे, इसका मूल्यांकन करने के नतीजे नहीं। इस प्रकार

(make-thing :id #1=(generate-unique-id) :my-id-is #1#) 

generate-unique-id करने के लिए एक thingसाथ दो अलग कॉल कर देगा।

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

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