2008-09-05 6 views
7

Ich habe überall für die folgenden Funktionen in Lisp gesucht und nirgends bekommen:Kann ich das in Lisp tun?

  1. den Index etwas in einer Liste finden. Beispiel:

    (index-of item InThisList) 
    
  2. etwas an einer bestimmten Stelle in einer Liste ersetzen. Beispiel:

    (replace item InThisList AtThisIndex) ;i think this can be done with 'setf'? 
    
  3. geben Sie ein Element an einem bestimmten Index zurück. Beispiel:

    (return InThisList ItemAtThisIndex) 
    

Bis zu diesem Punkt, ich habe es mit eigenen Funktionen wurden vorgetäuscht. Ich frage mich, ob ich nur mehr Arbeit für mich selbst erschaffe.

Dies ist, wie ich die Nummer 1 vorgetäuscht worden bin:

(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)) 

Antwort

23

Ich bin ein noob mich, aber Sie können setf und nth zu tun Nummer 2 und 3.

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

(1 2 3 4 101 6) 

verwenden Keine Ahnung von Nummer eins.

EDIT: Für Nummer eins können Sie the position function verwenden. Ha.

(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) 

Ich fand diese alle in this index.

4

Jeremys Antworten sollten funktionieren; aber das heißt, wenn Sie sich das Schreiben von Code finden wie

(setf (n i my-Liste) neu-ELT)

Sie wahrscheinlich die falsche Datenstruktur verwenden. Listen sind einfach verkettete Listen, also sind sie O (N), auf die nach Index zugegriffen werden kann. Sie könnten besser mit Arrays arbeiten.

Oder vielleicht verwenden Sie Listen als Tupel. In diesem Fall sollten sie in Ordnung sein. Aber Sie wollen wahrscheinlich Accessoren benennen, damit jemand, der Ihren Code liest, sich nicht merken muss, was "nth 4" bedeuten soll. Etwas wie

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

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

Außerdem ersetzen wir kein Element in einer Liste. Wir kopieren die ersten (r-1) -Elemente und setzen den neuen Wert in r, wobei cdr mit dem (r + 1) -Element verbunden ist - da es sich um Persistenz handelt. – nlucaroni

0

Ich muss Thomas zustimmen. Wenn Sie Listen wie Arrays verwenden, dann wird das nur langsam (und möglicherweise peinlich) sein. Sie sollten also entweder Arrays verwenden oder bei den Funktionen bleiben, die Sie geschrieben haben, aber sie so "nach oben" verschieben, dass Sie die langsamen Listen später problemlos durch Arrays ersetzen können.

11
  1. finden Sie den Index von etwas in einer Liste.

In Emacs Lisp und Common Lisp, haben Sie die position Funktion:

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

In Schema, hier ist ein Schwanz rekursive Implementierung von DrScheme ‚s doc:

(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 
> 

Aber Wenn Sie eine Liste als eine Sammlung von Slots verwenden, um strukturierte Daten zu speichern, sollten Sie vielleicht einen Blick auf defstruct oder sogar eine Art Lisp O werfen bject System wie CLOS.

Wenn Sie Lisp lernen, stellen Sie sicher, dass Sie sich Practical Common Lisp und/oder The Little Schemer ansehen.

Prost!

4

+2 für "Practical Common Lisp". Es ist eine Mischung aus einem Common Lisp Kochbuch und einem hochwertigen Teach Yourself Lisp Buch.

Es gibt auch "erfolgreiche gemeinsame Lisp" (http://www.psg.com/~dlamkins/sl/cover.html und http://www.psg.com/~dlamkins/sl/contents.html), die ein paar Lücken zu füllen schien/erweitern Dinge in "Practical Common Lisp".

Ich habe auch Paul Graham "ANSI Common Lisp" gelesen, die mehr über die Grundlagen der Sprache, aber ein bisschen mehr ein Referenzhandbuch ist.

Verwandte Themen