язык без, если это? - PullRequest
       43

язык без, если это?

8 голосов
/ 13 января 2011

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

Ответы [ 5 ]

6 голосов
/ 20 февраля 2011

Помимо, возможно, Пролога, я не знаю каких-либо конкретных языков, но я могу придумать несколько способов использования языка без , если могут работать операторы .На самом деле, вам также не нужны циклические конструкции.Очевидно, вам нужен какой-то способ условных переходов и циклов.

Если, например, у вас есть следующие возможности: функции , сопоставление с образцом в стиле 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 / циклов намного сложнее и сложнеепонять, чем оригинал, но это демонстрирует, как вы можете сделать.Дополнительные или другие языковые возможности позволяют писать чистые программы без циклов if /.

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

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

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

5 голосов
/ 02 августа 2011

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

3 голосов
/ 20 октября 2011

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

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

1 голос
/ 14 января 2011

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

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

1 голос
/ 13 января 2011

Я считаю, что у языка должны быть какие-то средства выбора, чтобы быть Тьюринг-Завершенным . Тем не менее, это означает, что вы не должны быть вашей классической формой if-Statement.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...