在LispWorks中进行编程17:推广程序
Category:UI界面编写推广程序
在处理列表中的项目时, 我们了解了如何对列表中的每个元素执行操作:
(defun double-list (numbers) (if (null numbers) nil (cons (* 2 (first numbers)) (double-list (rest numbers)))))
假设我们想要概括这一点,这样我们就可以对列表中的每个元素执行任何操作,而不仅仅是加倍。我们希望能够创建一个过程应用列表,以便我们可以编写:
(defun double (n) (* 2 n))(apply-list ‘double ‘(2 3 5 7 11 13 17 19))
加倍数字,或:
(apply-list ‘evenp ‘(2 3 5 7 11 13 17 19))
如果它是偶数,则将每个数字设置为t。
为此,我们可以使用一个新的过程funcall,它使用我们指定的参数调用一个选定的过程:
调用一个过程:funcall
该 过程 funcall(对于函数调用)取一个或多个参数。第一个参数应该评估一个 过程,该过程以其余参数作为参数调用。所以,例如:
CL-USER > (funcall ‘+ 2 3)5
上一节中的总结:
(defun apply-list (function items) (if (null items) nil (progn (funcall function (first items)) (apply-list function (rest items)))))
我们可以用这样的程序打印测试它:
CL-USER > (apply-list ‘print ‘(2 3 4 5 6))23456NIL
应用函数创建新列表:change-list
作为第二个例子,我们可以编写一个在List中的Processing Items中定义的双列表的通用版本,以创建一个名为change-list的通用版本:
(defun change-list (function items) (if (null items) nil (cons (funcall function (first items)) (change-list function (rest items)))))
我们来试试吧:
CL-USER > (change-list ‘double ‘(2 3 5 7 11 13 17 19))(4 6 10 14 22 26 34 38)CL-USER > (change-list ‘evenp ‘(2 3 5 7 11 13 17 19))(T NIL NIL NIL NIL NIL NIL NIL)
在Lisp中,对列表的每个元素执行操作的操作称为映射。事实上,Lisp包含一系列内置的映射程序。但是,与其了解内置程序,我觉得学习如何编写自己的程序更为重要,了解它们使用的一般原则。
演习
1.对一系列数字重复一个过程
写入过程重复进行,基于印刷的在 重复该操作,这就要求在指定范围内的每个号码的过程。该过程应将数字作为参数。例如:
(repeat-for 4 7 ‘print)
应该打印:
4567
2.使用二元运算符组合数字列表
编写一个过程组合,它采用二元运算符和两个或多个数字的列表,并使用运算符组合数字。(您可以假设运算符是关联的。)例如:
(combine ‘+ ‘(1 2 3 4))
应找到1 + 2 + 3 + 4,并给10,和:
(combine ‘* ‘(1 2 3 4))
应该给24。
http://mip.i3geek.com