[1537] Types

Title Text:colors.rgb(“blue”) yields “#0000FF”. colors.rgb(“yellowish blue”) yields NaN. colors.sort() yields “rainbow”<

Origin:https://xkcd.com/1537/

https://www.explainxkcd.com/wiki/index.php/1537:_Types

这部漫画是关于一种荒谬的新编程语言的一系列编程笑话,可能受到Mathematica和Wolfram语言的启发 – 后者多次被Randall使用。也许它的灵感来自于Gary Bernhardt的CodeMash 2012关于JavaScript无法预测的打字的闪电话题。在演讲中,技术性很强的观众无法正确猜测添加各种JavaScript类型的结果,并在发布时大笑起来。这个漫画中显示的编程语言比JavaScript更难以预测。

大多数常规编程语言区分类型,例如整数,字符串,列表 – 所有这些都有不同的行为。但是,例如,操作“+”通常通常在多于一种类型上定义。应用于两个整数,它返回它们的总和。应用于两个字符串(用引号括起来表示),它连接起来:

&GT; 2 + 35

&GT; “123”+“abc”“123abc”

虽然这些行为是标准的,传统的和直观的,但当您将类似“+”的操作应用于不同类型时,编程语言之间存在巨大的差异。一种逻辑方法是在所有类型混合的情况下总是返回错误,但是允许一些情况混合通常是实用的,因为它可以极大地简化表达式。当你混合类型时,变化和缺乏明显更直观的行为会导致某些语言产生奇怪的结果。

新的XKCD编程语言中有许多奇怪的结果:

 2 +“2”在数字和字符串上使用+运算符。在某些编程语言中,这可能会导致数学加法中的数字4,或字符串连接中的“22”;但是,新语言将字符串转换为整数,将它们添加到生成4并转换回字符串。或者,它可以改为将2添加到字符“2”(50)的ASCII值,从而得到字符“4”(52)。这(有些)与第4项的行为一致。

 “2”+ []将一个字符串添加到数组或列表中。这首先莫名其妙地将字符串再次转换为数字,然后通过预先将数字添加到列表中。然后结果(整个数组)再次转换为字符串。

 (2/0)将2除以0并且相当合理地导致NaN,意思是“非数字”,尽管在大多数语言中,如IEEE 754标准对浮点数的规定,将非零数除以零将改为返回无限值。

 (2/0)+2加2到NaN。 2再次“添加”到字符串“NaN”,数字将转换为字符串,显然没有理由,这会产生“NaP”。如果语言的约定是添加到字符或字符串的ASCII值,那么在这种情况下,它将字符“N”(78)加2,得到“P”(80)。如何将字符串“NaP”转换为具有未定义含义的裸NaP尚不清楚。 “NaP”可能意味着“不是积极的”,而不是“非积极的”。它也可能意味着“不是祷告”,因为你正在采取“NaN”条件,并试图用它做更多。

 “”+“”:在许多语言中,两个连续的双引号字符表示一个空字符串,因此该表达式将连接两个空字符串,从而产生一个空字符串。但是,似乎这种语言只将表达式的最外层引号视为字符串边界,因此它们之间的所有字符都成为文字字符串的一部分,产生“+”’(在许多编程语言中,您可以同时使用它们“或’分隔字符串,如果不相同则两者表现相似。”或者,这两个连续的双引号可以被视为类似于在SQL字符串中处理连续单引号的方式,第一个引号转义为第二个。这将得到一个包含值“+”的字符串。

 也可以将此表达式理解为“”+“”,通常为“”“。

 [1,2,3] +2似乎测试是否将2附加到列表[1,2,3]是合理的,并得出结论它不适合模式,返回布尔值false。可以想象,也可能是尝试将2添加到集合[1,2,3],其中已经包含该元素(尽管{1,2,3}将是集合的更常见的表示法)。

 由于同样的原因,[1,2,3] +4返回true。2 /(2-(3/2 + 1/2))是一个浮点笑话。众所周知,浮点数是不精确的。使用精确的数学,(3/2 + 1/2)将精确为2,因此在Randall的新语言中,整个事物将评估为2/0或NaN。然而,(3/2 + 1/2)的结果是“略微偏离”,这使得结果“略微偏离”NaN,这在真实语言中是荒谬的。具有讽刺意味的是,分母中含有2的分数不是通常遭受浮点不精确的数字。此外,如果确实存在舍入误差,则实际计算变为2 /0.000000000000013,由于它不是除零,因此不应返回NaN。在“十进制”末尾的“13”之前有13个零,这很可能不是巧合。

 RANGE(“”)通常没有任何意义。但是,新语言似乎将其解释为ASCII,而在ASCII表中,字符#32是空格,#33是!,而#34是“。所以,不是将”解释为“字符串,它似乎是解释为34,32,34(ASCII格式),然后范围似乎将其转换为34,33,32,33,34(数字之间的“范围”),解释为ASCII,变为(”’ ,’!’,”,’!’,’“’)。

 +2将第2行加10,并返回结果12。

 2 + 2通常为4.但是,解释器接受此指令意味着用户希望将程序的其余部分的数字2(也称为“字面值”)的实际值增加2,使其成为4然后报告工作是“完成”。结果可以在后续行中看到,其中所有2都被4s替换。这可能是对Fortran等语言的引用,其中可以为文字指定新值。

RANGE(1,5)通常会返回(1,2,3,4,5);但是,因为2的值已经变为4,所以它返回(1,4,3,4,5)。这也会通过将12中的“2”更改为“4”来影响行号,从而产生行号14。

FLOOR(10.5)应该返回10(十进制数的“floor”是向下舍入的数字);但是,它会返回“地板”上的数字的ASCII艺术。

标题文本包含三个与颜色有关的其他示例。 color.rgb(“blue”)返回纯蓝色的十六进制代码(例如,将在HTML中使用),这是真正的编程语言可能起作用的方式。 “黄蓝色”的查找再次返回“NaN”(非数字),这在一个层次上是有意义的,因为没有“黄蓝色”这样的颜色(黄色和蓝色在RGB颜色三角形上是对立的,使得黄色 – 蓝色是一种不可能的颜色,只能通过人为的数字很难察觉。然而,更典型的结果将是失败,表明颜色数据库不包括名称,就像诸如“bluw”之类的拼写错误一样。 (请注意,HTML确实会明确地尝试处理所有“颜色名称”。对于记录,“黄蓝色”是深蓝色,带有难以察觉的红色数量?#0E00B0。)类似地,对颜色进行排序通常会产生一些定义的顺序,例如按字母顺序排列,但在这种语言中它会生成字符串“rainbow”。兰德尔的新语言似乎以一种异常深刻的方式理解色彩理论。

Leave a Reply

Your email address will not be published. Required fields are marked *

Categories