2009-12-15 5 views
3

http://pastebin.com/d2294a374Правильно ли это код Clojure?

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

Я читаю следующее из 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)) 

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

+0

Pastebin умер. –

ответ

10

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