2008-09-05 14 views
7

मैं लिस्प में निम्नलिखित कार्यक्षमता के लिए हर जगह खोज की गई है, और कहीं मिल गया है:क्या मैं इसे लिस्प में कर सकता हूं?

  1. एक सूची में कुछ के सूचकांक पाते हैं। उदाहरण:

    (index-of item InThisList) 
    
  2. किसी सूची में किसी विशिष्ट स्थान पर कुछ स्थानांतरित करें। उदाहरण:

    (replace item InThisList AtThisIndex) ;i think this can be done with 'setf'? 
    
  3. एक विशिष्ट इंडेक्स पर एक आइटम लौटाएं। उदाहरण:

    (return InThisList ItemAtThisIndex) 
    

इस बिंदु तक, मैं इसे अपने खुद के कार्यों के साथ faking किया गया है। मैं सोच रहा हूं कि क्या मैं सिर्फ अपने लिए और अधिक काम कर रहा हूं।

यह मैं कैसे संख्या 1 faking गया है:

(defun my-index (findMe mylist) 
    (let ((counter 0) (found 1)) 
    (dolist (item mylist) 
     (cond 
     ((eq item findMe) ;this works because 'eq' checks place in memory, 
        ;and as long as 'findMe' was from the original list, this will work. 
     (setq found nil) 
     (found (incf counter)))) 
    counter)) 

उत्तर

23

मैं एक noob अपने आप को कर रहा हूँ, लेकिन आप setf और nth उपयोग कर सकते हैं नंबर 2 और 3.

(let ((myList '(1 2 3 4 5 6))) 
    (setf (nth 4 myList) 101); <---- 
    myList) 

(1 2 3 4 101 6) 

करने के लिए नंबर एक के बारे में कोई सुराग नहीं।

EDIT: नंबर एक के लिए आप the position function का उपयोग कर सकते हैं। हा।

(let ((myList '(1 2 3 4 5 6))) 
    (setf (nth 4 myList) 101) 
    (list myList (position 101 myList))) 

((1 2 3 4 101 6) 4) 

मुझे ये सभी in this index मिला।

4

जेरेमी के उत्तरों को काम करना चाहिए; लेकिन यह है कि ने कहा कि यदि आप पाते हैं अपने आप को जैसे

(setf (n वें मैं अपने-सूची) नए-ईएलटी)

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

या शायद आप सूचियों को टुपल्स के रूप में उपयोग कर रहे हैं। उस मामले में, वे ठीक होना चाहिए। लेकिन आप शायद एक्सेसर्स का नाम देना चाहते हैं ताकि आपके कोड को पढ़ने वाले किसी को यह याद रखना पड़े कि "nth 4" का क्या अर्थ है। कुछ

(defun my-attr (list) 
    (nth 4 list)) 

(defun (setf my-attr) (new list) 
    (setf (nth 4 list) new)) 
+0

इसके अलावा, हम किसी सूची में तत्व को प्रतिस्थापित नहीं कर रहे हैं। हम पहले (आर -1) तत्वों की प्रतिलिपि बना रहे हैं और नए मान को आर में डाल रहे हैं, जहां यह सीडीआर (आर + 1) तत्व से जुड़ा हुआ है - चूंकि हम दृढ़ता से निपट रहे हैं। – nlucaroni

0

मुझे थॉमस से सहमत होना है। यदि आप सरणी जैसे सूचियों का उपयोग करते हैं तो यह धीमा होने वाला है (और संभवतः अजीब)। तो आपको या तो आपके द्वारा लिखे गए कार्यों के साथ सरणी या छड़ी का उपयोग करना चाहिए, लेकिन उन्हें "अप" को एक तरह से ले जाना चाहिए ताकि आप धीमी सूचियों को बाद में सरणी के साथ आसानी से बदल सकें।

11
  1. किसी सूची में किसी चीज़ का सूचकांक ढूंढें।

    > (setq numbers (list 1 2 3 4)) 
    (1 2 3 4) 
    > (position 3 numbers) 
    2 
    

    योजना में, यहाँ DrScheme के दस्तावेज़ से एक पूंछ पुनरावर्ती कार्यान्वयन है::

Emacs लिस्प और कॉमन लिस्प में, आप position कार्य हो

(define list-position 
    (lambda (o l) 
    (let loop ((i 0) (l l)) 
     (if (null? l) #f 
      (if (eqv? (car l) o) i 
       (loop (+ i 1) (cdr l))))))) 

---------------------------------------------------- 

> (define numbers (list 1 2 3 4)) 
> (list-position 3 numbers) 
2 
> 

लेकिन यदि आप संरचित डेटा स्टोर करने के लिए स्लॉट के संग्रह के रूप में एक सूची का उपयोग कर रहे हैं, तो आपको defstruct या यहां तक ​​कि किसी प्रकार का लिस्प ओ देखना चाहिए सीएलओएस जैसी प्रणाली को इंजेक्ट करें।

यदि आप लिस्प सीख रहे हैं, तो सुनिश्चित करें कि आपको Practical Common Lisp और/या The Little Schemer पर एक नज़र डालें।

चीयर्स!

7

उत्तर:

  1. (स्थिति आइटम अनुक्रम & से अंत कुंजी (शुरू 0) अंत कुंजी परीक्षण परीक्षण नहीं)
    http://lispdoc.com/?q=position&search=Basic+search

  2. (setf (ईएलटी अनुक्रम इंडेक्स) मूल्य)

  3. (ईएलटी अनुक्रम सूचकांक)
    http://lispdoc.com/?q=elt&search=Basic+search
    नोट: क्योंकि elt किसी भी क्रम पर काम करता है elt nth बेहतर है, न सिर्फ "प्रैक्टिकल कॉमन लिस्प" के लिए सूचीबद्ध करता है

4

+2। यह एक आम लिस्प कुकबुक का मिश्रण है और एक गुणवत्ता टीच स्वयं लिस्प पुस्तक है।

"सफल सामान्य लिस्प" (http://www.psg.com/~dlamkins/sl/cover.html और http://www.psg.com/~dlamkins/sl/contents.html) भी है जो "प्रैक्टिकल कॉमन लिस्प" में कुछ अंतराल/विस्तारित चीजें भरने लगते थे।

मैंने पॉल ग्राहम के "एएनएसआई कॉमन लिस्प" को भी पढ़ा है जो भाषा की मूल बातें के बारे में अधिक है, लेकिन संदर्भ मैनुअल का एक और अधिक है।

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

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