2012-04-10 6 views
8

Я новичок в clojure, и главное, с чем я борюсь, - это написать читаемый код. Я часто получаю функции, подобные приведенным ниже.Управление количеством скобок в clojure

(fn rep 
    ([lst n] 
    (rep (rest lst) 
    n 
    (take n 
     (repeat (first lst))))) 
    ([lst n out] 
    (if 
     (empty? lst) 
     out 
     (rep 
     (rest lst) n 
     (concat out (take n 
      (repeat 
      (first lst)))))))) 

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

+1

Это 'Lisp-anese' для вас. Использование достойного редактора, который помогает с привязкой к скобкам, - это один маршрут. –

+1

Вы всегда можете поместить одиночную круглую скобку в свои собственные строки и выровнять их с помощью скобки открытия (например, стандартный синтаксис фигурных скобок для C# или Java). Некоторые хардкор-липперы могут вызывать у вас какие-то неудобства :) –

+7

Думаю, я нахожусь в качестве «хардкор-лизиса», хотя я использовал только lisp в течение двух лет. Помещение парнеров на их собственную линию подобно кардинальному греху форматирования - нет худшего выбора, который вы могли бы сделать. Многие диалекты lisp имеют все (более или менее) одинаковую кодировку, потому что это довольно читаемо, в отличие от C-подобных языков, которые имеют много стилей, которые вдохновляют священные войны. Не отказывайтесь от стандартного стиля только потому, что вы его не повесили. – amalloy

ответ

7

Редактор, который окрашивает круглые скобки, чрезвычайно полезен в этом случае. Например, вот что ваш код выглядит в моем редакторе VIM (с помощью vimclojure):

Rainbow colors

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

+0

для emacs см. Этот вопрос SO: http://stackoverflow.com/questions/2413047/how-do-i-get-rainbow-parentheses-in-emacs –

+0

Я использовал rainbow parens в emacs какое-то время. Я больше не хочу, в основном потому, что я думаю, что это побуждает вас фактически выполнять ручное/умственное сопоставление парнов, вместо того, чтобы позволить paredit делать все это за вас. Но я признаюсь, что радуга parens * выглядит довольно круто, поэтому, если вы делаете это только для взглядов, я не могу спорить. – amalloy

+0

@amalloy: можете ли вы использовать * paredit * и * rainbow-parens * в то же время? – TacticalCoder

2

Я не уверен, что вы можете избежать всех скобок. Однако то, что я видел Lispers сделать, это использовать редактор с PAREN согласующего/выделить и, возможно, даже радужные скобки: http://emacs-fu.blogspot.com/2011/05/toward-balanced-and-colorful-delimiters.html

Честно говоря, эти рода функции, которые были бы полезны для не-Lisp редакторов тоже :)

15

Использование режима Emacs paredit (эмулируется в нескольких других редакторах) означает, что вы вообще - если вы не копируете/вставляете с помощью мыши/принудительно-неструктурированных выборов - обрабатываете согласованные скобки/фигурные скобки/круглые скобки и соответствующие отступы с нет необходимости в подсчете.

Emacs с https://github.com/technomancy/emacs-starter-kit (настоятельно рекомендуется!) По умолчанию разрешен для clojure. В противном случае см. http://emacswiki.org/emacs/ParEdit

+0

+1 для paredit. Я не могу жить без него! – Gert

+1

I HATED paredit, когда я впервые начал использовать emacs. Но как только я понял, что он делает для меня, (http://www.emacswiki.org/emacs/PareditCheatsheet), я не могу жить без него. –

+0

Я выбрал другой ответ, поскольку я пользователь vim, но +1 для paredit –

13

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

(defn rep [coll n] (mapcat (partial repeat n) coll)) 

Конечно, это больше искусство (ремесло), чем наука, но некоторые указатели (в случайном порядке):

  • Проблемы на 4clojure и их решения топ-пользователей (видимые после решения конкретных задач) - Я считаю, что Крис Хаузер есть под ручкой chouser
  • Говоря CH - «Радость Clojure» очень полезно прочитать
  • Просмотр документации на Clojure. с руда - есть много полезных функций там
  • -> и ->> пронизывающие макросы очень полезно для выпрямления вложенного кода
  • StackOverflow - одни из самых ярких и самых полезных людей в вопросах мира там ответ ;-)
+0

Спасибо за советы! Я решал каждую проблему 4clojure пару раз, когда это было возможно, по крайней мере один раз с рекурсией и по крайней мере один раз с отсутствием. Это был всего лишь пример с большим количеством скобок. Ваши советы выше, несомненно, будут очень полезны, хотя –

3
(fn rep 
    ([lst n] 
    (rep lst n nil)) 
    ([lst n acc] 
    (if-let [s (seq lst)] 
     (recur (rest s) n (concat acc (repeat n (first s)))) 
     acc))) 

это более читаемый, я думаю.обратите внимание, что:

  • вы должны использовать повторялись, когда хвост рекурсии
  • вы должны проверить с seq - см http://clojure.org/lazy
  • повтор может занять количество
  • CONCAT упадет ноль, который сохраняет повторяя себе
  • вам не нужно начинать новую линию для каждого открытого пара.

как для parens - your edito r/ide должен позаботиться об этом. я печатаю здесь слепо, так что простите меня, если это неправильно ...

[код Rafał Dowgird короче; я учусь тоже ...]

[обновление:] после повторного прочтения «ленивой» ссылки, я думаю, что я был обработками ленивых последовательностей неправильно,

+0

Спасибо за советы, которые я буду учитывать в будущем. –

3

Я не могу повторить достаточно сильно, насколько ценным он является используйте paredit или некоторую аналогичную функцию в другом редакторе. Это освобождает вас от заботы о парнах - они всегда отлично себя чувствуют, и утомительные, подверженные ошибкам задачи редактирования, такие как «изменение (foo (bar x) y) в (foo (bar x y))», становятся единым нажатием клавиши. В течение недели или около того paredit будет разочаровывать вас вне веры, поскольку это мешает вам делать что-то вручную, но как только вы изучите автоматические способы обработки парнеров, вы никогда не сможете вернуться.

Недавно я услышал, как кто-то сказал, и я думаю, что это примерно точная информация, что писать lisp без paredit - это как писать java без автозаполнения (возможно, но не очень приятно).

1

Всегда используйте скользящие круглые скобки на 100%, изготовленные из материалов по меньшей мере 75% после потребителя; то вам не нужно так плохо относиться к тому, чтобы использовать так много.

1

Формат, как вам нравится. Задача редактора - отображать код в любом стиле, который предпочитает читатель. Мне нравится иерархический древовидный формат C-стиля с одиночными скобками на их собственных линиях (все LISPers кипят от ярости при этом :-)))))))))))))

Но иногда я иногда используйте этот стиль:

(fn rep 
    ([lst n] 
    (rep (rest lst) 
    n 
    (take n 
     (repeat (first lst))) ) ) ) 

который является обновленной информацией о традиционном стиле, в которых отстоят скобки (log2 ветви уровня)

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

Не могу дождаться, когда кто-нибудь напишет достойный редактор в Clojure, хотя это не текстовый редактор, а выражение editor **, тогда проблема форматирования уходит. Я пишу сам, но это требует времени. Идея состоит в том, чтобы редактировать выражения, применяя к ним функции, и я перемещаю код с помощью zipper, выражение по выражению, а не словами или символами или строками. Код представлен любой функцией отображения, которую вы хотите.

** да, я знаю, что есть emacs/paredit, но я попробовал emacs и мне не понравилось сожалеть.

+1

Пока вы никому не делитесь своим кодом, все в порядке. Но обычно мы сотрудничаем с нашим кодом, и тогда эзотерическое форматирование, как это, становится огромной проблемой. –

+0

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

+0

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