9

我想用标识符中的Unicode字符(非拉丁文)在Haskell中编写一些教育代码。 (这样标识符对于非英文自然语言的演讲者来说看起来很好,很自然,因为在写作中不使用拉丁字符)。所以,我着手寻找适当的Haskell实现来实现这一点。在何处指定是否允许在Haskell实现中使用Unicode标识符?

但如果是这个功能在语言规范中规定?在寻找合适的实现时,我将如何引用此功能? (和已知哈斯克尔implemenations实际支持Unicode标识符?)

原来,一个Haskell的实现没有接受我使用Unicode识别码,而另一个没有接受它。如果有一种方法可以将我的代码的这种需求正式化,我可能会希望它以语言功能开关的形式出现,这样,如果我或其他人试图运行我的代码,立刻就会清楚他的实现是否缺失所需的功能,因此他应该寻找另一个。 (这个功能也可能有一个wiki页面 - “Unicode标识符”,它将列出哪些现有的实现支持它,以便人们知道如果需要它可以去哪里。)

(顺便说一句,我已经在这个问题上加了一个“语法”标签,但我实际上认为它是一个lexing级别的问题,这个级别比语言的语法级别要低。这里是否有标签的lexing级别的特征标签?语言,而不是语言的语法规范的特征?)

+0

至于最后一段:它是语法的一部分。它可能不是语法的一部分,但标记化和解析之间的区别仅在实践中存在。还有一些系统(例如Parsing Expression Grammars)可以跳过标记化步骤并迎合实际的源代码。我的实验 – delnan 2011-04-01 18:48:03

+1

详情:GHC-6.10.4- [ALT2(http://prometheus.altlinux.org/en/5.1/srpms/ghc)(IIRC)不接受统一标识,GHC-6.12.3- ALT4和GHC-7.0.1- [ALT1(http://prometheus.altlinux.org/en/Sisyphus/srpms/ghc)允许使用Unicode的标识符,并且hugs98-20060921- [alt5](HTTP://prometheus.altlinux .org/en/5.1/srpms/hugs98)不允许使用Unicode标识符(这是不幸的,因为我认为它可能比ghc更好,因为它更简单,也许更简单的错误消息)。 – 2011-04-01 18:53:13

+0

更多有关Unicode ID的相关实验:啊,我也尝试了curry-0.9.11(因为我可能想用Curry“extensions”展示一些代码):这个Muenster Curry Compiler不允许Unicode标识符(IIRC) 。 – 2011-04-01 19:01:55

回答

10

Online ReportLexemes下记录这个文件。它还很早就注意到“Haskell使用Unicode字符集,但源程序目前偏向早期版本的Haskell中使用的ASCII字符集。”

实际的编译器可能会或可能不支持Unicode标识符。 GHC,但你必须记住,Unicode代码点必须遵守相同的规则ASCII字符:类型必须与被归类为大写或首字母大写,变量为小写代码点开始(尽管事实上这是放宽到字母,而不是大写/标题;这可能值得向语言委员会澄清),操作员必须是标点或符号。 (这意味着你不能用阿拉伯语来声明类型,例如,除非你在其他脚本中加上大写字母/标题的字符作为前缀)。

至于收集Unicode支持信息:虽然我不知道提供它的单个页面,在Haskell Wiki上搜索"unicode"可在多个Haskell编译器中查找有关Unicode支持的信息。

+0

感谢这样一个快速和详尽的答案与链接! – 2011-04-01 19:24:06

+3

对于了解阿拉伯数字身份证这样的不幸案例,这是有趣的。 (用希伯来语测试你的预测。)Haskell可以放松unicase书写系统的这些语法规则,或者用不同的方式说明它们:考虑到在公式中只使用拉丁或希腊字母是很自然的事情,容忍unicase字母不能用于本地绑定的id (和所有varid),并允许在类型名称中使用unicase字母。然后全局函数没有“本地化”名称,但至少有_可以是本地化全局函数名称的中性前缀。 – 2011-04-04 00:37:11

相关问题