2011-01-13 13 views
7

Un collega ha detto di aver sentito parlare di un linguaggio che non aveva il concetto di "se". È possibile? Se sì, che lingua è?lingua senza se?

+0

Che cosa si intende per 'ifs'? Una lingua potrebbe non avere un operatore 'if' esplicito, ma ogni lingua deve avere * un * modo * di diramazione da un pezzo di codice ad altri due pezzi di codice, altrimenti ogni input di un programma darebbe sempre lo stesso risultato. –

+0

La mia risposta ha fornito ciò che stavi cercando? In tal caso, contrassegnarlo come risposta alla domanda – Coops

+0

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

risposta

1

Credo che un linguaggio debba avere alcuni metodi per selezionare, per essere Turing-Complete. Tuttavia, questo significa che non dovrebbe essere la tua forma classica di dichiarazione dei fatti.

Probabilmente l'esempio più familiare sarebbero i linguaggi di espressioni regolari. (a | b *) prende una decisione in base a ciò che si trova sui lati opposti di quello |. Non è esattamente una dichiarazione "se".

1

Esistono linguaggi logici composti da istruzioni. Il risultato di una query è una valutazione logica che verifica se il risultato può essere assunto dal gruppo di regole "codificate".

Vedere ad esempio Prolog.

6

Oltre a Prolog, non conosco alcuna lingua specifica, ma posso pensare a un paio di modi in una lingua senza se le istruzioni possono funzionare. In effetti, non hai nemmeno bisogno di costrutti di loop. Ovviamente hai bisogno di un qualche modo di rami condizionali e di cicli.

Se, ad esempio, si aveva le seguenti caratteristiche: funzioni, stile ML pattern matching su argomenti di funzione e ottimizzazione coda chiamata, si potrebbe programmare senza se di o loop.

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

sarebbe diventato soemthing come

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

o con la sintassi ML-like:

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 

Naturalmente, è ancora necessario i soliti operatori di confronto e quindi è possibile utilizzare semplici vero/corrispondenza del modello dell'argomento funzione falsa invece dei condizionali. Oppure potresti abbinare su valori arbitrari. O il linguaggio potrebbe supportare espressioni di guardia, che sono fondamentalmente le istruzioni che determinano se un sovraccarico di funzione è valido o meno.

L'esempio sopra è ovviamente ideato e il codice senza ifs/loops è molto più brutto e difficile da capire dell'originale, ma dimostra come si può fare. Funzioni linguistiche più o diverse possono rendere possibile scrivere programmi puliti senza if/loops.

Un altro modo sarebbe qualcosa di simile, se è vero == 1 e falso == 0.

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

Cioè, memorizzare il ramo vero e il falso in una lista o tupla o quello che hanno che possono essere indicizzato da vero e falso e quindi utilizzare il risultato della condizione come indice, cercare il ramo e chiamare la funzione. Se la tua lingua supporta le macro, potrebbe essere possibile tradurre i condizionali tradizionali in questo formato.

+1

Questa implementazione dell'array mi ha fatto impazzire. –

4

Smalltalk, che è considerato come un "vero" linguaggio orientato agli oggetti, non ha istruzione "if" e non ha istruzione "for", nessuna istruzione "while". Ci sono altri esempi (come Haskell) ma questo è buono. Fonte: Without ifs

+2

Smalltalk, tuttavia, definisce "ifTrue:" e "ifFalse:", nonché "whileTrue:" e "whileFalse:" – jer

3

C++ di programmazione modello non ha un 'se' costruire, ma è Turing-complete tramite modello di specializzazione:

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 

da Wikipedia's article on template metaprogramming

+3

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

Problemi correlati