在你看来,你遇到过的最令人惊讶、最怪异、最奇怪或最“WTF”的语言特性是什么?

请每个回答只回答一个特征。


当前回答

Scheme中没有保留标识符。因此,下面的表达式的值为1:

((lambda (lambda) lambda) (let ((let 1)) let))

注意,给定作用域内的定义是有限制的:任何定义都不能重新定义用于在该作用域内定义标识符的标识符,因此下面是一个语法错误:

(begin (define define 1) define)

其他回答

在Common Lisp中,零维数组是很奇怪的,而且很自然地,它们具有读取语法。

? (aref #0A5)
5

在c#中,这至少应该生成一个编译器警告,但它没有:

public int Something
{
    get { return Something; }
    set { Something = value; }
}

当被调用时,它会导致你的应用程序崩溃,你不会得到一个好的堆栈跟踪,因为它是一个StackOverflowException。

在JavaScript中,undefined是一个全局变量,其默认值为原始值undefined。你可以改变undefined的值:

var a = {};
a.b === undefined; // true because property b is not set
undefined = 42;
a.b === undefined; // false

由于undefined的可变性,通过typeof检查undefined通常是一个更好的主意:

var a = {};
typeof a.b == "undefined"; // always true

这缺少了一个奇怪的特性:Python没有switch语句(尽管存在变通方法)。

在Perl中,对象只是被祝福的引用,所以在运行时改变对象的类是小菜一碟:

package Foo;
sub new { bless {}, $_[0] }
package Bar;
package main;
my $foo = Foo->new;
ref($foo); # => "Foo"
bless $foo, 'Bar';
ref($foo); # => "Bar"

我很惊讶其他语言不能做到这一点。多么有用的功能啊!