【问题标题】:Ascii punctuation characters to basic latin lowercase alphabet mappingAscii 标点字符到基本拉丁小写字母的映射
【发布时间】:2014-06-18 06:48:11
【问题描述】:

Haskell 等语言允许您创建自己的运算符。以下答案解释了运算符中允许使用哪些标点符号:https://stackoverflow.com/a/10548541/783743

另一方面,JavaScript 等语言不允许您在变量名中使用标点符号($ 旁边)。 [1]

我正在编写一个编译器,它将 Haskell 的一个子集编译为 JavaScript,但我不知道如何将运算符转换为有效的 JavaScript 标识符。

因此我决定将每个标点符号映射到一个基本的拉丁小写字母(即a-z)。例如:

& = a
| = l
@ = q

然而,与其自己决定字符映射,我首先想知道是否其他人已经做过同样的事情,或者是否有一个标准来决定如何映射它们。

我意识到这个问题可能主要基于意见(由于某种原因在 StackOverflow 上是严格禁止的)。因此,我只是在寻找明确说明“这是这样做的方法”(可能带有链接)的规范答案。如果您想发表意见,那么您可以在 cmets 中进行。

目前我希望将 19 个字符映射到字母表:

! # $ % & * + . / < = > ? @ \ ^ | - ~

虽然$ 是 JavaScript 中标识符的有效字符,但也可以将其映射到字母表。


[1] 属性名称可以包含特殊字符,但这是一个丑陋的 hack。

【问题讨论】:

  • 问题是:你希望你的 js 代码是人类可读的吗?
  • @didierc 在我看来True.aa(True)True["&amp;&amp;"](True) 更易于阅读。后一种情况更具描述性,但在我看来它看起来很丑。
  • 我的意思是:如果你关心可读性,当然你会尝试坚持常用的习惯用法(使用方法而不是数组选择器),但如果你不这样做,那么它可能让你的生活更简单,无论哪种方式允许从 haskell 标识符直接映射到 js 标识符。
  • @didierc 是的,我确实希望生成的代码可读。我希望人们能够理解生成的代码并将其与他们的 JavaScript 应用程序集成。

标签: javascript haskell coding-style mapping ascii


【解决方案1】:

Ghc 使用他们所谓的 z 编码。例如,&gt;&gt;= 被编码为zgzgze。见https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/SymbolNames

【讨论】:

  • 感谢您了解 GHC 的正式工作。因此+1。然而,将标点字符扩展为两个字符代码会使运算符的大小加倍。当可读性和可理解性很重要时,这是不可接受的。
  • 扩展为两个字符的原因是为了完全明确。您不希望函数 gge&gt;&gt;= 运算符冲突。如果您知道名称不会混合符号和字母,那么您可以在名称的开头只使用一个运算符标记,例如 op_gge
  • 是的。我正在考虑将&amp;&amp; 转换为aa。但是,如果已经有一个名为aa 的函数,那么我会将其编译为$aa。由于 $ 在 Haskell 的 varsyms 中不是有效字符,而 $ 在 JavaScript 的标识符中是允许的,这将解决所有歧义,同时将符号的长度保持在最小。
  • 但如果$aa 符号已被占用,您将不得不寻找另一种方法。 c 只是在任何符号前加上下划线,但会出现同样的问题,尽管该标准曾经阻止将这种用法用于系统/编译器代码以外的任何内容。你真的没有那么奢侈。
  • @didierc 永远不能使用$aa 符号,因为Haskell 不允许在varsyms 中使用$。编译后的 JavaScript 代码将被命名空间。因此,它也不会导致任何命名冲突。
猜你喜欢
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多