否认阶段

2021-08-10 06:46:41

这是一个慵懒的周二下午。也许你正在闲逛你最喜欢的新闻聚合器,或者访问 The Orange 网站,通过模糊的创业团体思维来寻找有趣的链接。然而,今天,你遇到了一个谜。一种专有的、闭源的、商业的编程语言。一个奇怪的时代错误。这些程序,如果你可以这样称呼它们的话,就像是长时间用键盘打架的结果。该语言简称为“K”。在不自觉地将视线从附近终端的 C 编译器输出上移开之前,您对单字母名称的粗俗冒昧嗤之以鼻。 int sum = 0;for (int i = 0; i < 100; i++) { sum += i;} 这些程序的结构之间没有可见的对应关系。您在 K 中看不到任何词类,也没有要掌握的名称来提取含义。令人沮丧,但……有趣。 K 似乎是这些“代码高尔夫”语言之一,旨在编写神秘的单行代码,以最大限度地减少(键)击并展示一个人的聪明才智。谁不喜欢展示自己的聪明?然后你皱起眉头,记住聪明的代码是不可能维护的。在一篇论文能够从你的手指上讲出简单代码的价值之前,即使是在斯坦福大学受过教育的最初级的谷歌员工也能理解(优化是万恶之源,正如你曾经读过的那样)别人指出更直接地翻译成另一种语言可能看起来像:现在通信更清晰了。如果 K 中的每个标点字符都是一个单独的词性,并且您颠倒它们的顺序……倒退!你忍住了笑声。接下来是什么?仍然怀疑,但越来越多地投入到这个谜题中,你花一些时间阅读更多关于 K 的内容。一些流氓疯子已经为该语言的方言提供了主要工作的开源解释器,所以你试一试。您阅读了一些文章和教程,翻阅了作为该语言主要综合参考资料的 K2 手册,并尝试解决一些 Project Euler 问题。

在您阅读的过程中,您会短暂地遇到 J 和 APL,它们看起来比 K 更陌生,但……在许多方面都相同。 J 和 APL 有 K 的从右到左求值(出于某种原因,令人讨厌地蔑视 PEMDAS),/ 符号的意思是“减少”,您可以像添加单个数字一样轻松地将 5 添加到整个矩阵。为什么你想要这个属性仍然难以捉摸 - 它看起来相当学术和数学 - 但你不得不承认它相当整洁。你有越来越多的印象,K 不仅仅是一个一次性的怪人,而是整个家谱中的一员。好吧,K有一些吸引力。能够冲掉 ,/ 扁平化列表是很好的。 “等级”运算符 < 和 > 起初似乎是一种笨拙的排序方式,但是您开始发现“置换向量”还有许多其他用途。关于列表索引和函数应用程序如何成为相同的操作,这是非常正确的。 K 似乎太特定于领域而无法用于实际工作,但也许将某些 K 原语实现为您最喜欢的语言的库会很方便?符号仍然感觉像一个问题。简单地使用拼写的名称不是更清晰、更易读吗?也许而不是写作:原则上,这应该更具可读性和更容易理解。您已尽职尽责地将定义分解为可重复使用的部分,并为它们指定了清晰、有意义的名称,这是您在最早的编程课程中学到的最佳实践,并在您的整个职业生涯中得到了贯彻。不过,这一次的结果令人担忧,令人不满意。如果你写得更简洁,“mostCommon”这个名字比 K 中的整个定义都要长。可以把 K 写成一个看起来很奇怪的 Lisp、M 表达式等等:或者你可以在没有条件、递归或任何明确命名的变量的情况下表达相同的想法:给 K 习语一个名字是否会让它更清晰,或者它是否掩盖了实际发生的事情?

“序数”这个词可以是任何意思,但组合 << 只具有一种含义。 (那个点击需要一段时间,但是当它点击时它很令人满意。)如果原始“组”只是这个词开头,你会比看到符号=更了解它做了什么吗?有时,长名称更具描述性,但有时只是……更长。它比 +/!100 更明确,但现在它在你的嘴里留下了不好的味道。查看您同事今天提交的补丁,您发现一个具有熟悉结构的循环: let max = list[0];for (let i = 0; i < list.length; i++) { if (list[i] >最大值){ 最大值 = 列表 [i];您提出了一个替代方案,对避免与 JavaScript 的可变参数 Math.max() 发生冲突所需的 lambda 表示法略有畏缩:您的建议被拒绝为神秘且过于复杂。 Lambda 很难理解,更不用说reduce()。有人认为,for 循环更加直观、自然和可读。如果您在代码库中的任何地方使用巧妙的技巧,将无法维护。做出妥协:

let max = list[0];for (let i = 0; i < list.length; i++) { max = Math.max(list[i], max);} 在 Orange 网站上,有人发起了一个关于一种带有单字母名称的晦涩语言。评论者很快就对它的不可读性表示怀疑。