2009-07-06 22 views
5

मैं कुछ तुतलाना initialisation कोड है उपयोग करने के लिए एक अलग अभिव्यक्ति में मूल्यांकन किया जाना:क्यों 'की आवश्यकता होती है' चाहिए पैकेज

(eval-when (:compile-toplevel :load-toplevel :execute) 
    (require 'asdf)) 

(eval-when (:compile-toplevel :load-toplevel :execute) 
    (push #p"c\:\\lisp\\clsql-4.0.4\\" asdf:*central-registry*)) 

उस संस्करण क्यों संकलित करता है, जबकि इस संस्करण:

(eval-when (:compile-toplevel :load-toplevel :execute) 
    (require 'asdf) 
    (push #p"c\:\\lisp\\clsql-4.0.4\\" asdf:*central-registry*)) 

asdf एक अपरिचित पैकेज के साथ, तीसरी पंक्ति में संकलन फ़ाइल के दौरान एक त्रुटि उत्पन्न करता है?

मैं सीसीएल का उपयोग कर रहा हूं, और (एएसएफएफ की आवश्यकता है) को एएसडीएफ के अंतर्निहित संस्करण में लाने के रूप में दस्तावेज किया गया है।

उत्तर

9

निम्नलिखित कुछ विवरण में गलत हो सकता है, लेकिन यह लगभग इस तरह है:

वहाँ चार चरणों कि लिस्प "इंजन" के माध्यम से चला जाता है कर रहे हैं:, समय, मैक्रो विस्तार समय पढ़ने के समय संकलन, और समय चलाने ।

प्रत्येक शीर्ष-स्तर का फॉर्म पूरी तरह से पूरी तरह से पढ़ा जाता है। हालांकि, पढ़ना संबंधित प्रतीकों का संकल्प शामिल है। चूंकि एएसडीएफ अभी तक आपके eval-when फॉर्म के पढ़ने के समय लोड नहीं हुआ है, इसलिए प्रतीक asdf:*central-registry* को अभी तक हल नहीं किया जा सकता है, और यह उल्लिखित पढ़ने त्रुटि उत्पन्न करता है।

4

Svante द्वारा जवाब देखें।

कभी-कभी आप इसके आसपास काम करना चाहेंगे। फिर आपको RUNTIME पर कोड में प्रतीक देखने की आवश्यकता है।

(push somepath (symbol-value (find-symbol "*CENTRAL-REGISTRY*" "ASDF"))) 

कोड ऊपर, इस्तेमाल किया जा सकता है क्योंकि प्रतीक asdf: * केंद्रीय-रजिस्ट्री * सीधे इस्तेमाल नहीं किया है लेकिन प्रतीक नाम और पैकेज नाम का उपयोग क्रम में ऊपर देखा।

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