在LispWorks中进行编程17:推广程序

  • 0

在LispWorks中进行编程17:推广程序

Category:UI界面编写 Tags : 

推广程序

处理列表中的项目时,  我们了解了如何对列表中的每个元素执行操作:

(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。


Leave a Reply

搜索

分类目录

公 告

本网站学习论坛:

www.zhlisp.com

lisp中文学习源码:

https://github.com/zhlisp/

欢迎大家来到本站,请积极评论发言;

加QQ群学习交流。