Этот код Clojure имеет отступ? - PullRequest
3 голосов
/ 15 декабря 2009

http://pastebin.com/d2294a374

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

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

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

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

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

В общем, Emacs будет правильно вставлять код на Lisp. Run `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))

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

1 Ответ

10 голосов
/ 15 декабря 2009

Если аргументы находятся в нескольких строках (например, потому что они не помещаются в одну строку), они должны иметь одинаковые отступы. Если вы поместите первый аргумент в новую строку, этот отступ должен быть на один глубже (например, 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)))
...