2009-12-15 7 views
3

http://pastebin.com/d2294a374Est-ce que ce code Clojure est indenté correctement?

J'ai posté du code indenté de 2 façons différentes là-dedans. Je suis confus ici parce que je ne suis pas sûr que faire quand une fonction a plusieurs arguments. Est-ce que chaque argument devrait être sur une ligne différente ou la même chose? En outre, quand nous avons quelque chose comme (def xyz (fn abc [a1 a2] ... ne (fn abc ... allez dans une autre ligne?

Je lis ce qui suit de http://mumble.net/~campbell/scheme/style.txt, mais il n'a pas semblent avoir beaucoup de sens pour moi.

** Indentation et alignement

l'opérateur de toute forme, à savoir la première sous-formulaire suivant l'ouverture parenthèse, détermine les règles pour indenter ou aligner les formes restantes Beaucoup de noms dans cette position indiquent des règles spéciales d'alignement ou d'indentation; ce sont des opérateurs spéciaux, des macros ou des procédures qui ont certaines structures de paramètres.

Si le premier sous-formulaire est un nom non spécial, cependant, alors si le second est sous-formulaire sur la même ligne, aligner la colonne de départ de tous les sous-formulaires suivants avec celle du deuxième sous-formulaire. Si le second sous-formulaire est sur la ligne suivante, alignez sa colonne de départ avec celle du premier sous-formulaire et faites de même pour tous les sous-formulaires restants.

En général, Emacs indentera correctement le code Lisp. Exécutez `C-M-q ' (indent-sexp) sur n'importe quel code pour vous assurer qu'il est indenté correctement, et configurez Emacs de manière à ce que tous les formulaires non standard soient indentés de manière appropriée.

Inacceptable:

(+ (sqrt -1) 
    (* x y) 
    (+ p q)) 

(+ 
    (sqrt -1) 
    (* x y) 
    (+ p q)) 

acceptable:

(+ (sqrt -1) 
    (* x y) 
    (+ p q)) 

(+ 
(sqrt -1) 
(* x y) 
(+ p q)) 

Justification: L'alignement de colonne permet au lecteur de suivre les opérandes de toute opération franchement, simplement en balayant vers le bas ou vers le haut pour correspondre à un colonne commune. L'indentation dicte la structure ; l'indentation confuse est une charge pour le lecteur qui souhaite de dériver la structure sans faire correspondre les parenthèses manuellement.

+0

le Pastebin est mort. –

Répondre

10

Si les arguments sont sur plusieurs lignes (par exemple parce qu'ils ne tiennent pas sur une ligne), ils doivent tous avoir la même indentation. Si vous mettez le premier argument sur une nouvelle ligne, ce retrait doit être une plus profondes (par exemple 2 places) que celle de la fonction elle-même:

(foo (bar (baz 
      arg1 
      arg2))) 

Si vous mettez le premier argument sur la même ligne que la fonction, le reste doit avoir la même empreinte:

(foo (bar (baz arg1 
       arg2))) 

J'indentent votre exemple aurait comme suit:

(defn get-neighbors [[x y] v] 
    (for [y1 (range (dec y) (+ y 2)) 
     x1 (range (dec x) (+ x 2)) 
     :when (and (not (and (= x1 x) 
          (= y1 y))) 
        (in-bounds? x1 y1 v))] 
    ((v y1) x1))) 
Questions connexes