没有if的语言?

Joe*_*Fan 8 language-design

一位同事说他听说过一种没有"如果"概念的语言.那可能吗?如果是这样,它是什么语言?

小智 6

除了Prolog,我不知道任何特定的语言,但我可以想到一些没有if语句的语言可能有用的方法.实际上,您也不需要循环结构.你显然需要一些条件分支和循环方式.

例如,如果您具有以下功能:函数,函数参数上的ML样式模式匹配尾调用优化,则可以不使用if或循环进行编程.

foo () {
    for (i = 1 to 10) {
        if even(i) {
            print "even"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

会变得如此像

print_if_true (true) {
    print "even"
}
print_if_true (false) {}

foo_loop (11) {
}
foo_loop (n) {
    print_if_true(even(n))
    foo_loop(n+1)
}

foo () {
    foo_loop(1)
}
Run Code Online (Sandbox Code Playgroud)

或者使用类似ML的语法:

foo => 
    let loop 11 => 0
              n => p_i_t(n), loop n + 1
    and p_i_t true => print "even"
                 _ => unit
    in
        loop 1
    end
Run Code Online (Sandbox Code Playgroud)

当然,您仍然需要通常的比较运算符,然后您可以使用简单的true/false函数参数模式匹配而不是条件.或者你可以匹配任意值.或者语言可以支持保护表达式,这些表达式基本上是判断函数重载是否有效的语句.

上面的例子显然是做作的,没有ifs/loops的代码比原版更加丑陋和难以理解,但它演示了如何做到.更多或不同的语言功能可以在没有if/loops的情况下编写干净的程序.

另一种方式是这样的,如果是真== 1和假= = 0.

[function(){else-clause}, function(){then-clause}][condition]()
Run Code Online (Sandbox Code Playgroud)

也就是说,将true和false分支存储在列表或元组或任何可以通过true和false索引的内容中,然后使用条件的结果作为索引,查找分支并调用函数.如果您的语言支持宏,则可能将传统条件转换为此格式.


Coo*_*ops 5

Smalltalk被认为是“真正的”面向对象的语言,没有“ if”语句,也没有“ for”语句,没有“ while”语句。还有其他示例(例如Haskell),但这是一个很好的例子。资料来源:无ifs

  • 不过,Smalltalk确实定义了“ ifTrue:”和“ ifFalse:”以及“ whileTrue:”和“ whileFalse:”。 (3认同)

T.E*_*.D. 1

我相信一种语言必须有一些进行选择的方法,才能实现图灵完备。然而,这意味着不一定是经典的 if 语句形式。

也许最熟悉的例子是正则表达式语言。(a | b*) 根据 的相反两侧做出决定|。不完全是一个“如果”陈述。