【问题标题】:language without if's?没有if的语言?
【发布时间】:2011-01-13 20:09:29
【问题描述】:

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

【问题讨论】:

  • ifs 是什么意思?一种语言可能没有明确的if 运算符,但每种语言都必须有某种方式从一段代码分支到另外两段代码,否则程序的每个输入都会给出相同的输出。
  • 我的回答是否提供了您正在寻找的内容?如果是这样,请将其标记为您问题的答案

标签: language-design


【解决方案1】:

也许除了 Prolog 之外,我不知道任何特定的语言,但我可以想到一些没有 if 语句 的语言可以工作的方式。事实上,您也不需要循环结构。您显然需要某种条件分支和循环方式。

例如,如果您具有以下特性:函数函数参数上的 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

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

上面的例子显然是人为的,没有 ifs/loops 的代码比原来的代码更丑陋,更难理解,但它展示了你如何做到这一点。更多或不同的语言特性可能使编写没有 if/循环的干净程序成为可能。

另一种方法是这样的,如果 true == 1 和 false == 0。

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

也就是说,将真假分支存储在一个列表或元组或任何你有的可以被真假索引的东西中,然后使用条件的结果作为索引,查找分支并调用函数。如果您的语言支持宏,则可能会将传统条件句翻译成这种格式。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • Smalltalk 确实定义了ifTrue:ifFalse:,以及whileTrue:whileFalse:
    【解决方案3】:

    C++ 模板编程没有“if”结构,但通过模板特化实现了图灵完备:

    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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        有由语句组成的逻辑语言。查询的结果是一个逻辑评估,它检查结果是否可以被“编码”的规则组假定。

        Prolog 为例。

        【讨论】:

          猜你喜欢
          • 2023-01-16
          • 2019-09-17
          • 1970-01-01
          • 1970-01-01
          • 2013-10-07
          • 2011-04-09
          • 1970-01-01
          • 1970-01-01
          • 2012-12-20
          相关资源
          最近更新 更多