2011-09-15 14 views
5

मैं इस तरह कुछ करना चाहता हूं:मैं आम लिस्प में अनुक्रमिक रूप से संरचना का कन्स्ट्रक्टर मूल्यांकन कैसे कर सकता हूं?

(defstruct person 
    real-name 
    (fake-name real-name)) ;if fake-name not supplied, default to real-name 

हालांकि, सामान्य लिस्प कहते हैं The variable REAL-NAME is unbound. तो मैं अपने तर्कों का अनुक्रमिक रूप से मूल्यांकन करने के लिए कन्स्ट्रक्टर कैसे प्राप्त कर सकता हूं (जैसे मैं फ़ंक्शन कीवर्ड तर्कों के साथ कर सकता हूं), या कैसे और चाहिए मैं बेहतर कर रहा हूँ?

उत्तर

10

एक ही रास्ता है:

(defstruct (person 
      (:constructor make-person (&key real-name 
              (fake-name real-name)))) 
    real-name 
    fake-name) 

आप अनिवार्य रूप से, अपनी आवश्यकताओं के निर्माता समारोह से तैयार की तुलना में make-xxx

  • लिस्प होने के लिए एक "दर-आदेश उत्पन्न एक अलग नाम उपलब्ध कराने के

    • सहित कर सकते हैं -फ-तर्क "(बीओए) कन्स्ट्रक्टर की बजाय एक कीवर्ड-आधारित एक

    पर विचार करें

    (defstruct (person 
          (:constructor make-person (real-name 
                 &optional (fake-name real-name)))) 
        real-name 
        fake-name) 
    

    यहां तक ​​कि आप &aux लैम्ब्डा-सूची में कीवर्ड का प्रयोग कर बनाया क्षेत्रों प्रारंभ:

    (defstruct (person 
          (:constructor make-person (real-name 
                 &aux (fake-name (format nil 
                       "fake-of-~A" 
                       real-name))))) 
        real-name 
        fake-name) 
    
  • संबंधित मुद्दे