我正在使用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)
在本书的解决方案中,我找到了相同的函数定义。 可能有什么不对?
答案 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)