2011-01-13 12 views
7

Kolega powiedział, że słyszał o języku, który nie miał pojęcia "jeśli". Czy to jest możliwe? Jeśli tak, jaki to jest język?język bez, jeśli jest?

+0

Co masz na myśli przez 'ifs'? Język może nie mieć jawnego operatora 'if', ale każdy język musi mieć * jakiś * sposób rozgałęzienia z jednego kawałka kodu na dwa inne fragmenty kodu, albo każde wejście do programu zawsze dawałoby takie samo wyjście. –

+0

Czy moja odpowiedź zawierała to, czego szukałeś? Jeśli tak, proszę oznaczyć go jako odpowiedź na swoje pytanie. – Coops

+0

Zobacz także [można napisać-dowolnie-algorytm-bez-an-if-statement] (http://stackoverflow.com/questions/1937362/can-you- write-any-algorithm-without-an-if-statement) – nawfal

Odpowiedz

1

Uważam, że język musi mieć jakiś sposób dokonywania wyboru, aby być Turing-Complete. To jednak nie musi być twoją klasyczną formułą zwrotu.

Prawdopodobnie najbardziej znanym przykładem są języki wyrażenia regularnego. (a | b *) podejmuje decyzję na podstawie tego, co znajduje się po przeciwnych stronach tego |. Niezupełnie stwierdzenie "jeśli".

1

Istnieją języki logiczne składające się z instrukcji. Wyniki dla zapytania są logiczną oceną, która sprawdza, czy wynik może zostać przyjęty przez grupę reguł, które zostały "zakodowane".

Na przykład patrz Prolog.

6

Poza tym może Prolog, nie znam żadnych konkretnych języków, ale mogę wymyślić kilka sposobów na język bez , jeśli mogą działać instrukcje. W rzeczywistości nie potrzebujesz również konstrukcji pętli. Oczywiście potrzebujesz jakiegoś warunkowego rozgałęzienia i pętli.

Jeśli, na przykład, miał następujące cechy: funkcje, pasujące na argumenty funkcji ML-styl deseniu i optymalizacji ogon rozmowę, można zaprogramować bez jeśli tych lub pętle.

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

stanie czegos potrzebowalem jak

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) 
} 

lub ML-podobnej składni:

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 

Oczywiście, trzeba jeszcze zwykłe operatory porównania, a następnie można wykorzystać proste prawda/Fałszywe dopasowywanie wzorca argumentów zamiast warunków warunkowych. Lub możesz dopasować dowolne wartości. Lub język może obsługiwać wyrażenia strażnika, które są w zasadzie instrukcjami, które określają, czy przeciążenie funkcji jest ważne, czy nie.

Powyższy przykład jest oczywiście wymyślony, a kod bez elementów ifs/loop jest o wiele brzydszy i trudniejszy do zrozumienia niż oryginał, ale pokazuje, jak możesz to zrobić. Więcej lub inne funkcje językowe mogą umożliwić pisanie czystych programów bez pętli if/loop.

Innym sposobem byłoby coś takiego, jeśli jest prawdziwa i fałszywa == 1 == 0.

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

Oznacza to, że przechowywanie true i false oddział w listy lub krotki lub cokolwiek, które mogą mieć być indeksowane przez true i false, a następnie użyć wyniku warunku jako indeksu, wyszukać gałąź i wywołać funkcję. Jeśli twój język obsługuje makra, może być możliwe przetłumaczenie tradycyjnych warunkowych na ten format.

+1

Ta implementacja tablicy dała mi spokój. –

4

Smalltalk, który jest uważany za "prawdziwie" zorientowany obiektowo, nie ma instrukcji "if", i nie ma instrukcji "dla" ani "while". Są inne przykłady (takie jak Haskell), ale jest to dobre. Źródło: Without ifs

+2

Smalltalk ma jednak zdefiniować 'ifTrue:' i 'ifFalse:', a także 'whileTrue:' i 'whileFalse:' – jer

3

programowania C++ szablon nie ma 'if' skonstruować ale Turing-complete poprzez szablon specjalizacji:

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 

z Wikipedia's article on template metaprogramming

+3

wow ............ – JoelFan