Common Lisp - 对符号计算的温和介绍:练习4.4

时间:2016-05-28 21:38:17

标签: lisp common-lisp clisp

我正在使用clisp学习Common Lisp并输入以下代码:

(defun ordered (x y)
   (if (< x y)
       (list x y)
       (list y x)))

(setq l (ordered 28 49))
(print l)
(setq l (ordered 49 28))
(print l)

期待这些答案: (28 49) (49 28)

得到了这些答案: (28 49) (28 49)

在本书的解决方案中,我找到了相同的函数定义。 可能有什么不对?

1 个答案:

答案 0 :(得分:4)

您的代码

(defun

定义一个函数,

        ordered 

命名为“ordered”,

                (x y)

期望在 body 中将两个参数称为“x”和“y”,然后接收参数(即已使用两个值调用,例如(ordered 49 28)

   (if (< x y)

它将比较它们,如果第一个小于第二个,它将产生

       (list x y)

在列表中重新打包相同的两个值(即'(49 28)); 否则,如果第一个值小于第二个,

       (list y x)))

它将生成包含第二个值 first 的列表,然后是第一个参数值(即'(28 49))。

那么,这就是比较 49 28 的情况?

一般来说,读一下这段代码,我们可以说如果它接收较小的号作为第一个参数,它会先产生较小的数字,然后产生较大的数字,在结果列表中;

如果它接收较小的号作为其第二个参数,它将在结果列表中产生较小的数字和较大的数字秒。

回过头来看,我们可以看到这个描述可以进一步简化为一个简单的陈述:它将始终在结果列表中首先产生______数字,并且______秒。

另一种攻击方法是记下该定义创建的函数,

( lambda (x y)  (if   (< x y)    (list x y)    (list y x) ) )

然后象征性地遵循其应用:

(   ( lambda (x y)  (if   (< x y)    (list x y)    (list y x) ) )
    49
    28  )

==

(let  (   (x   49)
          (y   28)
      )
                    (if   (< x y)    (list x y)    (list y x) ) )

==

(let  (   (x   49)
          (y   28)
      )
                    (if   (< 49 28)  (list x y)    (list y x) ) )

==

(let  (   (x   49)
          (y   28)
      )
                    (if   FALSE      (list x y)    (list y x) ) )

==

(let  (   (x   49)
          (y   28)
      )
                                                   (list y x)   )

==

(let  (   (x   49)
          (y   28)
      )
                                                   (list 28  49) )

==

(list  28  49)