复合布尔测试的Clojure(或Lisp)等价物 在C++中,我会写这样的东西: if (a == something && b == anotherthing) { foo(); } (if (= a something) (if (= b anotherthing) (foo)))
我认为Clojure的等价物是这样的,对吗复合布尔测试的Clojure(或Lisp)等价物 在C++中,我会写这样的东西: if (a == something && b == anotherthing) { foo(); } (if (= a something) (if (= b anotherthing) (foo))),lisp,clojure,boolean,Lisp,Clojure,Boolean,我认为Clojure的等价物是这样的,对吗 if (a == something && b == anotherthing) { foo(); } (if (= a something) (if (= b anotherthing) (foo))) 或者有没有其他方法来执行我错过的逻辑“和”?正如我所说,后一种形式似乎工作正常——我只是想知道是否有更简单的方法来执行逻辑and。在Clojure Google组中搜索“boolean”、“logic
if (a == something && b == anotherthing)
{
foo();
}
(if (= a something)
(if (= b anotherthing)
(foo)))
或者有没有其他方法来执行我错过的逻辑“和”?正如我所说,后一种形式似乎工作正常——我只是想知道是否有更简单的方法来执行逻辑and。在Clojure Google组中搜索“boolean”、“logical”和“And”,结果太多,没有多大用处 在公共Lisp和Scheme中
(and (= a something) (= b another) (foo))
在Common Lisp中,以下也是一种常见的习惯用法:
(when (and (= a something) (= b another))
(foo))
使用(和…(foo))
将此与Doug Currie的答案进行比较。语义是相同的,但取决于(foo)
的返回类型,大多数常见的Lisp程序员会选择其中一种:
- 如果
返回布尔值,请使用(foo)
(和…(foo))
- 如果
返回任意结果,请使用(foo)
(when(and…(foo))
证明这一规则的一个例外是,程序员知道这两种习惯用法,但故意编写
(和…(foo))
。:-) 在Clojure中,我通常会使用以下内容:
(if
(and (= a something) (= b anotherthing))
(foo))
显然可以更简洁(例如道格的答案),但我认为这种方法对于人们来说更自然——尤其是如果代码的未来读者有C++或java背景的话!p> 真的很酷
(和x y)
是一个宏,您可以在clojure.org上查看,它扩展为(如果x y为false)
,相当于:
if (x) {
if (y) {
...
}
} else {
false
}
(或xy)
类似但相反。啊,短路很好,不是吗?谢谢道格。我不知道为什么我从来没有想到在Clojure网站上检查“和”。现在看起来很明显。你也可以在clojure中进行检查,例如(doc和)
。请对Lisp代码使用标准缩进,不要在它们自己的行上加上右括号。我可以编辑吗?@Harleqin请随意修改。我正在学习clojure,我想知道已建立的代码格式习惯用法。好的。请注意,if语句的子部分是对齐的。这是通常的方式。对于某些构造(主要是当您有一个“主体”时),只需将缩进增加两个空格。我不知道Clojure是否有一个特定的风格指南,但是你可以试着从Common Lisp中推断出来请看“格式化Lisp代码”部分(接近末尾)。一个好的编辑器将帮助你格式化;事实上,当自动格式化不能满足您的期望时,您可以看到您犯了一些错误。@Harlequin--感谢您修复代码,并感谢指向格式化文档的指针。