2015-05-11 4 views
0

Есть ли причина, почему выражениеClojure терминатор скобка синтаксиса

(foo5 (foo4 (foo3 (foo2 (foo1 arg))))) 

не может быть заменен

(foo5 (foo4 (foo3 (foo2 (foo1 arg)-) 

или тому подобное, а затем расширяется назад?

Я знаю, что недостаток макросов читателя означает, что вы не можете изменить синтаксис, но может ли это расширение, возможно, быть жестко закодировано в java?

Я делаю это, когда я пишу код.

+1

Как бы '(foo7 (foo6 (foo3 (foo3 (foo3 (foo1 arg1) -) arg2) -)' be parsed? –

+1

Я помню, как читал о Lisp, который имел что-то вроде этого.Я думаю, ] 'означает« закрыть все открытые круглые скобки », но у меня есть предложение. Даже без' -> 'скопированные круглые скобки не являются проблемой один раз (а), когда вы знакомы со стандартным форматированием кода Clojure и (b) один использует редактор, который может применять стандартные правила форматирования Clojure. Затем вы можете увидеть, есть ли у вас правильное количество правых паренов, видя, является ли форматирование, выбранное редактором, тем, что вы ожидали. (И, конечно, всегда нужно использовать редактор, который соответствует круглым скобкам.) – Mars

ответ

4

Да, вы могли бы это сделать, даже без макросов читателей (на самом деле, вы можете изменить синтаксис Clojures с небольшим взломом).

Но вопрос в том, что бы это принесло вам? Будет ли он всегда расширяться до высшего уровня? Но тогда вырезать и вставлять код не удастся, если вы переместили его на или с верхнего уровня. И, конечно, все различные инструменты, которые работают с синтаксисом clojure, должны были бы его понять.

В конце концов, если вы действительно любите все близкие круглые скобки, почему не использовать

(-> arg foo1 foo2 foo3 foo4) 

вместо этого?

+0

Да, когда код для написания рук -> кажется концептуально лучше - использование кода -> должно быть лучше - я посмотрю. – category

2

Да, это можно сделать, но я не уверен, что это правильное решение, и есть ряд негативов, которые, вероятно, перевесят преимущества.

Подобные предложения часто возникают из-за слабых инструментов кодирования и «традиционной» концептуальной модели для написания кода. Выбор правильных инструментов и просмотр кода с немного другой точки зрения обычно устраняют причину, приводящую к этому предложению.

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

Языки в стиле Lisp менее ориентированы на линии токенов. Акцент здесь делается на форме списка. строки токенов заменяются вложенными списками символов - линия менее актуальна, и у вас обычно есть много больше вложенности форм. Это изменение означает, что ваши стандартные инструменты, ориентированные на линию, как ваш редактор, менее подходят. Типичная ментальная модель кода как линии токенов также менее полезна.

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

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

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

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

Если вы являетесь пользователем emacs, я настоятельно рекомендую расширения, такие как paredit и lispy. Если вы используете какой-либо другой редактор, ищите расширения типа paredit. Однако, поскольку они являются расширениями, вы также должны потратить некоторое время на тренировку самостоятельно, чтобы использовать все привязки клавиш, которые использует расширение - нет смысла иметь расширение с отличным кодом navigaiton на основе списков, если вы все еще просто стрелка со стрелкой (если это не emacs, и вы повторно связали эти клавиши со стрелками, чтобы использовать привязки навигации paredit).

Смежные вопросы