2017-02-11 1 views
1

J'essaie de comprendre pourquoi je reçois cette erreur, car je suis assez nouveau pour lisp. Je veux créer une fonction qui prend un nombre n de l'utilisateur et crée une liste de jusqu'à cinq nombres basés sur ce nombre. La fonction prend alors le premier nombre de la liste et l'envoie à la fin de la liste.Pourquoi la variable 'list' n'a aucune valeur?

Exemple

> (my_func 1)

> (2 3 4 5 1)

C'est ce que j'ai à ce jour, je suis en mesure d'obtenir la fonction de retourner une liste, mais je ne suis pas sûr sur la façon d'envoyer le premier élément au dos de la liste.

(defun my_rotate (y) 
    (labels ((var (list) (loop for i from y to list collect i))) 
     (var 5) (append (rest list)(list (first list)))) 
) 

Répondre

0

Votre question est pas tout à fait clair pour moi, mais si je comprends bien, quelque chose comme cela devrait fonctionner:

(defun my_rotate (y) 
    (let ((list (loop for i from y to (+ 4 y) collect i))) ;; create the list you want 
     (append (rest list) (subseq list 0 1))))    ;; move first element to end 
2

Commençons par le formatage du code « correctement », ce qui rend beaucoup plus plus facile de voir la structure du code:

(defun my_rotate (y) 
    (labels ((var (list) 
      (loop for i from y to list collect i))) 
    (var 5) 
    (append (rest list)   ;; This form is not in a lexical context 
     (list (first list))))) ;; where list is bound 

nous pouvons voir clairement que la raison pour laquelle nous obtenons une erreur est parce que list est tout simplement pas lié, de sorte que la fonction locale var n'est pas réellement utile (c'est ce qu'on appelle, mais jette la valeur, puisqu'il n'a pas d'effets secondaires, il pourrait en théorie être optimisé).

La solution la plus simple est de passer l'appel append en dehors du labels, laissez tomber la forme labels, puis modifiez le nom de l'argument d'entrée list.