运算符的短路行为&&,并||是程序员的好工具.
但为什么他们在超载时会失去这种行为?我理解运算符只是函数的语法糖,但操作符bool有这种行为,为什么它应该限制在这种类型?这背后有任何技术推理吗?
c++ operator-overloading short-circuiting logical-operators c++11
以下为什么不工作?
(apply and (list #t #t #f))
Run Code Online (Sandbox Code Playgroud)
虽然以下工作正常.
(apply + (list 1 3 2))
Run Code Online (Sandbox Code Playgroud)
这似乎是R5RS和R6RS的情况?
我试图解决计算机编程结构和解释问题4.4的最后部分; 任务是实现或作为句法转换.只定义了基本的句法形式; 引用,if,begin,cond,define,apply和lambda.
(或ab ... c)等于第一个真值,如果没有值,则为false.
我想要接近它的方法是将例如(或abc)转换为
(if a a (if b b (if c c false)))
Run Code Online (Sandbox Code Playgroud)
这个问题是a,b和c会被评估两次,如果它们中的任何一个有副作用,可能会得到不正确的结果.所以我想要像let这样的东西
(let ((syma a))
(if syma syma (let ((symb b))
(if symb symb (let ((symc c))
(if (symc symc false)) )) )) )
Run Code Online (Sandbox Code Playgroud)
而这又可以通过lambda实现,如练习4.6所示.现在的问题是确定符号syma,symb和symc; 例如,如果表达式b包含对变量syma的引用,那么let将破坏绑定.因此,我们必须让syma是不在b或c中的符号.
现在我们遇到了障碍; 我能看出来这个洞的唯一方式是有符号不能一直在传递给eval任何表情.(这包括可能已被其他语法转换传入的符号).
但是因为我不能直接访问表达式,所以我不确定是否有合理的方法来生成这样的符号; 我认为Common Lisp具有用于此目的的函数gensym(这意味着在metacircular解释器中保持状态,危及任何并发使用).
我错过了什么吗?有没有办法实现或不使用gensym?我知道Scheme有它自己的hygenic宏系统,但我还没有弄清楚它是如何工作的,我不确定它是否有一个gensym underneath.
对于以下代码:
(foldl and #t '(#t #f))
Run Code Online (Sandbox Code Playgroud)
球拍回归:
and: bad syntax in: and
Run Code Online (Sandbox Code Playgroud)
我知道and这不是一个功能.我可以使用以下方法解决这个问题lambda:
(foldl (lambda (a b) (and a b)) #t '(#t #f))
Run Code Online (Sandbox Code Playgroud)
我在这里有两个问题:
and不是一个功能.那这是什么?这是一个宏吗?
我使用的解决方案lambda似乎很难看.有没有更好的方法来解决这个问题?
谢谢.
我在读The Little Schemer.由于我的英语不好,我对这一段感到困惑:
(cond ...)也有不考虑其所有论点的财产.然而,由于这个属性,(和......)和(或......)都不能被定义为(cond ...)方面的函数,尽管两者(和......)和(或......) )可以表示为(cond ...) - 表达式的缩写:
Run Code Online (Sandbox Code Playgroud)(and a b) = (cond (a b) (else #f) and (or a b) = (cond (a #t) (else (b))
如果我理解正确,它说(和......)和(或......)可以用(cond ...)表达式替换,但不能定义为包含(cond ...)的函数.为什么会这样?它与变量参数有什么关系吗?谢谢.
ps我做了一些搜索,但只发现(cond ...)在其中一个条件评估为#f时忽略表达式.