2010-11-28 7 views
4

J'expérimente avec destructuration-bind comme suit:utilisation correcte de destructuration-bind

(destructuring-bind 
      (a b) '(1 2) (list a b))) 

Quand j'évalue cela dans le REPL je reçois:

READ from #1=#<INPUT STRING-INPUT-STREAM>: an object cannot start with #\) 
    [Condition of type SYSTEM::SIMPLE-READER-ERROR] 

Je me attendais que le résultat soit

(1 2) 

L'erreur ne signifie rien pour moi, dans le contexte du code ci-dessus.

Je me rends compte que je ne fais que lier une simple liste d'arguments, plutôt qu'un arbre, mais je m'attendais toujours à ce que cela fonctionne. Des indices quant à l'endroit où je me suis trompé?

Répondre

10

Enlever l'extra) sur la fin. Fonctionne bien.

+5

Groan, comme c'est embarrassant. Merci! Au moins, je sais maintenant comment interpréter cette erreur msg à l'avenir. – Joel

3

Pendant que nous y sommes, la mise en forme habituelle est:

(destructuring-bind (a b) 
    '(1 2) 
    (list a b)) 

Il permet également plus facile de voir comment le match entre parenthèses. Généralement, l'éditeur aidera également. Placer le curseur après une parenthèse fermante doit mettre en surbrillance la parenthèse ouvrante correspondante. Notez également que tous les éditeurs compatibles avec la syntaxe Lisp qui se respectent ont une commande pour trouver des parenthèses non correspondantes.

+2

Je savais que quelqu'un commenterait cela ;-) – Joel

+1

@Joel: un rappel de temps en temps peut être utile. ;-) –

+1

J'utilise Emacs/Slime, qui met en évidence les parenthèses et je pensais avoir vérifié qu'elles étaient toutes identiques, mais je n'étais clairement pas attentif, 100 coups de fouet pour mes péchés ;-) Pour ajouter à mon manque de with-it-ness - J'ai même choisi d'ignorer l'énorme indice que l'éditeur de code SO me donnait en mettant en évidence le code dans lequel je collais, en rouge! – Joel

Questions connexes