我正在设计模板/泛型的语法。 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
由于这在某种程度上是一个美学问题,我想我会进行一次民意调查:你最喜欢哪个选项?还有其他选择吗? (像往常一样,如果您的答案已经发布,请提前投票而不是复制。)
此外,在标准的美式键盘上,`是未移位的,其他每个键盘都需要移位键。国际键盘有区别吗?是否有任何键盘布局上面的任何一个候选人特别容易或难以输入?
(因为这是一个没有正确答案的问题,它应该是社区维基吗?)
答案 0 :(得分:1)
我不认为这些符号中的任何一个确实清楚地表明您将类型参数列表应用于泛型类型。
为什么不是像大多数常见语言那样的某种括号语法
Map<String, Foo>
或
Map[String, Foo]
(或分别为{}
/ ()
)
请注意 - 就像在OCaml或Haskell中一样 - 空格也可以非常全面地使用。
foos : int list
或
foos :: Map String Foo
一些更广泛的理论:简单泛型类型是kind * -> *
的类型 - 因此它必须被视为从类型到类型的函数
List<Int>
在具体类型List<α>
上应用泛型类型构造函数Int
,这会产生另一种具体类型 - 专门列表。
因此,我喜欢以某种方式类似于函数应用程序的通用特化。
使用*
可能有意义tuples类型!因此,如果你想依赖运算符语法,Map String*Foo
实际上可能是一个不错的选择,因为它区分了类型构造函数和(tupled)类型参数。
答案 1 :(得分:0)
尖括号比我的选项更适合我,因为它们会将它们之间的元素与其他代码分开的视觉分离。
如果尚未使用,我会尝试与{}
或()
类似的内容。
答案 2 :(得分:0)
我认为
.foos = hmap(string, foo)
是一个很好的语法:允许将类型用作返回新类型的“函数”。
答案 3 :(得分:0)
由于其他人提到的原因,我不太热衷于他们中的任何一个。括号对于表示这种事物是有用的,无论它是否&lt; {[(等等有4种可供选择。
您列出的选项的一些具体要点:
.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
答案 4 :(得分:0)
我一般不喜欢中缀操作符,因为它引发了关于关联性的问题。
例如hmap*string*foo
和hmap<string, foo>
或hmap<string<foo>>
或foo<string<hmap>>
?
答案 5 :(得分:0)
也许您应该使用“of”关键字:
map = HashMap of String, Foo()
在Boo中它看起来像这样:
map = HashMap[of string, Foo]()