Почему большинство языков программирования имеют только операторы сравнения двоичного равенства? - PullRequest
29 голосов
/ 08 июля 2010

В естественных языках мы бы сказали, что «какой-то цвет является основным цветом, если цвет красный, синий или желтый».

На каждом языке программирования, который я видел, это выглядит примерно так:

isPrimaryColor = someColor == "Red" or someColor == "Blue" or someColor == "Yellow"

Почему нет синтаксиса, который более точно соответствует английскому предложению.В конце концов, вы бы не сказали, что «какой-то цвет является основным цветом, если этот цвет красный или синий или желтый».

Я понимаю, просто isPrimaryColor = someColor == ("Red" or "Blue" or "Yellow"), потому что вместо красногоСиние и желтые они могут быть логическим выражением, в этом случае применяется булева логика, но как насчет чего-то вроде:

isPrimaryColor = someColor ( == "Red" or == "Blue" or == "Yellow")

В качестве дополнительного бонуса этот синтаксис обеспечит большую гибкость, скажем, вы хотите увидеть, если числоот 1 до 100 или от 1000 до 2000, вы можете сказать:

someNumber ((>= 1 and <=100) or (>=1000 and <=2000))

Редактировать:

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

Одна проблема, которая возникла, состоит в том, что, если сравниваемое значение является результатом дорогостоящего вычисления, временная переменная должна быть (ну, должна быть) создана.Другая проблема заключается в том, что могут быть проверены различные оценки, такие как «результат некоторых дорогостоящих вычислений должен быть простым и между 200 и 300»

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

MeetsRequirements(GetCalculatedValue(), f(x):x > 200, f(x):x < 300, IsPrime)

Ответы [ 24 ]

0 голосов
/ 08 июля 2010

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

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

Основная проблема с приближением синтаксиса к естественному языку состоит в том, что последний не просто неоднозначный, он ужасно неоднозначный. Даже при минимальной неопределенности нам все-таки удается вносить ошибки в наши приложения. Можете ли вы представить, на что это было бы похоже, если бы вы программировали на естественном английском языке?!

0 голосов
/ 09 июля 2010

Две возможности

Java

boolean isPrimary = Arrays.asList("red", "blue", "yellow").contains(someColor);

Python

a = 1500
if  1 < a < 10 or  1000 < a < 2000:
     print "In range"
0 голосов
/ 08 июля 2010

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

0 голосов
/ 09 июля 2010

Просто добавить к языковым примерам

Схема

(define (isPrimaryColor color)
  (cond ((member color '(red blue yellow)) #t)
        (else #f)))

(define (someNumberTest x)
  (cond ((or (and (>= x 1) (<= x 100)) (and (>= x 10000 (<= x 2000))) #t)
        (else #f)))
...