找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 744|回复: 7

[LISP程序]:请看这个程序

[复制链接]
发表于 2003-6-10 14:39:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
(define members
(lambda (item l)
  (cond ((null? l) nil)
  ((equal? item(car l) t)
  (t (members item (cdr l))))))
程序中“lambda"是什么作用?(这是一LISP,非AutoLISP程序)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2003-6-10 14:54:20 | 显示全部楼层

Re: [LISP程序]:请看这个程序

最初由 redapple 发布
[B](define members
(lambda (item l)
  (cond ((null? l) nil)
  ((equal? item(car l) t)
  (t (members item (cdr l))))))
程序中“lambda"是什么作用?(这是一LISP,非AutoLISP程序) [/B]


你就理解为lambda 是一个“哑函数”,对他后面的参数表里面的每个元素作为 lambda 函数的参数进行求值,结果是参数表每个元素求值后的结果组成的表。

在你不想另定义函数的时候处理。这对于函数不需要大量引用的时候,是方便的。

(mapcar '(lambda (x) ...) abc) 相当于:

  1. [font=courier]
  2. (defun ex(x)
  3.     ....
  4. )

  5. (foreach n abc
  6.     (setq ll (cons (ex n) ll))
  7. )
  8. (reverse ll)

  9. [/font]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-6-10 15:09:10 | 显示全部楼层
如果去掉LAMBDA对程序有没有影响?能不能正常运行?还是不大明白为什么要用它?谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2003-6-10 15:21:26 | 显示全部楼层
最初由 redapple 发布
[B]如果去掉LAMBDA对程序有没有影响?能不能正常运行?还是不大明白为什么要用它?谢谢! [/B]


见上面的补充代码,有时候你需要用一个自己定义的函数,而不希望把他单独定义的时候,因为单独定义函数是为了多个地方使用,而函数的副作用是每次调用函数的时候,都要保存现场,函数参数入栈等操作,为了函数能返回到主程序。这样增加了负担,使用函数虽然代码短,清晰,但是效率不高。而使用lambda 不另外定义函数,在运行的时候把机器码直接在主程序中运行,速度,效率更高。如果你需要组织代码成函数的形式,但是不希望用函数的方法调用它的时候(你组织的类函数的代码其他地方不需要调用,仅仅你这个程序使用),用lambda 更好。

我是这样理解的。

lambda 往往和 mapcar 配合使用,发挥LISP强大的表处理能力。

比如,你现在需要把表的每个元素乘以10,例如:

(setq a '(2 4 5 7))
(setq b (mapcar '(lambda(x)(* x 10)) a))

b的值就是:'(20 40 50 70)

这是一个简单的应用,你完全可以在lambda里面定义更复杂的函数,完成需要的功能。

上面的代码,如果用普通的循环写:
(setq a '(2 4 5 7))
(foreach n a
    (setq b (cons (* 10 n) b)
)
(reverse b)

这个里面,循环里面额外多出赋值的运算,在表数据非常大的时候,会浪费很多时间。

另外,mapcar 函数设计上也一定比 foreach ,repeat while 等更高效。

mapcar 是一个非常强大的表处理函数,mapcar 灵活使用了,才说明LISP掌握了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-6-10 15:28:03 | 显示全部楼层
再次谢谢你,我还想问您,在AUTOLISP环境下可否运行LISP程序?你是否作过有关推理的程序?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2003-6-10 15:40:00 | 显示全部楼层
最初由 redapple 发布
[B]再次谢谢你,我还想问您,在AUTOLISP环境下可否运行LISP程序?你是否作过有关推理的程序? [/B]


AUTOLISP 是 LISP 的一个子集,并且针对ACAD环境增加的独特的一些函数,比如 command 可以运行ACAD的命令

因此,LISP不一定能在AUTOLISP环境下使用,因为AUTOLISP并没有实现LISP的所有语法。

但是可以参考LISP,稍加改动都可以在AUTOLISP下使用。因为他们都是表处理语言。AUTOLISP语言定义的语法函数,ADESK认为在AUTOCAD环境下足够了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-6-10 15:49:28 | 显示全部楼层
我学AUTOLISP时间不长,不知此语言的前景如何?对于今后的工作帮助大吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-6-10 19:30:12 | 显示全部楼层
最初由 redapple 发布
[B]我学AUTOLISP时间不长,不知此语言的前景如何?对于今后的工作帮助大吗? [/B]


只要你用AUTOCAD,那么AUTOLISP是你最好的选择.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-26 14:29 , Processed in 0.241559 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表