2010-03-05 59 views
2

我正在设计模板/泛型的语法。 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 

,因为这是一定程度上的审美问题,我想我会采取投票:你最喜欢哪个选项?还有另外一种选择是否可取? (像往常这样的问题,如果你的答案已经发布,请upvote而不是复制。)

另外,在标准的美国键盘上,`未被移位,其他每个都需要shift键。国际键盘有什么不同?有没有任何上述候选人特别容易或难以打字的键盘布局?

(由于这是没有一个唯一正确的答案的问题,它应该是一个社会维基?)

+1

我相信d使用'(参数)'! – 2010-03-05 15:59:16

+0

所以它。也许我应该使用!并遵循先例,那么? (我必须使用明确的标记字符来消除对象创建的歧义,而且我不能使用尖括号,因为它们在比较运算符方面会含糊不清)。 – rwallace 2010-03-05 16:11:21

+0

@rwallace:你想创建什么样的语法?当然,你可以在不同的环境中使用相同的符号。 – Dario 2010-03-05 16:31:37

回答

0

尖括号为我工作比你选择好,为他们创造一个视觉分离之间的所有元素他们从其他代码。

我会尝试类似{}(),如果它们尚未使用。

1

我不认为这些符号中的任何一个确实清楚地表明您将类型参数列表应用于泛型类型。

为什么不只是某种支架语法像最常见的语言,无论是

Map<String, Foo> 

Map[String, Foo] 

(或{} /分别()

注意 - 像OCaml或Haskell - 空白也可以相当全面地使用。

foos : int list 

foos :: Map String Foo 

一些较宽的理论:一个简单的一般类型是与kind* -> *一个类型 - 因此它必须被视为从类型类型一个功能

List<Int>适用泛型类型construc tor List<α>对混凝土类型Int,这产生另一个具体类型 - 专业列表。

因此,我喜欢通用专业化到莫名其妙地类似于功能应用程序

使用*可以合理,因为它tuples类型!所以如果你想依赖操作符语法,Map String*Foo实际上可能是一个好的选择,因为它区分了类型构造函数和(tupled)类型参数。

+0

我也认为泛型专业化与功能应用类似。就像在一些函数式语言中一样,我将函数参数用于并置,所以f(a,b)只是写成f a b。如果我使用类似hmap!string!foo的泛型专用化的东西,我喜欢将它看作是函数应用程序的一个变体,其中空间被替换为不同的字符以消除歧义。 – rwallace 2010-03-05 16:19:05

+0

@rwallace:那么'$'可能有点合适;)但是这个语法必然意味着类型的currying,这在一个非函数式的语言中可能有点复杂。因此,元组方法或简单的括号可能会更好(只是我的意见)。 – Dario 2010-03-05 16:24:15

+0

请注意,任何这些符号都会使单一类型难以与简单的光学观点区分开来。空格或至少象'或*一样大小不同的符号是必须的! – Dario 2010-03-05 16:29:10

0

我觉得

.foos = hmap(string, foo) 

是一个很好的语法:允许类型被用作“功能”,它返回的新类型。

0

由于其他人提到的原因,我不太喜欢他们中的任何一个。支架只是有用表示这种事情,不管它是< {[(等有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 
+0

括号全部用完了,唉。但你提出了一些好点。好的, ?出去了;和'可能是不可取的,尽管未被移位的符号是诱惑的。至少我使用的关键字不是,所以!是毫不含糊的。 – rwallace 2010-03-05 16:23:38

+0

您的语言可能是明确的,但是您必须记住,阅读代码的人必须能够在不知道语法的所有更精细细节的情况下,对所发生的事情有一个模糊的概念。如果您在大多数语言中使用通常代表其他语言的符号,则必须注意它的含义是清楚的。 – 2010-03-05 19:05:28

+0

是的。这是使用$的另一个说法,$在其他地方用于连接复合名称的部分内容,至少与模糊相关的用法有关。 – rwallace 2010-03-06 04:13:39

0

我因为它提出了关于关联问题不喜欢这个一般中缀运算符。

例如是hmap*string*foohmap<string, foo>hmap<string<foo>>或者一个foo<string<hmap>>

+0

您提出了一个关于关联性的好方法。我认为答案是它保持联想并且自动curry--请参阅我对Dario的关于类型currying的回复。 – rwallace 2010-03-05 16:45:41

0

也许你应该使用 “的” 关键词:

map = HashMap of String, Foo() 

在嘘它应该是这样的:

​​