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)
要足够清楚,他们不需要额外的语法.
mik*_*iku 18
在python中你可以这样做:
color = "green"
if color in ["red", "green", "blue"]:
print 'Yay'
Run Code Online (Sandbox Code Playgroud)
它被称为in
运算符,用于测试集合成员资格.
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中,它们是可选的.
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)
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)
到目前为止,没有人提到过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)
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应该在某种程度上模仿英语.
你会喜欢Perl 6,因为它有:
(1 <= $someNumber <= 100) || (1000 <= $someNumber <= 2000))
运营商:
$isPrimaryColor = $someColor ~~ "Red" | "Blue" | "Yellow"
你可以将两者结合起来:
$someNumber ~~ (1..100) | (1000..2000)
Run Code Online (Sandbox Code Playgroud)