为什么大多数编程语言只有二进制相等比较运算符?

Dav*_*vy8 29 language-design boolean-operations

在自然语言中,我们会说"如果颜色是红色,蓝色或黄色,某些颜色是主要颜色."

在我看过的每种编程语言中,都转化为:

isPrimaryColor = someColor == "Red" or someColor == "Blue" or someColor == "Yellow"
Run Code Online (Sandbox Code Playgroud)

为什么没有更接近匹配英语句子的语法.毕竟,如果颜色为红色,或者颜色为蓝色,或者颜色为黄色,则不会说"某些颜色是原色."

我只是isPrimaryColor = someColor == ("Red" or "Blue" or "Yellow")因为而不是红色和黄色它们可能是布尔语句,在这种情况下布尔逻辑适用,但是如下所示:

isPrimaryColor = someColor ( == "Red" or == "Blue" or == "Yellow")
Run Code Online (Sandbox Code Playgroud)

作为一个额外的奖励,语法将允许更多的灵活性,说你想看一个数字是1到100或1000和2000,你可以说:

someNumber ((>= 1 and <=100) or (>=1000 and <=2000))
Run Code Online (Sandbox Code Playgroud)

编辑:

非常有趣的答案,并指出我应该学习更多的语言.在阅读完答案之后,我同意,对于严格的相等比较,类似于集合成员资格的东西是表达同一事物的清晰简洁的方式(对于具有简明内联列表或集合和测试成员资格的语言支持的语言)

出现的一个问题是,如果要比较的值是昂贵计算的结果,则需要(好的,应该)创建临时变量.另一个问题是可能需要检查不同的评估,例如"一些昂贵的计算结果应该是素数并且在200到300之间"

更多功能语言也涵盖了这些场景(虽然取决于语言可能不是更简洁),或者实际上任何可以将函数作为参数的语言.例如,前面的例子可能是

MeetsRequirements(GetCalculatedValue(), f(x):x > 200, f(x):x < 300, IsPrime)
Run Code Online (Sandbox Code Playgroud)

mqp*_*mqp 23

我认为大多数人会考虑类似的东西

isPrimaryColor = ["Red", "Blue", "Yellow"].contains(someColor)
Run Code Online (Sandbox Code Playgroud)

要足够清楚,他们不需要额外的语法.

  • 在C#中,如果可以推断它,则不需要类型名称,例如new string [] {"Red","Green","Blue"}可以写成new [] {"Red","Green", "蓝色" }.你也不需要围绕它的括号.看起来很简洁? (6认同)
  • 我不认为创建列表和测试成员资格与使用语言构造一样好,除非编译器能够识别并优化前者的代码.否则我会将用法视为语法aspartame. (5认同)
  • 但肯定你已经声明`string [] primaryColours = new string [] {"Red","Blue","Yellow"};`在你的代码的其他地方,那么它只是`bool isPrimaryColour = primaryColours.Contains( someColour);` (4认同)
  • 好点子.我希望更多语言具有用于创建列表/数组的内联语法.我在看你C#和Java(我想......多年来没有使用过Java).`(new string [] {"Red","Blue","Yellow"}).contains(someColor)`看起来不太好看.另外看看我的编辑,检查不仅仅是数字范围之类的相等(我知道,有些语言也支持这一点,所以我想它仍然是一个没有实际意义的点.) (3认同)
  • 不仅如此,JonoW与{"Red","Green","Blue"}相比.新的[]肯定会增加一些视觉开销.也许我只是被宠坏了. (2认同)

mik*_*iku 18

在python中你可以这样做:

color = "green"

if color in ["red", "green", "blue"]:
    print 'Yay'
Run Code Online (Sandbox Code Playgroud)

它被称为in运算符,用于测试集合成员资格.

  • 你也可以说'1 <= somenumber <300`. (3认同)

Dae*_*yth 13

在perl 6中你可以用交汇点做到这一点:

if $color eq 'Red'|'Blue'|'Green' {
    doit()
}
Run Code Online (Sandbox Code Playgroud)

或者你可以使用智能匹配运算符(~~)来完成它.以下大致相当于python的if value in list:语法,除了~~在其他上下文中做得更多.

if ($color ~~ qw/Red Blue Green/) {
    doit()
}
Run Code Online (Sandbox Code Playgroud)

parens也使它有效perl 5(> = 5.10); 在perl 6中,它们是可选的.

  • perl是来自他的附属物的礼物 (7认同)

Zif*_*fre 12

在Haskell中,很容易定义一个函数来执行此操作:

matches x ps = foldl (||) False $  map (\ p -> p x) ps
Run Code Online (Sandbox Code Playgroud)

此函数获取谓词(类型a -> Bool)的值列表,并True在任何谓词与值匹配时返回.

这允许你这样的事情:

isMammal m = m `matches` [(=="Dog"), (=="Cat"), (=="Human")]
Run Code Online (Sandbox Code Playgroud)

好处是它不必只是相等,你可以使用正确类型的任何东西:

isAnimal a = a `matches` [isMammal, (=="Fish"), (=="Bird")]
Run Code Online (Sandbox Code Playgroud)

  • 或者:`匹配x =任何($ x)`. (8认同)

Mar*_*off 9

红宝石

包含在列表中:

irb(main):023:0> %w{red green blue}.include? "red"
=> true
irb(main):024:0> %w{red green blue}.include? "black"
=> false
Run Code Online (Sandbox Code Playgroud)

数字范围:

irb(main):008:0> def is_valid_num(x)
irb(main):009:1>   case x
irb(main):010:2>     when 1..100, 1000..2000 then true
irb(main):011:2>     else false
irb(main):012:2>   end
irb(main):013:1> end
=> nil
irb(main):014:0> is_valid_num(1)
=> true
irb(main):015:0> is_valid_num(100)
=> true
irb(main):016:0> is_valid_num(101)
=> false
irb(main):017:0> is_valid_num(1050)
=> true
Run Code Online (Sandbox Code Playgroud)


Jef*_*dge 7

到目前为止,没有人提到过SQL.它有你的建议:

SELECT
    employee_id
FROM 
    employee
WHERE
    hire_date BETWEEN '2009-01-01' AND '2010-01-01' -- range of values
    AND employment_type IN ('C', 'S', 'H', 'T')     -- list of values
Run Code Online (Sandbox Code Playgroud)


Nea*_*alB 6

COBOL使用88级别来实现命名值,命名值组和命名值范围.

例如:

01 COLOUR         PIC X(10).
   88 IS-PRIMARY-COLOUR VALUE 'Red', 'Blue', 'Yellow'.
...
MOVE 'Blue' TO COLOUR
IF IS-PRIMARY-COLOUR
   DISPLAY 'This is a primary colour'
END-IF
Run Code Online (Sandbox Code Playgroud)

范围测试包括如下:

01 SOME-NUMBER    PIC S9(4) BINARY.
   88 IS-LESS-THAN-ZERO    VALUE -9999 THRU -1.
   88 IS-ZERO              VALUE ZERO.
   88 IS-GREATER-THAN-ZERO VALUE 1 THRU 9999.
...
MOVE +358 TO SOME-NUMBER
EVALUATE TRUE
    WHEN IS-LESS-THAN-ZERO
         DISPLAY 'Negative Number'
    WHEN IS-ZERO
         DISPLAY 'Zero'
    WHEN IS-GREATER-THAN-ZERO
         DISPLAY 'Positive Number'
    WHEN OTHER
         DISPLAY 'How the heck did this happen!'
END-EVALUATE
Run Code Online (Sandbox Code Playgroud)

我想这一切都发生了,因为COBOL应该在某种程度上模仿英语.

  • 什么是"PIC","S9","01"和"88"?我认为COBOL应该是超级可读的,否则为什么要烦扰多余的措辞呢? (2认同)
  • 我只是要扔掉+1,因为,COBOL.是啊. (2认同)
  • 在那里你必须去,提醒我何时必须在COBOL中编码.现在噩梦将从头开始. (2认同)

dol*_*men 5

你会喜欢Perl 6,因为它有:

  • 链接比较运算符:

    (1 <= $someNumber <= 100) || (1000 <= $someNumber <= 2000))

  • 运营商:

    $isPrimaryColor = $someColor ~~ "Red" | "Blue" | "Yellow"

你可以将两者结合起来:

$someNumber ~~ (1..100) | (1000..2000)
Run Code Online (Sandbox Code Playgroud)