2017-02-12 4 views
2

J'écris une fonction appelée flatten qui est censée prendre la liste qui a la liste incorporée et renvoie une version simplifiée de celle-ci. Lorsque j'essaie d'exécuter ma fonction, j'obtiens une erreur, indiquant que "la liste Lambda avec des points n'est autorisée que dans les macros, pas ici: LISTE" Des suggestions sur la façon dont je peux résoudre ce problème?Erreur: La liste Lambda avec des points n'est autorisée que dans les macros, pas ici: LISTE?

C'est actuellement ce que j'ai.

(defun flatten list 
    (cond 
     (null list)'() 
      (list (first list)) 
      (append (flatten (first list)) 
        (flatten (rest list))) 
     (cons (first list (flatten (rest list)))))) 
+0

Ne pas utiliser 'list' comme nom de symbole; il a déjà une valeur, et cela cachera cela. –

+4

@ScottHunter Dans Common Lisp, les fonctions et les variables (et d'autres choses) se trouvent dans des espaces de noms différents, donc il est parfaitement possible d'utiliser 'list' comme nom de variable. – jkiiski

+5

La [syntaxe de 'defun'] (http://www.lispworks.com/documentation/HyperSpec/Body/m_defun.htm) implique une [liste lambda ordinaire] (http://www.lispworks.com/documentation/ HyperSpec/Body/03_da.htm): le symbole 'list' n'est pas une liste, encore moins une liste lambda ordinaire. Il y a d'autres choses qui ne vont pas ici aussi. – tfb

Répondre

0

Vos parenthèses ne sont pas équilibrées correctement; (null list)'()) ferme le cond qui entoure, que votre indentation suggère n'est pas ce que vous voulez faire.

+0

J'ai pris votre suggestion et j'ai révisé en conséquence. Quand je teste à nouveau, j'ai toujours la même erreur. Est-ce que je continue de négliger quelque chose? –

+0

De toute évidence, mais il est difficile de dire ce que vous essayez d'exprimer dans votre code, et donc difficile de dire comment l'exprimer correctement. –

4

Liste Lambda

La liste des arguments pour une defun devrait être un Ordinary Lambda List (par exemple, (list) dans votre cas), pas un atome list:

(defun flatten (list) 
    ...) 

Cond

Votre cond est faux . La syntaxe correcte est

(cond (condition1 form11 form12 ...) 
     (condition2 form21 form22 ...) 
     ...) 

.: par exemple

(defun select-options() 
    (cond ((= a 1) (setq a 2)) 
     ((= a 2) (setq a 3)) 
     ((and (= a 3) (floor a 2))) 
     (t (floor a 3)))) => SELECT-OPTIONS 
(setq a 1) => 1 
(select-options) => 2 
a => 2 
(select-options) => 3 
a => 3 
(select-options) => 1 
(setq a 5) => 5 
(select-options) => 1, 2