язык без если?

Коллега сказал, что слышал о языке, в котором нет понятия «если». Это возможно? Если да, то какой это язык?


person JoelFan    schedule 13.01.2011    source источник
comment
Что вы имеете в виду под ifs? В языке может не быть явного оператора if, но каждый язык должен иметь некоторый способ перехода от одной части кода к двум другим частям кода, иначе каждый ввод в программу всегда будет давать одно и то же. вывод.   -  person BlueRaja - Danny Pflughoeft    schedule 20.10.2011
comment
Дал ли мой ответ то, что вы искали? Если да, отметьте это как ответ на ваш вопрос   -  person Coops    schedule 06.06.2012
comment
Также см. оператор if   -  person nawfal    schedule 04.01.2014


Ответы (5)


Помимо, возможно, Пролога, я не знаю каких-либо конкретных языков, но я могу придумать несколько способов, которыми может работать язык без операторов 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

Конечно, вам по-прежнему нужны обычные операторы сравнения, и тогда вы можете использовать простое сопоставление шаблонов аргументов функции true/false вместо условных выражений. Или вы можете сопоставить произвольные значения. Или язык может поддерживать защитные выражения, которые в основном представляют собой операторы if, которые определяют, допустима ли перегрузка функции или нет.

Приведенный выше пример явно надуманный, а код без ifs/циклов намного уродливее и сложнее для понимания, чем оригинал, но он демонстрирует, как можно обойтись. Дополнительные или другие языковые функции могут позволить писать чистые программы без циклов if/.

Другой способ будет примерно таким, если true == 1 и false == 0.

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

То есть сохраните истинную и ложную ветвь в списке или кортеже или что-то еще, что у вас есть, что может быть проиндексировано истинным и ложным, а затем используйте результат условия в качестве индекса, найдите ветвь и вызовите функцию. Если ваш язык поддерживает макросы, можно перевести традиционные условные операторы в этот формат.

person Community    schedule 20.02.2011

Smalltalk, который считается «по-настоящему» объектно-ориентированным языком, не имеет оператора «if», оператора «for» и оператора «пока». Есть и другие примеры (например, Haskell), но этот хороший. Источник: Без ifs

person Coops    schedule 02.08.2011
comment
Однако Smalltalk определяет ifTrue: и ifFalse:, а также whileTrue: и whileFalse:. - person jer; 28.11.2012

Шаблонное программирование 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

из статьи Википедии о метапрограммировании шаблонов

person kevin cline    schedule 19.10.2011

Я считаю, что язык должен иметь некоторые средства для выбора, чтобы быть Turing-Complete. Однако это означает, что это не обязательно должна быть ваша классическая форма оператора if.

Вероятно, наиболее знакомым примером будут языки регулярных выражений. (a | b*) принимает решение, основываясь на том, что находится по разные стороны от этого |. Не совсем утверждение «если».

person T.E.D.    schedule 13.01.2011

Существуют логические языки, состоящие из операторов. Результаты запроса представляют собой логическую оценку, которая проверяет, МОЖЕТ ли результат быть принят группой правил, которые были «закодированы».

Посмотрите, например, на Prolog.

person Yochai Timmer    schedule 14.01.2011