2011-02-18 31 views
11

का विकास मैं छवि-आधारित भाषाओं के विचार प्यार करता हूँ, और हाल ही में मैं SBCL के माध्यम से कॉमन लिस्प साथ कर रहा है। मैंने वर्चुअल मशीन की छवि को सहेजने और लोड करने में सक्षम होने के तरीके के बारे में कुछ स्थानों में पढ़ा है, आप उस छवि पर चल रहे ऐप्स या ऐप्स का सेट विकसित कर सकते हैं।एक तुतलाना छवि

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

अब, मैं कोड स्रोत में लिखने और repl के माध्यम से इसे में लोड करते हैं, तो मैं वहाँ एक प्रति है, लेकिन ऐसा लगता है जैसे यह एक स्पष्ट सुविधा होगी।

उत्तर

13

कॉमन लिस्प संकुल का विचार है। संकुल प्रतीकों के लिए एक रजिस्ट्री की तरह हैं और प्रतीकों के लिए नामस्थान के रूप में उपयोग किया जाता है। आप सभी संकुलों की सूची के लिए आम लिस्प से पूछ सकते हैं।

CL-USER 1 > (list-all-packages) 
(#<The SQL-COMMON package, 0/4 internal, 28/32 external> 
#<The LOOP package, 245/256 internal, 3/4 external> 
#<The COMM package, 0/4 internal, 940/1024 external> 
#<The REG package, 41/64 internal, 0/4 external> 
...) 

प्रत्येक संकुल कुछ डेटा संरचना में प्रशिक्षु प्रतीकों संग्रहीत करता है। आप सामान्य लिस्प से पूछ सकते हैं कि कौन से प्रतीकों को पैकेज में प्रशिक्षित किया जाता है।

CL-USER 2 > (loop for symbol being 
       each external-symbol in (find-package "COMMON-LISP") 
      collect symbol) 
(MAKE-ARRAY INVOKE-DEBUGGER STRING-TRIM ...) 

यह आसान बनाने के लिए, सामान्य लिस्प फ़ंक्शन एप्रोपोस और एप्राप्स-लिस्ट प्रदान करता है।

CL-USER 3 > (apropos "MAKE-LOCK") 
MP::INTERNAL-MAKE-LOCK (defined) 
MP:MAKE-LOCK (defined) 
WWW-UTILS:MAKE-LOCK (defined) 
MAKE-LOCK 
RESOURCES::MAKE-LOCK (defined) 
MINIPROC:MAKE-LOCK (defined) 

कार्य, कक्षाएं, आदि उनके पहचानकर्ता के रूप में प्रतीकों का उपयोग करते हैं। आप एक प्रतीक भी पूछ सकते हैं, जो इसे दर्शाता है।

CL-USER 4 > (symbol-function 'www-utils:make-lock) 
#<Function WWW-UTILS:MAKE-LOCK 41E006A69C> 

कभी-कभी एक आम लिस्प भी कार्यों की परिभाषा को रिकॉर्ड करता है। फिर फ़ंक्शन फ़ंक्शन-लैम्ब्डा-एक्सप्रेशन का उपयोग 'इसे' पुनर्प्राप्त करने के लिए किया जा सकता है।

CL-USER 5 > (defun foo (a) (* (sin a) a)) 
FOO 

CL-USER 6 > (pprint (function-lambda-expression 'foo)) 

(LAMBDA (A) 
    (DECLARE (SYSTEM::SOURCE-LEVEL #<EQ Hash Table{0} 41403151C3>)) 
    (DECLARE (LAMBDA-NAME FOO)) 
    (* (SIN A) A)) 

लेकिन आमतौर पर आजकल कॉमन लिस्प कार्यान्वयन दर्ज की परिभाषाओं का उपयोग नहीं है, लेकिन प्रत्येक लिस्प निर्माण के लिए स्रोत के स्थानों को दर्ज करते हैं।

सबसे आम लिस्प कार्यान्वयन एक कार्यान्वयन विशिष्ट तरीके से स्रोत स्थानों को ट्रैक कर सकते हैं।

कॉमन लिस्प मानक को परिभाषित करता है एक समारोह प्रवर्तन निदेशालय।

CL-USER 7 > (ed 'www-utils:make-lock) 

यह एक संपादक (आंतरिक या बाह्य) कहता है और उस समारोह के लिए स्रोत कोड खोल देना चाहिए। यह काम करने के लिए, सामान्य लिस्प को प्रत्येक फ़ंक्शन के लिए स्रोत स्थान का ट्रैक रखने की आवश्यकता होती है। इसके बाद संपादक को उस स्रोत तक पहुंच की आवश्यकता है। कभी-कभी दर्ज किया गया स्थान एक पूर्ण पथ /Users/joswig/lisp/utils.lisp है। अगर संपादक उस फ़ाइल को खोलना चाहता है, तो यह सुलभ होना चाहिए। लेकिन तार्किक पथनाम जैसे http: server; utils.lisp का उपयोग करना भी संभव है। इसका फिर वास्तविक भौतिक पथनाम में अनुवाद किया जाता है। बाद में यह अनुवाद कॉन्फ़िगर किया जा सकता है। तो अलग-अलग पथनामों के साथ एक लिस्प को एक अलग मशीन पर ले जाना संभव होगा, तार्किक पथनाम HTTP को कॉन्फ़िगर करें और फिर लिस्प को अभी भी सभी स्रोत कोड मिल जाएंगे, भले ही यह एक अलग फ़ाइल सिस्टम संरचना के साथ एक अलग मशीन पर हो। तो, इसे काम करने के लिए कुछ विन्यास की आवश्यकता हो सकती है। लेकिन यह एक बहुत उपयोगी सुविधा है और इसका व्यापक रूप से उपयोग किया जाता है।

स्रोत कोड की रिकॉर्डिंग और कैसे स्रोत स्थानों की रिकॉर्डिंग कार्यान्वयन निर्भर है और इसके विकास पर्यावरण के साथ संयोजन में संबंधित लिस्प की एक विशेषता है। बेहतर लिस्प कार्यान्वयन में इस क्षेत्र में बहुत सारी सुविधाएं हैं।

5

तुम भी कर-प्रतीकों का उपयोग या कर-बाह्य-प्रतीकों कर सकते हैं यदि आप पसंद:

उदाहरण:

>> (do-external-symbols (s (find-package :foo-package)) (print s)) 

FOO-PACKAGE:XXX 
FOO-PACKAGE:YYY 
FOO-PACKAGE:ZZZ 
NIL 

कहाँ XXX, YYY & ZZZ पैकेज में सभी बाहरी प्रतीक हैं: foo- पैकेज।

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