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