【发布时间】:2016-09-27 00:02:43
【问题描述】:
我正在使用 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)
在本书的解决方案中,我发现了相同的函数定义。 有什么问题?
【问题讨论】:
-
欢迎来到 Stack Overflow!您看到的结果对我来说很有意义 - 能否请您附上您尝试完成的练习?
-
我希望您得到确切的答案。这就是
ordered应该做的,不是吗? -
练习是使用 if 与一个比较子句和两个结果子句,一个用于比较 true,一个用于比较 nil (false)。答案 1 可以,因为 28 小于 49。答案 2 不是因为 49 不小于 28,这会产生 nil。结果第 2 条应该起作用并产生 (49 28) 永远不会发生的事情。
-
现在我在 REPL 中检查了这个表达式,并用 (print ') 替换了 (list x y) 和 (list y x)。现在我得到了预期的结果。在我看来,好像 if 特殊函数中的列表表达式只用 (list x y) 计算了一次,然后在两个结果子句中使用,尽管 x y 的值。非常感谢 if 特殊功能的这种行为的详细信息。还是我做了错误的假设?
-
调用
(ordered 49 28)时,x绑定49,y绑定28。由于(< x y)为false,所以函数的结果是第三个生成的列表if的参数(else 子句)。该子句构建一个列表,其中第一个元素是y, 28,第二个元素是x, 49。这就是返回值是(28 49)的原因。有序函数接受两个元素并对它们进行排序。
标签: lisp common-lisp clisp