2016-05-01 4 views
5

मैं निम्नलिखित कार्य हो:Emacs लिस्प: # से एक नया हैश तालिका हर बार पैदा नहीं करता

(defun inc-map() 
    (let ((ht #s(hash-table test contents-hash))) 
    (dolist (i (list 1 2 3 4)) 
     (let ((old-val (or (gethash "foo" ht) 
      0))) 
    (puthash "foo" (+ 1 old-val) ht))) 
    ht)) 

तथ्य यह समारोह स्थानीय स्तर पर ht प्रतीक परिभाषित करने के लिए लगता है कि बावजूद, समारोह प्रतीत नहीं होता संदर्भित पारदर्शी होना। विशेष रूप से, इसे एक बार कॉल करना हैश टेबल "foo" -> 4 लौटाता है, इसे दूसरी बार "foo" -> 8 देता है, एक तीसरा समय "foo" -> 12 देता है और इसी तरह।

वास्तव में यहां क्या चल रहा है और मैं इस फ़ंक्शन को संदर्भित रूप से पारदर्शी (और "foo" -> 4 प्रत्येक बार वापस कैसे बदल सकता हूं)?

उत्तर

5

इसे एक (मामूली) प्रलेखन बग माना जा सकता है, जिसमें यह थोड़ा दृढ़ता से सुझाव देता है कि मुद्रित प्रतिनिधित्व का उपयोग नया हैश तालिका बनाता है - एक बयान जो गलत व्याख्या के लिए खुला है।

हालांकि, आप ध्यान दें कि प्रलेखन कहता है कि यह पाठक है जो हैश तालिका के मुद्रित प्रतिनिधित्व को पहचानता है।

इसलिए #s का उपयोग make-hash-table पर कॉल करने जैसा नहीं है। यहां अंतर '(1 2 3) सूची उद्धृत करने और (list 1 2 3) पर कॉल करने के बीच अंतर के बराबर है।

प्रत्येक मामले में पूर्व पाठक द्वारा संसाधित किया जाता है और इसलिए प्रत्येक मूल्यांकन के दौरान एकल परिणामस्वरूप ऑब्जेक्ट (हैश तालिका या सूची क्रमशः) देखी जाती है।

इसके विपरीत, बाद के उदाहरणों में पाठक कोड उत्पन्न कर रहा है, जब मूल्यांकन किया जाता है, तो एक नई हैश तालिका या सूची तैयार करेगा; और इसलिए आप प्रत्येक मूल्यांकन के दौरान एक नई वस्तु देखते हैं।

+0

क्या '' (1 2 3) 'को संशोधित करना संभव है, इसलिए यह वास्तव में न केवल' 1 2 3' के साथ सूची लौटाता है? – fghj

+0

उपयोगकर्ता 1034749: मुझे यकीन नहीं है कि मैं सवाल समझता हूं। किसी भी एक्स के लिए 'एक्स' '(उद्धरण एक्स)' के लिए लघुरूप है। एक्स elisp पाठक द्वारा समझा कोई भी रूप हो सकता है, और यह पाठक द्वारा बनाई गई वस्तु का मूल्यांकन करेगा। 'Ch f quote' – phils

+0

देखें, आप '# s' और' '(1 2 3)' के बीच समानता बनाते हैं, प्रश्न # # (कुछ) 'और' #s (कुछ)' में अलग-अलग परिणाम दे सकते हैं, तो क्या यह है '' (1 2 3) 'कई बार मूल्यांकन के विभिन्न परिणामों को प्राप्त करने के लिए संभव है? अगली बार '' (1 2 3) 'पहली बार, और' '(1 2 3 4)' की तरह? – fghj

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