在源文件中使用Unicode和缺少Unicode符号 自从我知道CLAN能够编译在Unicode中编写的C++源文件,我开始在编写数学相关代码时大量使用它。比较 uₙ₊₁ᵖ = A*uₙ + B*uₙ₋₁; uₙ₊₁ᶜ = π * Aₜₒₜ; uₙ₊₁ = uₙ₊₁ᵖ + uₙ₊₁ᶜ;

在源文件中使用Unicode和缺少Unicode符号 自从我知道CLAN能够编译在Unicode中编写的C++源文件,我开始在编写数学相关代码时大量使用它。比较 uₙ₊₁ᵖ = A*uₙ + B*uₙ₋₁; uₙ₊₁ᶜ = π * Aₜₒₜ; uₙ₊₁ = uₙ₊₁ᵖ + uₙ₊₁ᶜ;,unicode,readability,code-readability,Unicode,Readability,Code Readability,及 对我来说,这就像日日夜夜:我只是通过阅读理解第一段代码,而我只是不想阅读另一段代码 我知道Python3和Ruby允许Unicode源文件,所以这个特性似乎正在传播 反对这种做法的人可能会提出反对意见:例如,并非所有字体都支持这些字符,源文件取决于您使用的编码,您必须实际将Unicode字符从文本编辑器的某个位置复制/粘贴到文本编辑器中。然而,我认为可读性的提高真的很大 现在,正如您在上面看到的,并非所有(甚至不是拉丁语)字母都有下标和上标。更糟糕的是,它们绝对不是用于在源文件中编写数学的(

对我来说,这就像日日夜夜:我只是通过阅读理解第一段代码,而我只是不想阅读另一段代码

我知道Python3和Ruby允许Unicode源文件,所以这个特性似乎正在传播

反对这种做法的人可能会提出反对意见:例如,并非所有字体都支持这些字符,源文件取决于您使用的编码,您必须实际将Unicode字符从文本编辑器的某个位置复制/粘贴到文本编辑器中。然而,我认为可读性的提高真的很大

现在,正如您在上面看到的,并非所有(甚至不是拉丁语)字母都有下标和上标。更糟糕的是,它们绝对不是用于在源文件中编写数学的(请参阅)

因此,我的问题是:

  • 数学相关代码是否使用Unicode?你觉得这个用法怎么样

  • 有没有办法把一个字符变成下标或上标?(类似于用于变音符号的组合字符)

  • 我会说不,除非

    • 仅限内部代码,且不会污染公共API
    • 整个团队都认为这是一个重大的好处
    • 仅数学密集型函数(不适用于相当琐碎的数学任务)
    • 与业务逻辑/接口代码分离
    • 仅限于unicode的某些子集(可能只是下标和希腊符号)
    即使所有这些要求都得到了满足,我也会根据可读性的提高来权衡使用的麻烦,并倾向于坚持使用ASCII

    确保您为您的团队提供了严格的指导原则,以确保您不会陷入每个
    for
    循环都使用
    i的情况ₙ

    我的计算机似乎不喜欢您使用的“拉丁下标小写字母N”(U+2099)字符,只是将其渲染为一个大大降低可读性的方框。确保您的工具/字体支持这种编辑风格

    PEP8指出,标准库中的标识符不应使用unicode字符,这可能有很好的理由


    总而言之,除非你有一个很好的理由,并且只在单独的数学密集型模块中使用,否则不会。我想我可以确信它在某些情况下是有价值的。

    我要问OP的问题是:
    从那时起有多长时间了

    好问题。Unicode已经存在很长一段时间了,那么为什么编程必须使用美式ASCII而不带任何重音呢?在工作和学习C#和Javascript时,我发现这些语言都支持Unicode。C#在
    系统中定义了两个有趣的常量。Math

        //     Represents the natural logarithmic base, specified by the constant, e.
        public const double E = 2.7182818284590451;
    
        //     Represents the ..., specified by the constant, π.
        public const double PI = 3.1415926535897931;
    
    这里我们看到π的unicode注释,而不是π的unicode注释ℯ. 同时拥有两个带有unicode标识符的常量是不是很好,以便能够写入,例如:

     double circumference = 2 * Math.π * r;
    
    e的情况很复杂,因为它经常与指数一起使用,指数总是很难在一行上表示。此外,还提供了ℯ (U+212F)、日志库和℮ (U+212E),一个电子的电荷,是可疑的。我真的找不到基本电荷的确切正确的unicode码

    我想除了常见的希腊字符之外,这些常量并没有真正的Unicode,应该在Unicode希腊字母表中查找

    我对System.Math的结论是保留ascii标识符E和PI,并添加unicode标识符π

    至于OP问题1,我还建议使用希腊字母表的数学变量,而不是强制使用φ到φ,δ到δ或d,如:

    var x = 2 * π * sin(φ);
    
    这样的代码肯定不会比ascii版本更难维护

    然而,我喜欢从ascii到unicode的技术进步,我仍然建议使用简单的美国古英语进行编程。西班牙语、匈牙利语的变量名和注释,不用了,谢谢。对于最初的程序员来说也许很好,但是这使得协作更加困难。(披露:我不是以英语为母语的人)而且,至少在C#和Javascript中,保留的单词仅为英语:
    for
    if
    else

    所以:简单一点:unicode代表希腊字母:是的,代表数学符号。多语言(口音)的Unicode:不,请使用英语


    超级/下标:实际上我觉得这是个好主意。我看到的问题在于复杂性:下标中的
    n+1
    是变量名的一部分,但看起来像是一个C#/C++操作。只是不要在名称中使用类似运算符的图示符。

    对于2。不,正如你所理解的,“上标”是一种属性。Unicode不“做”属性。它与变音符号不同(可能是您的键盘驱动程序允许输入基本字符,然后输入重音,以获得重音字符)。@Jongware:Unicode块U0300包含“组合变音符号”。它们是向前面的基本字符添加变音符号的代码点。这独立于键盘驱动程序。@MSalters。正确(但与问题无关,因为这并不是真正的“组合”两个字符。这些字符设计为负宽度的字体,因此它们显示在正确的位置。此外,支持OpenType的应用程序可能会将这两个字符替换为带有重音的单个设计字形。)
    var x = 2 * π * sin(φ);