相关疑难解决方法(0)

是否存在重载&&和||的原因 不要短路?

运算符的短路行为&&,并||是程序员的好工具.

但为什么他们在超载时会失去这种行为?我理解运算符只是函数的语法糖,但操作符bool有这种行为,为什么它应该限制在这种类型?这背后有任何技术推理吗?

c++ operator-overloading short-circuiting logical-operators c++11

136
推荐指数
8
解决办法
1万
查看次数

在Scheme中使用AND和apply函数

以下为什么不工作?

(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的情况?

scheme

13
推荐指数
3
解决办法
8468
查看次数

SICP:可以或者在lisp中定义为没有gensym的语法转换?

我试图解决计算机编程结构和解释问题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.

lisp macros scheme sicp

6
推荐指数
1
解决办法
693
查看次数

如何在Racket中传递`和`作为函数?

对于以下代码:

(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)

我在这里有两个问题:

  1. and不是一个功能.那这是什么?这是一个宏吗?

  2. 我使用的解决方案lambda似乎很难看.有没有更好的方法来解决这个问题?

谢谢.

lisp macros scheme function racket

5
推荐指数
1
解决办法
405
查看次数

方案中的"cond","and"和"or"

我在读The Little Schemer.由于我的英语不好,我对这一段感到困惑:

(cond ...)也有不考虑其所有论点的财产.然而,由于这个属性,(和......)和(或......)都不能被定义为(cond ...)方面的函数,尽管两者(和......)和(或......) )可以表示为(cond ...) - 表达式的缩写:

(and a b) = (cond (a b) (else #f) 
    and 
(or a b) = (cond (a #t) (else (b))
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,它说(和......)和(或......)可以用(cond ...)表达式替换,但不能定义为包含(cond ...)的函数.为什么会这样?它与变量参数有什么关系吗?谢谢.

ps我做了一些搜索,但只发现(cond ...)在其中一个条件评估为#f时忽略表达式.

scheme

2
推荐指数
1
解决办法
2万
查看次数