2010-05-25 8 views
6

अजगर में, आप (1, 4, 3) पाने के लिएनिकालने/टुकड़े/पुनर्मूल्यांकन सूचियों (emacs) lisp में?

i = (0, 3, 2) 
x = [x+1 for x in range(0,5)] 
operator.itemgetter(*i)(x) 

की तरह कुछ कर सकता है। में (Emacs) तुतलाना, मैं इस समारोह निकालने जो कुछ ऐसा ही कहा जाता है,

(defun extract (elems seq) 
    (mapcar (lambda (x) (nth x seq)) elems)) 

(extract '(0 3 2) (number-sequence 1 5)) 

लिखा था, लेकिन मैं की तरह में निर्मित कुछ वहाँ जाना चाहिए महसूस होता है? मुझे पता है कि first, last, rest, nth, car, cdr है ... जाने का क्या तरीका है? ~ अग्रिम धन्यवाद ~

उत्तर

4

यदि आपकी समस्या गति है तो तत्व प्राप्त करने के लिए (वेक्टर 1 2 3 4 5) का उपयोग करें, और (एएसएफ वीसी इंडेक्स) तत्व प्राप्त करने के लिए।

(defun extract (elems seq) 
    (let ((av (vconcat seq))) 
    (mapcar (lambda (x) (aref av x)) elems))) 

आप उसी क्रम में कई बार निश्चित रूप से यह मतलब सिर्फ एक बार एक सदिश में अनुक्रम स्टोर करने के लिए से निकालने के लिए जा रहे हैं। पायथन सूची वास्तव में एक-आयामी सरणी हैं, एलआईएसपी के बराबर वैक्टर हैं।

+0

उसे नहीं पता था। इसलिए इस समस्या के लिए मुझे यह तय करना है कि वेक्टर बनाने का ओवरहेड निरंतर-समय तक पहुंच के अतिरिक्त ओवरहेड के लायक है या नहीं। – hatmatrix

2

मैंने केवल elisp में सरल स्क्रिप्टिंग किया है, लेकिन यह अपेक्षाकृत छोटी भाषा है। और extract लिंक की गई सूचियों पर एक बहुत ही अक्षम कार्य है, जो emacs lisp में डिफ़ॉल्ट डेटा संरचना है। तो यह अंतर्निहित होने की संभावना नहीं है।

आपका समाधान सबसे अच्छा सरल है। यह एन^2 है, लेकिन इसे तेजी से बनाने के लिए बहुत अधिक कोड की आवश्यकता है।

नीचे यह कैसे काम कर सकते हैं पर एक अनुमान है, लेकिन यह भी पूरी तरह से बंद आधार हो सकता है:

  1. तरह elems (एन लॉग इन करें n)
  2. एक नक्शा है कि करने के लिए हल कर elem में तत्वों के नक्शे बनाने के उनके मूल elem में सूचकांक (शायद एन लॉग एन, शायद एन)
  3. seq के माध्यम से पुनरावृत्त करें और elem क्रमबद्ध करें। में सॉर्ट elem (शायद n, हो सकता है n n प्रवेश करते है, चाहे वह एक हैश नक्शा या एक पेड़ नक्शा है के आधार पर)
  4. तरह elem मानचित्रण के मूल्यों से परिणाम (एन लॉग इन करें n) केवल सूचकांक
रखें
+0

ग्रेट - धन्यवाद ... – hatmatrix

1

My Lisp Experiences and the Development of GNU Emacs से:

1985, जो बिना वर्चुअल मेमोरी एक मेगाबाइट मशीनों था उन दिनों में लोग थे। वे जीएनयू Emacs का उपयोग करने में सक्षम होना चाहता था। इसका मतलब था कि मुझे कार्यक्रम को जितना संभव हो सके छोटा रखना था।

उदाहरण के लिए, उस समय केवल लूपिंग निर्माण 'जबकि' था, जो बेहद सरल था। 'समय' कथन से बाहर निकलने का कोई तरीका नहीं था, आपको बस पकड़ और फेंकना था, या लूप चलाने वाले चर का परीक्षण करना था। इससे पता चलता है कि मैं चीजों को छोटा रखने के लिए कितना दूर धक्का दे रहा था। हमारे पास 'कैर' और 'कैडर' नहीं था और इसी तरह; "हर संभव चीज़ को निचोड़ें" जीएनयू एमएक्स की भावना, शुरुआत से एमाक्स लिस्प की भावना थी।

जाहिर है, मशीनें अब बड़ी हैं, और हम अब ऐसा नहीं करते हैं। हम 'कैर' और 'कैडर' में डालते हैं, और हम इन दिनों में से एक और लूपिंग निर्माण कर सकते हैं।

तो मेरा अनुमान है, अगर आप इसे नहीं देखते हैं, तो यह नहीं है।

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