2011-12-07 13 views
8

बनाने एक अलग फाइल में defpackage डाल करने के लिए यह बेहतर है उदाहरण नीचे कैप्सूलीकरण करने का एक उदाहरण के रूप में पॉल Grahams एएनएसआई कॉमन लिस्प में दी गई है:जब संकुल

(defpackage "CTR" 
    (:use "COMMON-LISP") 
    (:export "COUNTER" "INCREMENT" "CLEAR")) 

(in-package ctr) 

;function definitions here 
हालांकि पीटर Seibels में

प्रैक्टिकल कॉमन लिस्प, लिंक here, वे कहते हैं:

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

तो वह प्रत्येक पैकेज के लिए दो फाइलें बनाने की सिफारिश करता है, एक डिफैकेज और कोड के लिए एक। डिफैकेज वाले फ़ाइलें (इन-पैकेज "COMMON-LISP-USER") से शुरू होनी चाहिए।

मेरे लिए ऐसा लगता है कि इन-पैकेज और कोड से पहले, उसी फ़ाइल में डिफैकेज को डालने जैसा लगता है, यह सुनिश्चित करने के लिए पैकेज को परिभाषित करने का एक अच्छा तरीका है। तो पहली विधि, सब कुछ एक फ़ाइल में इकट्ठा करना आसान लगता है। पैकेज निर्माण के लिए इस विधि का उपयोग करने में कोई समस्या है?

उत्तर

8

मुझे लगता है कि defpackage लिए एक अलग फ़ाइल का उपयोग करते हुए एक अच्छी आदत वजह से है:

  • आप «नापाक» defpackage के साथ अपनी फ़ाइलें नहीं है।
  • यह निर्यात/छाया/... प्रतीकों को ढूंढना आसान बनाता है, आप जानते हैं कि आपको package.lisp पर देखना होगा।
  • जब आप एएसडीएफ का उपयोग करते हैं तो आपको आदेश के बारे में चिंता करने की ज़रूरत नहीं है।

    (defsystem :your-system 
        :components ((:file "package") 
           ... the rest ...))` 
    
  • पीटर साइबल तो कहते हैं;)

संपादित करें: मैं quickproject जो नई सीएल परियोजनाओं के निर्माण की सुविधा उल्लेख करना भूल गया।

REPL> (quickproject:make-project "~/src/lisp/my-wonderful-project/" 
           :depends-on '(drakma cl-ppcre local-time))` 

यह आदेश एक निर्देशिका "~/src/lisp/my-wonderful-project/" और निम्न फ़ाइलों को पैदा करेगा:

  • package.lisp
  • my-wonderful-project.asd (filled)
  • my-wonderful-project.lisp
  • README.txt

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

+2

मुझे लगता है कि ऑर्डर चीज उन लोगों का सबसे महत्वपूर्ण कारण है, और एक दूसरे का है: पैकेज कई फाइलों पर विभाजित होते हैं। –

+1

मैं एकल फ़ाइल परियोजनाओं के मामले को छोड़कर, आपसे सहमत हूं, जहां आप एक ही फाइल में पैकेज परिभाषा डाल सकते हैं। AFAIK, यह मानक द्वारा निषिद्ध नहीं है। –

+0

एएसडीएफ का उपयोग करते समय एकाधिक फाइलें और ऑर्डरिंग समझ में आता है। पहले दो अंक व्यक्तिगत वरीयता की तरह दिखते हैं। – snowape

1

मैं अपनी अधिकांश परियोजनाओं के लिए एकाधिक स्रोत कोड फ़ाइलों, एकल "packages.lisp" फ़ाइल और एक गायक "project.asd" सिस्टम परिभाषा फ़ाइल का उपयोग करता हूं। यदि परियोजना को कई पैकेजों की आवश्यकता है, तो वे सभी निर्यात किए गए स्थान पर प्रासंगिक निर्यात के साथ "packages.lisp" में परिभाषित किए गए हैं।

0

DEFPACKAGE को अपनी फ़ाइल में डालने का यही कारण है: यदि आपके पास एक बड़ा पैकेज है, तो आपके पास संबंधित कार्यों के कई समूह हो सकते हैं, और आप प्रति फ़ंक्शन समूह के अलग-अलग स्रोत फ़ाइलों को रखना चाहते हैं। फिर सभी स्रोत फ़ाइलों के शीर्ष पर अपना स्वयं का पैकेज होगा, लेकिन वे सभी बाहरी DEFPACKAGE को "साझा" करेंगे। तब तक जब तक आप पहले लोड किए गए DEFPACKAGE को प्राप्त करते हैं, इससे कोई फर्क नहीं पड़ता कि आप अन्य स्रोत फ़ाइलों को लोड करते हैं।

एक उदाहरण जो मैं वर्तमान में काम कर रहा हूं, में पैकेज में कई वर्ग हैं, और स्रोत फ़ाइलों को प्रति वर्ग होने के लिए विभाजित किया गया है, प्रत्येक में कक्षा परिभाषा और संबंधित जेनेरिक फ़ंक्शन और विधि परिभाषाएं हैं।