37 votes

Pourquoi est-il habituel de mettre plusieurs parenthèses fermantes sur une seule ligne dans les langages basés sur Lisp?

Le code ressemble généralement à ceci:

 (one-thing
    (another-thing arg1 (f arg5 r))
    (another-thing arg1 (f arg5 r)))
 

Pourquoi n'est-ce pas comme ça?:

 (one-thing
    (another-thing arg1 (f arg5 r))
    (another-thing arg1 (f arg5 r))
)
 

Il permet d'ajouter et de supprimer plus facilement des lignes "autre chose" (sans supprimer ni rajouter de parenthèses fermantes de fin). Vous pouvez également mettre un commentaire sur cette seule parenthèse fermante (comme "; fin de la boucle").

À quel point est-ce grave quand je mélange par du code qui utilise le deuxième style avec du code existant qui utilise le premier style?

49voto

Gareth Rees Points 31350

En Lisp et d'autres langues qui utilisent des S-expressions pour la syntaxe, les parenthèses sont principalement au profit du compilateur, tandis que la mise en page et de l'indentation (qui sont ignorés par le compilateur) sont à l'avantage de programmeurs.

Donc, il n'est pas nécessaire de mettre des parenthèses de fermeture sur leurs propres lignes: bien choisi les sauts de ligne et l'indentation sera suffisant pour faire une structure claire.

Par exemple,

(defun clone-indirect-buffer-other-window (newname display-flag &optional norecord)
  "Like `clone-indirect-buffer' but display in another window."
  (interactive
   (progn
     (if (get major-mode 'no-clone-indirect)
         (error "Cannot indirectly clone a buffer in %s mode" mode-name))
     (list (if current-prefix-arg
               (read-buffer "Name of indirect buffer: " (current-buffer)))
           t)))
  (let ((pop-up-windows t))
    (clone-indirect-buffer newname display-flag norecord)))

La structure est clair (un peu expérimenté programmeur Lisp) de l'indentation. Rien ne serait ajouté en mettant des parenthèses de fermeture vers le bas sur les nouvelles lignes:

(defun clone-indirect-buffer-other-window (newname display-flag &optional norecord)
  "Like `clone-indirect-buffer' but display in another window."
  (interactive
   (progn
     (if (get major-mode 'no-clone-indirect)
         (error "Cannot indirectly clone a buffer in %s mode" mode-name)
       )
     (list (if current-prefix-arg
               (read-buffer "Name of indirect buffer: " (current-buffer))
             )
           t)
     )
   )
  (let ((pop-up-windows t))
    (clone-indirect-buffer newname display-flag norecord)
    )
  )

Je dois ajouter que presque tous les programmeurs Lisp utiliser un éditeur de texte qui affiche les correspondances entre parenthèses, effectue la mise en retrait, et fournit une interface utilisateur pour travailler directement avec équilibré expressions. Dans Emacs, par exemple, il y a M-( pour l'insertion d'une nouvelle expression, M-) pour le déplacement depuis la fin de l'expression actuelle, C-M-k pour la suppression de l'expression après le point, et ainsi de suite.

Si les programmeurs Lisp ne jamais avoir à compter les parenthèses à la main, afin de déterminer celles qui correspondent.


Taylor R. Campbell exprime de façon éloquente ce raisonnement:

Le véritable support de caractères sont simplement lexicale des jetons à qui peu d'importance devrait être attribué. Lisp les programmeurs ne pas examiner les crochets individuellement, ou, Azathoth interdire, comptez entre parenthèses; au lieu de cela ils ont vue le plus élevé au niveau des structures exprimé dans le programme, surtout que présenté par l'indentation. Lisp n'est pas sur l'écriture d'une séquence de la série d'instructions; il s'agit de construire des structures complexes par la somme des parties. La composition de structures complexes à partir de pièces est l'objet de programmes Lisp, et il devrait être évident à partir du code Lisp. En plaçant entre parenthèses au hasard, au sujet de la présentation est choquante pour un programmeur Lisp, qui, autrement, n'auraient même pas vu, pour la plupart.

30voto

telent Points 1137

Il ya deux points ici:

  1. Les Conventions sont importants en eux-mêmes. Collant enroulé parenthèses signifie que votre code est plus lisible par d'autres programmeurs lisp, et si vous adoptez ce style, vous permettra aussi de développer la pratique à la lecture de leur

  2. Les avantages du fractionnement )s sur leurs propres lignes ne sont pas réellement des avantages dans les yeux de la plupart des lispers. Si vous utilisez une demi-décent éditeur, il aura commandes comprendre équilibrée des expressions, pour le déplacement à travers eux, la découpe, le collage, la transposition, etc. Si vous n'avez pas besoin

    )  ; end of the loop
    

    en lisp, pas plus que vous avez besoin

    # end of the loop
    

    dans certains espaces sensibles du langage comme Python

Voir, par exemple, http://www.gnu.org/software/emacs/manual/html_node/emacs/Expressions.html

11voto

fogus Points 3909

Réponse courte : s'écarter des normes reconnues ne sert qu'à éloigner les contributeurs potentiels. Aucun style n'est mieux qu'un autre.

Réponse longue : http://blog.fogus.me/2010/08/30/community-standards/

3voto

Faites ce que vous voulez! C'est votre code.

Cela dit, vous aurez probablement finissent par passer tous de retour de sorte que vous pouvez obtenir plus de choses sur l'écran à la fois. Il est vrai que vous arrêter de voir les crochets après un certain temps.

En fait, c'est un peu pire que ça. Ces jours, lorsque j'essaye d'utiliser la bien-aimée de python, il se sent comme mon code n'est pas solidement attaché ensemble sans ses supports et j'ai peur qu'il pourrait s'écrouler à tout moment.

L'enfer, enregistrer quelques macros de clavier pour échanger tout le fichier d'un style à l'autre. (Et d'apprendre comment faire de votre contrôle de version ignorer les espaces blancs uniquement les modifications. :-)

3voto

asmeurer Points 13185

Si vous utilisez Emacs, vous avez besoin d'apprendre ces. En particulier, C-M-k fait de tuer un équilibre expression tout aussi facile que de tuer un ligne. Couple qu'avec de la bonne mise en évidence d'équilibre entre parenthèses, et il n'y a vraiment pas besoin d'écrire les choses de cette façon.

D'autre part, la présence de tous ceux - )s sur les lignes par eux-mêmes signifie que vous voyez moins de votre code sur l'écran à la fois, ce qui rend plus difficile à lire et à refactoriser.

Si vous n'êtes pas à l'aide d'Emacs, vous devriez au moins être l'aide d'un éditeur qui prend en charge ces opérations de base, ou codage en lisp va être une douleur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X