2010-11-19 24 views
2

LISP me dérange encore une fois ... Pourquoi ne puis-je pas obtenir la valeur du dernier élément d'une liste? J'ai une liste établie semblable à ceci:Voiture LISP du dernier élément?

(setq bar '(((1 2) 3 4 5)((6 7) 8 9 10))) 

Maintenant, je reçois un retour de 4 pour:

(caddar bar) 

Il y a un retour de (5) pour:

(cdddar bar) 

Mais je ne peux pas obtenir un 5 pour:

(cadddar bar) 

Pourquoi est-ce - un d comment puis-je obtenir la valeur du 5?

Erreur:

; Warning: This function is undefined: 
; CADDDAR 

Error in KERNEL:%COERCE-TO-FUNCTION: the function CADDDAR is undefined. 
[Condition of type UNDEFINED-FUNCTION] 

Répondre

8

Les fonctions avec 5 ou plus a et s ne sont pas définies. Seulement 4 et moins. Il y a trop de fonctions possibles de cette longueur pour que ce soit pratique.

Vous devez épeler juste sur: (car (cdr (cdr (cdr (cdr (car x))))))

+0

La réponse était: (voiture (cdddar lst)) .... maintenant pourquoi ça! = Cadddar, je ne comprends pas. – toast

+2

Quelque part au fond des entrailles de votre implémentation LISP sont: (defun cadr (x) ...) (defun cdar (x) ...) (defun caar (x) ...) (defun cddr (x) ...) et ainsi de suite pour toutes les combinaisons de 'a' et 'd' de longueur 1 à 4. La spécification n'inclut pas celles de longueur 5 car il y en a trop. Il n'y a rien de spécial dans la famille de fonctions # 'cdadr. Ils ne sont pas interprétés de manière unique. Ce sont juste des fonctions normales. Vous êtes plus que la bienvenue à (defun ...) de nouveaux pour combler les lacunes. – jtdubs

2

Eh bien, par le message d'erreur, il n'y a pas de fonction cadddar. Gardez à l'esprit que car et cdr sont les fonctions de lecture de liste primitives. D'autres comme caddar sont des fonctions de commodité qui sont construites à partir d'une combinaison d'un ou plusieurs car et cdr. Autrement dit, vous pouvez effectuer la manipulation de la liste juste bien avec seulement car et cdr si caddar etc. n'existait pas, les fonctions étendues vous rendent la vie un peu plus facile. Donc, la façon d'aborder cela est de synthétiser votre propre cadddar en utilisant car et cdr. Si ce n'est pas immédiatement évident comment faire cela, commencer plus simple (avec, disons, cadr ou cdar) et construire jusqu'à .

1
(first (last (first '(((1 2) 3 4 5) ((6 7) 8 9 10))))) 

-> 5 
1

Les fonctions avec plus de 4 s et ad s ne sont pas définis par la norme, peut-être parce qu'il ya 32 d'entre eux [et devient exponentiellement désordonné à partir de là].

Un moyen infaillible pour obtenir le dernier élément d'une liste: last retourne la dernière cellule de contre, si

(car (last list)) 

vous donne le dernier élément de la liste. Bien sûr, list pourrait être quelque chose d'autre comme (first list).