Шаблон / универсальный синтаксис - PullRequest
2 голосов
/ 05 марта 2010

Я разрабатываю синтаксис для шаблонов / обобщений. Языки семейства C ++ используют для этого угловые скобки, но вместо этого я использую символ-разделитель. Например, где в Java вы можете написать:

Map<String, Foo> foos = new HashMap<String, Foo>();

Я стремлюсь к:

.foos = hmap*string*foo

Я пытаюсь решить, каким будет символ разделителя; это не может быть буквально *, потому что это уже используется для умножения (не то, чтобы я не мог его перегрузить, но приоритет был бы неправильным). Глядя на доступные символы, некоторые варианты

.foos = hmap!string!foo
.foos = hmap$string$foo
.foos = hmap?string?foo
.foos = hmap^string^foo
.foos = hmap`string`foo
.foos = hmap|string|foo
.foos = hmap~string~foo

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

Кроме того, на стандартной клавиатуре США `не смещен, для всех остальных требуется клавиша Shift. Есть ли разница на международных клавиатурах? Существуют ли какие-либо раскладки клавиатуры, на которых любой из вышеперечисленных кандидатов особенно прост или труден для ввода?

(Поскольку это вопрос без единого правильного ответа, это должна быть вики сообщества?)

Ответы [ 6 ]

1 голос
/ 05 марта 2010

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

Почему бы не использовать какой-либо синтаксис скобок, как в большинстве распространенных языков, либо

Map<String, Foo>

или

Map[String, Foo]

(или {} / () соответственно)

Обратите внимание, что - как в OCaml или Haskell - пробелы также могутиспользоваться довольно всесторонне.

foos : int list

или

foos :: Map String Foo

Более широкая теория: простой универсальный тип - это тип с kind * -> * -Следовательно, она должна рассматриваться как функция от типов к типам

List<Int> применяет конструктор универсального типа List<α> для конкретного типа Int,который дает другой конкретный тип - специализированный список.

Поэтому мне нравится общая специализация на , чем-то напоминающая приложение функции .

Использование * может иметь смысл какэто кортежей типов!Так что Map String*Foo действительно может быть хорошим вариантом, если вы хотите полагаться на синтаксис оператора, так как он различает конструктор типа и (tupled) аргументы типа.

0 голосов
/ 23 сентября 2010

Возможно, вам следует использовать ключевое слово "of":

map = HashMap of String, Foo()

В Boo это будет выглядеть так:

map = HashMap[of string, Foo]()
0 голосов
/ 05 марта 2010

Мне вообще не нравится инфиксный оператор, потому что это вызывает вопросы об ассоциативности.

Например, hmap*string*foo, hmap<string, foo> или hmap<string<foo>> или, может быть, foo<string<hmap>>?

0 голосов
/ 05 марта 2010

Я не слишком заинтересован ни в одном из них по причинам, о которых упоминали другие люди. Скобки просто полезны для обозначения такого рода вещей, независимо от того, <<[((и т. Д. На выбор есть 4). </p>

Некоторые конкретные пункты перечисленных вами вариантов:

    .foos = hmap!string!foo - could be confused with negation.
    .foos = hmap$string$foo 
    .foos = hmap?string?foo - just doesn't look very definitive, the question mark makes me think you are saying it may be a string
    .foos = hmap^string^foo 
    .foos = hmap`string`foo - tricky to find the key!
    .foos = hmap|string|foo - could be confused with an 'or' operation
    .foos = hmap~string~foo 
0 голосов
/ 05 марта 2010

Я думаю

.foos = hmap(string, foo)

- это хороший синтаксис, позволяющий использовать типы как «функции», которые возвращают новые типы.

0 голосов
/ 05 марта 2010

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

Я бы попробовал нечто подобное с {} или (), если они еще не используются.

...