Lisp 简单的计划练习。第06章真假

Lisp 简单的计划练习。第06章真假,lisp,scheme,Lisp,Scheme,你好,我是新来的,所以请照顾我 中的练习有以下表达: (cond (empty? 3) (square 7) (else 9)) 我的大脑说它应该评估(第7格)并返回。(空?3)进行计算(返回原子-使用其他原子和列表进行了尝试,处理相同) 我很困惑 据我所知: 计划中所有不虚假的东西都是真实的。如果3为真且不为空(#f),为什么cond表达式返回(空?3) 计算cond表达式的第一个参数,如果该参数为真,则返回#t,即根据上下文定义的值或#未定义的值。如果为false,

你好,我是新来的,所以请照顾我

中的练习有以下表达:

(cond (empty? 3)
      (square 7)
      (else 9))
我的大脑说它应该评估(第7格)并返回。(空?3)进行计算(返回原子-使用其他原子和列表进行了尝试,处理相同)

我很困惑

据我所知:

  • 计划中所有不虚假的东西都是真实的。如果3为真且不为空(#f),为什么cond表达式返回(空?3)
  • 计算cond表达式的第一个参数,如果该参数为真,则返回#t,即根据上下文定义的值或#未定义的值。如果为false,它将继续连续计算cond参数,直到这样做(或没有找到合适的返回值),然后退出cond
  • 我不知道的是:

  • (空?3)在其自身的返回上#f。为什么cond在这里终止而不计算(第7格)
  • 为什么在cond内对(空?3)的求值返回原子,而不是t或f
  • 我使用的是带有Slib的SCM以及加载的Simply Scheme(Simply.SCM、functions.SCM、ttt.SCM、match.SCM、database.SCM)提供的附加库


    空房间?simply.scm中的定义在这一点上超出了我的计划。

    cond格式如下:

    (cond (something-to-check-for-truthiness value-if-truthiness-succeed)
            ...other checks in the same format as above  )
    
    现在,如果你把你的代码转换成这种格式,那么。
    empty?
    即只有函数empty(不是它的调用)可以代替
    检查真实性的东西
    ,并且函数始终是真值,因此返回
    3
    的数字,该数字位于
    empty?
    之后,如果真实性成功槽,则该数字适合
    值。因此,根本不需要调用
    empty?
    函数。

    康德并不是这么做的。 cond接受一个或多个参数,每个参数必须是方案表达式列表

    (cond(#t))是有效的cond语句

    它对第一个表达式求值,如果为true,则对该列表中的附加s-epression求值,并返回最后一个求值表达式的值


    (cond(#t 1 2 3 4(如果(数字?0)“是的,精神正常!”“它在皮肤上摩擦乳液”))是一个有效的cond声明

    您仍然可以发布
    空的定义吗?
    ?这些库很难找到。@当然。中的函数定义。我读了你的解释,马上就明白了。经过数周的艰难跋涉,终于进入了第15章,其中包含了一系列可怕的嵌套if表达式。为什么这本书不是这样的呢?如果你把它与其他
    cond
    示例进行比较,你可能已经拥有了它,随着你练习的深入,你的大脑的表达式解析能力会提高,然后世界就会在你脚下:)你可能是对的,哈哈,随着时间的推移,双括号吸引了我。现在天气晴朗,非常感谢你们。顺便说一句,我有3个代表。我能+1吗?怎么做?哈哈,用这个
    ((lambda(测试)(cond(测试1 2 3 4“是的,神智正常!”)确认)(否则(退出)))#f)
    你说得太对了。我认为每个cond参数中有两个表达式的限制。奇怪的行为。有什么有用的地方吗?我的意思是,您的示例中的
    1234
    会被计算,但不会影响cond返回。看起来像是一种浪费,特别是如果它是cpu密集型过程的话。@usernvk是的,在纯函数中,只有一个或两个表达式才有用,但是如果每个中间表达式都产生副作用,比如写入文件、打印屏幕或调用某种集合,那么它是有用的!程序