2009-09-13 6 views
7

मैं "लिस्प पर" पढ़ रहा हूं और इस कोड का सामना कर रहा हूं (मैंने इसे थोड़ा सा सरल बना दिया है)।'(ए बी सी) और (सूची' ए 'बी' सी) के बीच क्या अंतर है?

CL-USER> (defun foo()               
      '(a b c)) 
FOO                    
CL-USER> (foo) 
(A B C)                   
CL-USER> (nconc * '(D E)) 
(A B C D E)                  
CL-USER> (foo) 
(A B C D E) 
CL-USER> (defun foo()               
      (list 'a 'b 'c)) 
STYLE-WARNING: redefining FOO in DEFUN           
FOO                    
CL-USER> (foo) 
(A B C)                   
CL-USER> (nconc * '(D E)) 
(A B C D E)                  
CL-USER> (foo) 
(A B C) 
  • वास्तव में क्या * मतलब है? क्या यह पिछले फंक्शन कॉल है? क्या यह असली दुनिया कोड में उपयोग करने के लिए उपयुक्त है?

  • (nconc * '(D E)) क्यों पहले foo फ़ंक्शन का रिटर्न मान बदलता है?

  • मैंने हमेशा सोचा (list 'a 'b 'c) और '(a b c) समान हैं? अंतर क्या है?

उत्तर

14

लिस्ट की कॉल प्रत्येक बार मूल्यांकन होने पर एक नई सूची बनाता है। सूची शाब्दिक संकलन के बाद केवल पढ़ने के लिए स्मृति खंड में रखा जा सकता है। एनसीओएनसी के साथ सूचियों पर एक विनाशकारी अद्यतन तब समस्याग्रस्त है, संभवतः अपरिभाषित परिणामों के साथ (विभाजन त्रुटि, भविष्य के संदर्भों के लिए शाब्दिक रूप से बदलना, या कुछ भी नहीं)।

+0

कि नहीं सोचा था;) –

8

चर *, ** और *** भाषा standard भाषा द्वारा निर्दिष्ट हैं और चीजों का परीक्षण करते समय वे काफी उपयोगी हैं। वे आरईपीएल की एक विशेषता है, और ऐसा नहीं है, और "असली दुनिया कोड" में उपयोगी नहीं है।

+0

+1 HyperSpec संदर्भ के लिए – sigjuice