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

命名为“有序”,
                (x y)

它需要两个参数,在其主体中称为“x”和“y”,然后接收参数(即用两个值调用,例如(ordered 49 28)
   (if (< x y)

它会比较它们,如果第一个比第二个小,它会产生
       (list x y)

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

它将首先生成包含第二个值的列表,然后生成第一个参数值(即'(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)

关于lisp - Common Lisp-对符号计算的温和介绍:练习4.4,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37503952/

10-11 22:35