Соглашение об именах Ocaml - PullRequest
2 голосов
/ 18 июля 2011

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

Например, если я хочу определить тип condition, вы предлагаете явно аннотировать его конструкторы (например, Condition_None), чтобы непосредственно знать, что это конструктор condition?

Кроме того, как бы вы назвали переменную этого типа? c или a_condition? Я всегда стесняюсь использовать a, an или the.

Чтобы объявить функцию, необходимо ли дать ей имя, которое позволяет выводить типы аргументов из ее имени, например remove_condition_from_list: condition -> condition list -> condition list?

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

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

Ответы [ 2 ]

5 голосов
/ 18 июля 2011

Вас может заинтересовать Руководство по программированию Caml .Они охватывают именование переменных, но не отвечают на ваши точные вопросы.

Относительно пространства имен конструктора: теоретически вы должны иметь возможность использовать модули в качестве пространств имен, а не добавлять префиксы к именам конструктора.Вы могли бы, скажем, иметь модуль Constructor и использовать Constructor.None, чтобы избежать путаницы со стандартным конструктором None типа option.Затем вы можете использовать open или локальный открытый синтаксис ocaml 3.12, или использовать псевдоним модуля module C = Constructor затем C.None, когда это полезно, чтобы избежать длинных имен.

На практике люди по-прежнему склонны использоватькороткий префикс, такой как первая буква имени типа с большой буквы, CNone, чтобы избежать путаницы при работе с двумя модулями с одинаковыми именами конструктора;это часто случается, например, когда вы пишете компилятор и у вас есть несколько проходов, манипулирующих различными типами AST с похожими типами: форма после синтаксического анализа Let, форма после ввода Let и т. д.Ваш второй вопрос, я бы предпочел краткость.Вывод означает, что информация о типе может в большинстве случаев оставаться неявной, вам не нужно применять явные аннотации в ваших соглашениях об именах.Часто будет очевидно из контекста - или неважно - какие типы манипулируют, например.remove cond (l1 @ l2).Это даже менее полезно, если ваше значение remove определено внутри подмодуля Condition.

Редактировать : метки записи имеют такое же поведение области видимости, что и конструкторы типа sum.Если вы определили запись {x: int; y : int} в подмодуле Coord, вы получите доступ к полям с foo.Coord.x вне модуля или с псевдонимом foo.C.x или Coord.(foo.x), используя функцию «локального открытия» 3.12.Это в основном то же самое, что и конструкторы сумм.

До 3.12 вы должны были писать этот модуль в каждом поле записи, например.{Coord.x = 2; Coord.y = 3}.С 3.12 вы можете просто указать первое поле: {Coord.x = 2; y = 3}.Это также работает в позиции шаблона.

4 голосов
/ 18 июля 2011

Если вам нужны предложения по соглашениям об именах, посмотрите стандартную библиотеку.Помимо этого вы найдете много людей со своими собственными соглашениями об именах, и вам решать, кому доверять (просто будьте последовательны, то есть выбирайте одного, а не многих).Стандартная библиотека - это единственная вещь, которую разделяют все программисты Ocaml.

Часто вы определяете один тип или одну группу тесно связанных типов в модуле.Поэтому вместо того, чтобы иметь тип с именем condition, у вас будет модуль с именем Condition с типом t.(Вы должны дать вашему модулю другое имя, потому что в стандартной библиотеке уже есть модуль с именем Condition!).Функция для удаления условия из списка будет Condition.remove_from_list или ConditionList.remove.См., Например, модули List, Array, Hashtbl, Map.Make` и т. Д. В стандартной библиотеке.

Для примера модуля, который определяет много типов, посмотрите Unix,Это особый случай, потому что имена в основном взяты из ранее существующего C API.Многие конструкторы имеют короткий префикс, например O_ для open_flag, SEEK_ для seek_command и т. Д .;это разумное соглашение.

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

...