没有if的语言?

时间:2011-01-13 20:09:30

标签: language-design

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

5 个答案:

答案 0 :(得分:6)

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

例如,如果您具有以下功能:功能函数参数上的ML样式模式匹配尾部调用优化 ,你可以在没有if或循环的情况下进行编程。

foo () {
    for (i = 1 to 10) {
        if even(i) {
            print "even"
        }
    }
}

将成为像

这样的东西
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)
}

或类似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

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

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

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

[function(){else-clause}, function(){then-clause}][condition]()

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

答案 1 :(得分:4)

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

答案 2 :(得分:3)

C ++模板编程没有'if'结构,但是通过模板专业化来完成Turing:

template <int N>
struct Factorial 
{
    enum { value = N * Factorial<N - 1>::value };
};

template <>
struct Factorial<0> 
{
    enum { value = 1 };
};

// Factorial<4>::value == 24
// Factorial<0>::value == 1

来自Wikipedia's article on template metaprogramming

答案 3 :(得分:1)

我认为一种语言必须有一些做出选择的方法才能成为Turing-Complete。但是,这意味着不一定是你的经典if语句形式。

最熟悉的例子可能是正则表达式语言。 (a | b *)根据|的相反方面做出决定。不完全是“if”声明。

答案 4 :(得分:1)

逻辑语言由语句组成。查询的结果是一种逻辑评估,用于检查结果是否由“编码”的规则组承担。

例如,请查看Prolog