2013-07-03 3 views
2

Существует некоторая чрезмерная многословность, которую я должен задействовать при написании определенных булевых выражений, по крайней мере, со всеми языками, которые я использовал, и мне было интересно, существуют ли какие-либо языки, которые позволяют вам писать более кратко?Языки, поддерживающие булевой синтаксический сахар

Так оно идет как это:

Я хочу, чтобы узнать, есть ли у меня Thing, который может быть либо A, B, C или D.

И я хотел бы посмотреть, Thing является A или B.

Логический способ для меня, чтобы выразить это

//1: true if Thing is an A or a B 
Thing == (A || B) 

Но все языки я знаю, ожидать, что она будет написана как

//2: true if Thing is an A or a B 
Thing == A || Thing == B 

Есть ли языки, которые поддерживают 1? Мне это не кажется проблематичным, если Thing не является булевым.

ответ

2

Да. Иконка.

Как простой пример, вот как получить сумму всех чисел меньше 1000, которые делятся на три или пять (первая проблема Project Euler).

procedure main() 
    local result 
    local n 
    result := 0 
    every n := 1 to 999 do 
     if n % (3 | 5) == 0 then 
      result +:= n 
    write (result) 
end 

Примечание n % (3 | 5) == 0. Я немного расплывчатый по точной семантике, но в Icon, концепция булевых языков не похожа на другие языки. Каждое выражение является генератором и может проходить (генерирование значения) или сбой. При использовании в выражении if генератор будет продолжать итерацию до тех пор, пока он не пройдет или не исчерпает себя. В этом случае n % (3 | 5) == 0 представляет собой генератор, который использует другой генератор (3 | 5), чтобы проверить, если n делится на 3 или 5. (Чтобы быть полностью техническими, это даже не синтаксический сахар.)

Аналогично, в Python (который был под влиянием Icon) вы можете использовать оператор in для проверки равенства на несколько элементов. Это немного слабее, чем Icon, хотя (как и в, вы не могли перевести сравнение по модулю выше). В вашем случае вы должны написать Thing in (A, B), что в точности соответствует тому, что вы хотите.

1

Есть другие способы выразить это условие, не пытаясь добавить какое-либо волшебство к условным операторам.

В Ruby, например:

$> thing = "A" 
=> "A" 
$> ["A","B"].include? thing 
=> true 
+0

Это хороший и довольно простой способ сделать это, если немного неинтуитивно. –

+0

Для основных языков, которые не имеют встроенной функции, есть популярные библиотеки, которые добавляют эту функциональность. – Larsenal

1

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

Считаете ли вы использование preprocessor?

Также языки, такие как Lisp, имеют macros, что является частью языка.