2011-01-13 105 views
7

一位同事說他聽說過一種沒有「if」概念的語言。那可能嗎?如果是這樣,它是什麼語言?沒有if的語言?

+0

你什麼意思通過'ifs'做?一種語言可能沒有明確的'if'運算符,但是每種語言都必須有一些*從一段代碼分支到另外兩段代碼的方式,否則程序的每個輸入都會給出相同的輸出。 –

+0

我的答案是否提供了您要查找的內容?如果是這樣,請將其標記爲您的問題的答案 – Coops

+0

另請參閱[can-you-write-any-algorithm-without-an-if-statement](http://stackoverflow.com/questions/1937362/can-you- write-any-algorithm-without-an-if-statement) – nawfal

回答

1

我相信語言必須有做選擇的一些手段,爲了Turing-Complete。但是,這意味着您不必成爲您的經典if語句表單。

也許最熟悉的例子是正則表達式語言。 (a | b *)根據|的對立面做出決定。不完全是「如果」聲明。

1

有跡象表明包括陳述的邏輯語言。查詢結果是一個邏輯評估,用於檢查結果是否可以由「已編碼」的規則組來承擔。

Prolog例如。

6

除了也許Prolog,我不知道任何特定的語言,但我可以想到幾種方式的語言沒有如果語句可能工作。事實上,你也不需要循環結構。你顯然需要一些條件分支和循環。

如果,例如,你有以下特點:功能ML風格的模式匹配的函數參數尾調用優化,你可以沒有如果的或循環進行編程。

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

將成爲soemthing像

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 

當然,你仍然需要普通的比較操作符,然後你可以使用簡單的真/假函數參數模式匹配代替條件。或者你可以匹配任意值。或者語言可以支持guard表達式,這些表達式基本上是用於確定函數過載是否有效的語句。

上面的例子顯然是人爲的,沒有IFS代碼/迴路是很多醜陋,更難比原來的理解,但它演示瞭如何湊合。更多或不同的語言功能可能使得編寫乾淨的程序而不用if/loops成爲可能。

另一種方式是這樣的,如果是真的== 1和虛假== 0

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

也就是說,存儲真假分支在列表或元組或任何你有一個可以通過true和false索引,然後使用條件的結果作爲索引,查找分支並調用函數。如果您的語言支持宏,則可能會將傳統條件轉換爲此格式。

+1

這個數組的實現讓我大惑不解。 –

4

Smalltalk中,這被認爲是一個「真正」的面向對象的語言,沒有「如果」的聲明,並沒有「對」的聲明,沒有「而」語句。還有其他的例子(如Haskell),但這是一個很好的例子。 來源:Without ifs

+2

然而,Smalltalk並沒有定義'ifTrue:'和'ifFalse:',以及'whileTrue:'和'whileFalse:' – jer

3

C++模板編程沒有一個「如果」建設,但通過模板特圖靈完備:

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

哇............ – JoelFan