web-dev-qa-db-fra.com

Pourquoi la communauté LISP préfère-t-elle accumuler toutes les parenthèses à la fin de la fonction?

Pourquoi la communauté LISP préfère-t-elle accumuler toutes les parenthèses à la fin de la fonction:

(defn defer-expensive [cheap expensive]
  (if-let [good-enough (force cheap)]
    good-enough
    (force expensive)))

Pourquoi ne pas utiliser une convention comme C ou Java?
[.____] Bien d'accord, Lisp est beaucoup plus âgé que ces langues, mais je parle des lispeurs contemporains.

(defn defer-expensive [cheap expensive]
  (if-let [good-enough (force cheap)]
    good-enough
    (force expensive)
  )
)

Remarque: l'extrait de code est du livre "The Joy of Clojure".

26
Chiron

Parce que cela n'aide pas. Nous utilisons l'indentation pour afficher la structure du code. Si nous voulons séparer des blocs de code, nous utilisons des lignes vraiment vides.

Étant donné que la syntaxe Lisp est tellement cohérente, les parenthèses sont le guide définitif de l'indentation pour le programmeur et l'éditeur.

(Pour moi, la question est plutôt de savoir pourquoi c et Java programmeurs aiment jeter autour de leurs accolades.)

Juste pour démontrer, en supposant que ces opérateurs étaient disponibles dans une langue de type C:

Foo defer_expensive (Thunk cheap, Thunk expensive) {
    if (Foo good_enough = force (cheap)) {
        return good_enough; }
    else {
        return force (expensive); }}

Deux accolades de fermeture ferment deux niveaux de nidification. La syntaxe est évidemment correcte. En analogie à Python Syntaxe, les accolades ne sont que des jetons explicites et des jetons de dédent.

Bien sûr, cela pourrait ne pas être le "un vrai style d'attelage"Tm, mais je crois que c'est juste un accident historique et une habitude.

14
Svante

Le code est beaucoup plus compact alors. Le mouvement dans l'éditeur est de toute façon par S-Expressions, vous n'avez donc pas besoin de cet espace pour l'édition. Le code est lu surtout par la structure et les phrases - non pas par les délimiteurs suivants.

11
Rainer Joswig

Les lispers, vous savez, bloqués haineusement bloqués comme il peut être, là-bas est un certain Je ne meas quoi au deuxième exemple:

(defn defer-expensive [cheap expensive]
  (if-let [good-enough (force cheap)]
    good-enough
    (force expensive)
  )
)

Au début, je ne pouvais pas mettre un doigt sur la source de l'attrait, pour ainsi dire, puis je me suis rendu compte qu'il manque simplement une gâchette:

(defn defer-expensive [cheap expensive]      
  (if-let [good-enough (force cheap)]
    good-enough   ;   )
    (force expensive) 
  )
)

VOILÀ!

Je vais pratiquer ma gosse Lisp Gangster maintenant!

5
Kaz

Dans mon cas, je trouve les lignes dédiées aux délimiteurs un gaspillage d'espace d'écran et lorsque vous écrivez le code en C, il y a aussi le style de

if (pred) {
   printf("yes");
   ++yes_votes;
}

Pourquoi les gens mettent-ils l'attelle d'ouverture dans la même ligne de "si" pour économiser de l'espace, et parce qu'il a l'air redondant d'avoir sa propre ligne lorsque le "si" a déjà sa propre ligne.

Vous atteignez le même résultat en mettant ensemble la parenthèse à la fin. En C semblerait étrange parce que des déclarations se terminent dans le point-virgule et la paire de supports ne s'ouvre pas comme ça

{if (pred)
    printf("yes");
}

c'est comme ça à la fin de la fin de la fin, regarde hors de la place. Ça s'ouvre comme ça

if (pred) {
    printf("yes");
}

vous donnant une vue claire du bloc et de ses limites de '{' & '}'

Et avec l'aide d'un éditeur qui correspond à des parenthèses en les mettant en surbrillance comme VIM, vous pouvez aller à la fin où toutes les parenthèses sont emballées et les traversent facilement et correspondent à toutes les parens d'ouverture et voyez la forme LISP imbriquée.

(defn defer-expensive [cheap expensive]
    _(if-let [good-enough (force cheap)]
    good-enough
    (force expensive)_))

vous pouvez mettre votre curseur dans la paren de fermeture au milieu et avoir la parentale d'ouverture de la mise en surlignée de la SFI.

0
kisai