Domanda

Ho cercato ovunque le seguenti funzionalità in Lisp e non sono arrivato da nessuna parte:

  1. trovare l'indice di qualcosa in una lista.esempio:

    (index-of item InThisList)
    
  2. sostituire qualcosa in un punto specifico di un elenco.esempio:

    (replace item InThisList AtThisIndex) ;i think this can be done with 'setf'?
    
  3. restituire un elemento in un indice specifico.esempio:

    (return InThisList ItemAtThisIndex)
    

Fino a questo punto ho finto con le mie funzioni.Mi chiedo se sto semplicemente creando più lavoro per me stesso.

Ecco come ho finto il numero 1:

(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))
È stato utile?

Soluzione

Puoi usare setf E nth per sostituire e recuperare i valori per indice.

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

(1 2 3 4 101 6)

Per trovare per indice puoi usare IL position funzione.

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

Ho trovato tutto questo in questo indice di funzioni.

Altri suggerimenti

  1. trovare l'indice di qualcosa in una lista.

In Emacs Lisp e Common Lisp, hai il file position funzione:

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

In Scheme, ecco un'implementazione ricorsiva della coda di Dottor Schemeil documento:

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

Ma se stai utilizzando un elenco come raccolta di slot per archiviare dati strutturati, forse dovresti dare un'occhiata a defstruct o anche una sorta di sistema di oggetti Lisp come CLOS.

Se stai imparando Lisp, assicurati di dare un'occhiata a Lisp comune pratico e/o Il piccolo intrigatore.

Saluti!

Risposte:

  1. (posizione sequenza elemento &chiave da-fine (inizio 0) fine test chiave test-not)
    http://lispdoc.com/?q=position&search=Basic+search

  2. (valore setf (indice sequenza elt))

  3. (indice della sequenza elt)
    http://lispdoc.com/?q=elt&search=Basic+search
    NOTA:elt è preferibile a nth perché elt funziona su qualsiasi sequenza, non solo sulle liste

Le risposte di Jeremy dovrebbero funzionare;ma detto questo, se ti ritrovi a scrivere codice come

(setf (nth i mia-lista) new-elt)

probabilmente stai utilizzando la struttura dati sbagliata.Le liste sono semplicemente liste collegate, quindi è possibile accedervi tramite O(N) tramite indice.Potrebbe essere meglio usare gli array.

O forse stai usando le liste come tuple.In tal caso, dovrebbero andare bene.Ma probabilmente vorrai nominare gli accessori in modo che qualcuno che legga il tuo codice non debba ricordare cosa dovrebbe significare "nth 4".Qualcosa di simile a

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

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

+2 per "Lisp comune pratico".È un mix tra un libro di cucina Common Lisp e un libro Teach Yourself Lisp di qualità.

C'è anche "Successful Common Lisp" (http://www.psg.com/~dlamkins/sl/cover.html E http://www.psg.com/~dlamkins/sl/contents.html) che sembrava colmare alcune lacune / estendere le cose in "Practical Common Lisp".

Ho anche letto "ANSI Common Lisp" di Paul Graham che riguarda più le basi del linguaggio, ma è più un manuale di riferimento.

Devo essere d'accordo con Tommaso.Se usi elenchi come array, sarà lento (e forse imbarazzante).Quindi dovresti usare gli array o restare con le funzioni che hai scritto ma spostarle "su" in modo da poter facilmente sostituire gli elenchi lenti con gli array in seguito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top