2012-03-15 8 views
19

मुझे आश्चर्य है कि लूप का उपयोग करने से कम वर्बोज़ तरीका है या नहीं। वैसे भी यह मेरे लिए काम करता है CLISP में:सामान्य लिस्प: किसी दिए गए हैश तालिका की सभी कुंजी एक सूची के रूप में

(loop for key being the hash-keys of *my-hash* collect key) 

मैं maphash का उपयोग कर दूसरों देखा है, लेकिन है कि एक सूची में प्रत्येक कुंजी जमा करना शामिल है। इसके अलावा लूप का उपयोग करने से अधिक शामिल होने के अलावा, यह एक दुष्प्रभाव भी पेश करता है, जिसे मैं जब भी कर सकता हूं उससे बचने की कोशिश करता हूं - मैं जितना संभव हो सके कार्यात्मक प्रोग्रामिंग पसंद करता हूं :)

क्या इस सामान्य के लिए इस तरह कुछ पूर्वनिर्धारित है कार्य, भले ही कार्यान्वयन-विशिष्ट?

(defun hash-keys (hash-table) 
    (loop for key being the hash-keys of hash-table collect key)) 

उत्तर

20

कॉमन लिस्प से पहले "बैटरी-शामिल" दर्शन प्रचलित हो गया से आता है, और सबसे कार्यक्षमता तीसरे पक्ष के पुस्तकालयों और न कार्यान्वयन द्वारा प्रदान की जाने की उम्मीद है। जबकि आम लिस्प को कभी-कभी बड़ी भाषा कहा जाता है, इसकी तुलना सी और इसी तरह की तुलना में की जाती है, लेकिन भाषा ही पाइथन और बड़े पैमाने पर मानक पुस्तकालयों के साथ अन्य भाषाओं की तुलना में काफी छोटी है।

इस विशिष्ट उद्देश्य के लिए, Alexandria सामान्य लिस्प उपयोगिता का एक सामान्य रूप से उपयोग किया जाने वाला संग्रह है। कई अन्य चीजों में से hash-table-keys है।

+2

आम लिस्प अपने समय के लिए बहुत अधिक "बैटरी शामिल" था। लोग अब और अधिक (और विभिन्न प्रकार की) बैटरी की अपेक्षा करते हैं। – Xach

+1

आम लिस्प अब सी की तुलना में थोड़ा बड़ा है, जो अब आईएसओ मानक के करीब 700 पृष्ठों को दबा रहा है। (और 1 9 8 9 में जब यह 200-कुछ पेज था, तो यह केवल थोड़ी अधिक "बैटरी शामिल" भाषा थी।) – Kaz

+0

अधिकांश "बैटरी शामिल" भाषाएं जो इन दिनों लोकप्रिय हैं ** ** ** इस तरह से हैं, क्योंकि कार्य कि आप खुद को लिखने के लिए एक प्रदर्शन नुकसान है। – Kaz

9

(defun hash-keys (hash-table) 
    (loop for key being the hash-keys of hash-table collect key)) 

को परिभाषित क्योंकि कॉमन लिस्प में समारोह संकलित किया गया है में कोई नुकसान नहीं है। यदि आपके विक्रेता ने यह फ़ंक्शन प्रदान किया है, तो यह वही काम करेगा और आपकी तुलना में अधिक कुशल नहीं होगा।

व्याख्या की गई भाषाओं में, लगभग कुछ भी जो आप लिखते हैं, वह "अंतर्निहित" दिनचर्या की तुलना में एक प्रदर्शन नुकसान होता है।

हैश की सामग्री को अपनाना अपमानजनक है; लूप आपको याद दिलाने के बिना हैश को संसाधित करने देता है। तो शायद आप इसके बजाय मैक्रो चाहते हैं (कुछ लिस्पस dohash या एक्सटेंशन के समान) प्रदान करते हैं।

(defmacro do-hash ((key-var val-var hash-expr &optional result-form) &body body) 
    (let ((hash-var (gensym "HASH-"))) 
    `(loop with ,hash-var = ,hash-expr 
      for ,key-var being the hash-keys of ,hash-var 
      for ,val-var being the hash-values of ,hash-var 
      do (progn ,@body) 
      finally (return ,result-form)))) 

या एक हैश मानचित्रण समारोह:

(defun mapc-hash (hash-table fun) 
    (loop for key being the hash-keys of hash-table 
     for value being the hash-values of hash-table 
     do (funcall fun key value))) 

चाहिए भाषा है कि किसी को एक मिनट में लिख सकते हैं इस तरह हर संभव गैजेट होता है?

सामान्य लिस्प में, बैटरी शामिल हैं, लेकिन वे अन्य प्रकार की बैटरी हैं: चीजें जो वास्तव में करना मुश्किल होती हैं। उदाहरण के लिए, compile रन टाइम पर गतिशील रूप से संकलित कोड के लिए फ़ंक्शन। आधे दर्जन अलग-अलग तरीकों से हैश टेबल से खींचने वाली चाबियों या मूल्यों की तुलना में अधिकांश उपयोगकर्ताओं को स्क्रैच से ऐसी चीज विकसित करना अनिवार्य रूप से मुश्किल होगा।

+0

(मैक्रो परिभाषा सुविधाओं का उल्लेख न करें जो आप यहां भी दिखाते हैं ... :))। –

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