Этот код Clojure имеет правильный отступ?

http://pastebin.com/d2294a374

Я разместил там код с двумя разными отступами. Я запутался здесь, потому что не уверен, что делать, если функция имеет несколько аргументов. Каждый аргумент должен быть в отдельной строке или в одном и том же? более того, когда у нас есть что-то вроде (def xyz (fn abc [a1 a2] ... идет ли (fn abc ... в другую строку?)

Я читаю следующее из http://mumble.net/~campbell/scheme/style.txt, но мне кажется, что это не имеет особого смысла.

** Отступ и выравнивание

Оператор любой формы, то есть первая подчиненная форма, следующая за открывающей круглой скобкой, определяет правила отступа или выравнивания остальных форм. Многие имена в этой позиции указывают на особые правила выравнивания или отступа; это специальные операторы, макросы или процедуры с определенными структурами параметров.

Однако, если первая подчиненная форма не является особым именем, тогда, если вторая подчиненная форма находится на той же строке, выровняйте начальный столбец всех следующих подчиненных форм с столбцом второй подчиненной формы. Если вторая подчиненная форма находится на следующей строке, выровняйте ее начальный столбец со столбцом первой подчиненной формы и сделайте то же самое для всех остальных подчиненных форм.

В общем, Emacs будет правильно делать отступ для кода Lisp. Запустите `C-M-q '(indent-sexp) для любого кода, чтобы убедиться, что он имеет правильный отступ, и настройте Emacs так, чтобы любые нестандартные формы имели соответствующий отступ.

Неприемлемо:

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

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

Приемлемый:

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

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

Обоснование: выравнивание по столбцам позволяет читателю напрямую следить за операндами любой операции, просто просматривая вниз или вверх, чтобы найти общий столбец. Отступы диктуют структуру; вводящие в заблуждение отступы - это бремя для читателя, который хочет вывести структуру без сопоставления скобок вручную.


person user855    schedule 15.12.2009    source источник


Ответы (1)


Если аргументы находятся в нескольких строках (например, потому что они не помещаются в одну строку), все они должны иметь одинаковый отступ. Если вы поместите первый аргумент в новую строку, этот отступ должен быть на один глубже (например, на 2 пробела), чем отступ самой функции:

(foo (bar (baz
            arg1
            arg2)))

Если вы поместите первый аргумент в ту же строку, что и функция, остальные должны иметь такой же отступ:

(foo (bar (baz arg1
               arg2)))

Я бы выделил ваш пример следующим образом:

(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)))
person Michiel de Mare    schedule 15.12.2009