Question

J'ai été à la recherche partout pour les fonctionnalités suivantes en Lisp, et ont obtenu nulle part:

  1. trouver l'indice de quelque chose dans une liste.exemple:

    (index-of item InThisList)
    
  2. remplacer quelque chose à un endroit précis dans une liste.exemple:

    (replace item InThisList AtThisIndex) ;i think this can be done with 'setf'?
    
  3. de retour d'un élément à un index spécifique.exemple:

    (return InThisList ItemAtThisIndex)
    

Jusqu'à ce point, j'ai été faire semblant avec mes propres fonctions.Je me demande si je suis juste de créer plus de travail pour moi-même.

C'est de cette façon que j'ai truqué numéro 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))
Était-ce utile?

La solution

Vous pouvez utiliser setf et nth afin de remplacer et de récupérer les valeurs de l'indice.

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

(1 2 3 4 101 6)

Pour le trouver, vous pouvez utiliser l'index l' position la fonction.

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

J'ai trouvé ces tous dans cet indice de fonctions.

Autres conseils

  1. trouver l'indice de quelque chose dans une liste.

En Emacs Lisp et Common Lisp, vous avez la position fonction:

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

Dans le Schéma, voici une queue récursive de la mise en œuvre de DrSchemes '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
> 

Mais si vous êtes en utilisant une liste comme une collection de machines à sous pour stocker des données structurées, peut-être que vous devriez jeter un oeil à defstruct ou même une sorte de Lisp Object System comme CLOS.

Si vous êtes en train d'apprendre Lisp, assurez-vous d'avoir un coup d'oeil à Pratique Common Lisp et / ou Le Petit Intrigant.

Cheers!

Réponses:

  1. (position de l'élément de séquence &clé à partir de la fin (start 0) touche de fin de test test-pas)
    http://lispdoc.com/?q=position&search=Basic+search

  2. (setf (elt de la séquence de l'indice de la valeur)

  3. (elt index de séquence)
    http://lispdoc.com/?q=elt&search=Basic+search
    NOTE:elt est préférable à la nième parce que elt fonctionne sur n'importe quel ordre, pas simplement de listes

Jeremy réponses de travailler;mais cela dit, si vous vous retrouvez à écrire un code comme

(setf (nth je ma-liste) nouvelle-elt)

vous utilisez probablement le mauvais discbased.Les listes sont des listes simplement chaînées, ils sont donc O(N) pour l'accès par index.Vous pourriez être mieux à l'aide de tableaux.

Ou peut-être vous êtes à l'aide de listes de n-uplets.Dans ce cas, ils devraient être fine.Mais, vous voudrez probablement le nom accesseurs permettant à la personne la lecture de votre code n'a pas à rappeler que "n-ième 4" est censé signifier.Quelque chose comme

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

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

+2 pour la Pratique de "Common Lisp".C'est un mélange de Common Lisp livre de recettes et une qualité de l'apprendre par Vous-même Lisp livre.

Il y a aussi "Réussi Common Lisp" (http://www.psg.com/~dlamkins/sl/cover.html et http://www.psg.com/~dlamkins/sl/contents.html) qui semble combler quelques lacunes / étendre les choses dans la Pratique de "Common Lisp".

J'ai aussi lu Paul Graham "ANSI Common Lisp", qui est plus sur les bases de la langue, mais en un peu plus d'un manuel de référence.

Je suis d'accord avec Thomas.Si vous utilisez des listes comme des tableaux, alors que c'est juste va être lent (et, éventuellement, maladroit).Donc, vous devez soit utiliser un tableau ou un bâton avec les fonctions que vous avez écrit, mais de les déplacer vers le "haut" d'une manière de sorte que vous pouvez facilement remplacer la lenteur des listes avec des tableaux plus tard.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top