Common Lisp - 符号计算的简要介绍:练习 4.4

Common Lisp - Gentle introduction to symbolic computation: Excercise 4.4

我正在使用 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)

在本书的解答中我发现了相同的函数定义。 有什么问题吗?

您的代码

(defun

定义一个函数,

        ordered 

名为 "ordered",

                (x y)

期望两个参数在其 主体 中被称为 "x" 和 "y",因此在收到参数时(即被调用两个值,例如 (ordered 49 28))

   (if (< x y)

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

       (list x y)

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

       (list y x)))

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

所以,这里是比较 4928 的情况?


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

如果它接收到 smaller 数字作为其 second 参数,它将首先产生较小的数字,然后产生较大的数字, 在结果列表中。

回头读一遍,我们可以看到这个描述可以进一步简化为一个简单的语句:在结果列表中,它总是首先生成 ______ 个数字,然后生成 ______ 个数字。


解决这个问题的另一种方法是写下该定义创建的函数,

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