- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 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”,然后在接收到参数时(即用两个值调用,例如(有序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 - 符号计算的简单介绍 : Excercise 4. 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37503952/
我正在使用 clisp 学习 Common Lisp 并输入了以下代码: (defun ordered (x y) (if (< x y) (list x y) (l
我是一名优秀的程序员,十分优秀!