2009-09-11 20 views
19

में हैश कुंजी के रूप में स्ट्रिंग ऑब्जेक्ट का उपयोग करके मैं एक "शब्दकोश" प्रकार बनाने की कोशिश कर रहा हूं - यानी एक कुंजी के रूप में एक स्ट्रिंग के साथ हैश तालिका। क्या यह Lisp में संभव या बुद्धिमान है?सामान्य लिस्प

मैंने देखा है कि यह काम करता है के रूप में उम्मीद: करता

> (setq table (make-hash-table)) 
#<HASH-TABLE :TEST EQL size 0/60 #x91AFA46> 
> (setf (gethash 1 table) "one") 
"one" 
> (gethash 1 table) 
"one" 

हालांकि, निम्नलिखित नहीं:

> (setq table (make-hash-table)) 
#<HASH-TABLE :TEST EQL size 0/60 #x91AFA0E> 
> table 
#<HASH-TABLE :TEST EQL size 0/60 #x91AFA0E> 
> (setf (gethash "one" table) 1) 
1 
> (gethash "one" table) 
NIL 
NIL 

उत्तर

31

आप हैश तालिका का उपयोग करता है बनाने की जरूरत है 'बराबर बजाय अगर' eql। 'eql समान सामग्री के साथ दो तारों का मूल्यांकन नहीं करता है, जबकि' बराबर 'होता है।

यहाँ तुम कैसे करते है:

(make-hash-table :test 'equal) 

रूप skypher विख्यात आप भी equalp उपयोग कर सकते हैं 'के बजाय अगर आप केस-संवेदी स्ट्रिंग हैशिंग चाहते हैं।

+3

जस्टिकल, सीएलएचएस सिर्फ एक उदाहरण के रूप में है। यदि यह स्पष्ट नहीं है, तो दस्तावेज़ीकरण को देखकर मदद मिल सकती है: http://www.lispworks.com/documentation/HyperSpec/Body/f_mk_has.htm –

+6

यदि आप केस-असंवेदनशील स्ट्रिंग हैशिंग चाहते हैं तो इसके बजाय EQUALP का उपयोग करें। – skypher

+0

धन्यवाद दोस्तों। मैंने दस्तावेज़ों की जांच की थी, लेकिन मैंने वास्तव में उस विशेष भाग के लिए मेरे साथ कुछ भी जॉग करने के लिए कई समानता कार्यों पर पर्याप्त ध्यान नहीं दिया था। मैं (गलत) धारणा के तहत था कि "इसे केवल वही करना चाहिए जो मुझे चाहिए"। – Justicle

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