找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: ll_j

[研讨] 【趣味】大家看看这段代码的意思

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-8-19 22:26:57 | 显示全部楼层
wowan1314 发表于 2013-8-19 22:14
他连lambda都没加。 所以费解了 。

是不是说以后都不需要加lambda了。 都按楼主一样写成那样。就是猛 ...

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

使用道具 举报

发表于 2013-8-19 22:36:12 | 显示全部楼层
taner 发表于 2013-8-19 21:39
LEEmac的程序里很多这种用法((lambda(x)(以X为变量的函数) 一个代表X的值).

仔细看了LEEMAC的程序,的确很多这样的写法
  1. (defun LM:GetInsideAngle (p1 p2 p3)
  2.   ((lambda (a) (min a (- (+ pi pi) a)))
  3.     (rem (+ pi pi (- (angle p2 p1) (angle p2 p3))) (+ pi pi))
  4.   )
  5. )
  6. (defun LM:GetInsideAngle (p1 p2 p3)
  7.   ('((a) (min a (- (+ pi pi) a)))
  8.     (rem (+ pi pi (- (angle p2 p1) (angle p2 p3))) (+ pi pi))
  9.   )
  10. )

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

使用道具 举报

发表于 2013-8-19 22:56:25 | 显示全部楼层
精简:
(apply '+ (mapcar '+ '(4 5) '(6 7) '(2 6)))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-8-19 22:58:53 | 显示全部楼层
(apply '+ (append '(4 5) '(6 7) '(2 6)))

点评

探讨的是函数定义,不是具体计算  详情 回复 发表于 2013-8-19 23:12
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-8-19 23:12:15 | 显示全部楼层
xyp1964 发表于 2013-8-19 22:58
(apply '+ (append '(4 5) '(6 7) '(2 6)))

探讨的是函数定义,不是具体计算

点评

脱离了实际的函数都是垃圾!  发表于 2013-8-19 23:43
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-8-19 23:41:51 | 显示全部楼层
(apply '+ (mapcar '(lambda (x) (apply '+ x)) lst))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-8-19 23:51:57 | 显示全部楼层
本帖最后由 Free-Lancer 于 2013-8-20 08:24 编辑

跨越边界: Lisp 之美
http://www.ibm.com/developerworks/cn/java/j-cb02067.html

高阶函数
如果模糊了数据和代码之间的区别,Lisp 会更有意思。在本系列的前两篇文章中,介绍了 JavaScript 中的高阶函数Ruby 中的闭包。这两项功能都将函数作为参数进行传递。在 Lisp 中,由于函数和列表没有任何区别,高阶函数也就非常简单。
高阶函数的最常见用法或许是 lambda 表达式,这是闭包的 Lisp 版。lambda 函数是用于将高阶函数传入 Lisp 函数的函数定义。例如,清单 10 中的 lambda 表达式计算了两个整数的和:

清单 10. Lambda 表达式

>(setf total '(lambda (a b) (+ a b)))
(LAMBDA (A B) (+ A B))
>total
(LAMBDA (A B) (+ A B))
>(apply total '(101 102))
203

如果使用过高阶函数或闭包,那么可能更容易理解清单 10 中的代码。第一行代码定义了一个 lambda 表达式并将其和 total 符号绑定到一起。第二行代码仅显示了这个和 total 绑定到一起的 lambda 表达式。最终,最后一个表达式对包含 (101 102) 的列表应用这个 lambda 表达式。
高阶函数提供比面向对象概念更高层次的抽象。可以用它们来更简洁清晰地表达想法。编程的至高境界就是在不牺牲可读性或性能的前提下,用更少的代码提供更强大更灵活的功能。高阶函数能实现所有这些要求。
Lisp 还有两种类型的高阶函数。其中功能最强大的可能是。宏为后面的执行定义 Lisp 对象。可以将宏看作代码模板。请参考清单 11 中的示例:

清单 11. 宏
>(defmacro times_two (x) (* 2 x))
TIMES_TWO
>(setf a 4)4
>(times_two a)
8

这个示例应该分为两个阶段进行阅读。第一次赋值定义了宏 times_two。在第二个阶段(称为宏扩展)中,在对 a 求值之前,将 a 扩展为 (* 2 a)。该模板中这项延迟求值方式使宏的功能非常强大。Lisp 语言本身的许多功能都是基于宏的。

评分

参与人数 2D豆 +5 收起 理由
ll_j + 3 技术引导讨论和指点奖!
/db_自贡黄明儒_ + 2 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-8-20 08:10:55 | 显示全部楼层
有lambda 和defun的好理解,还是第一次看到什么都不要的,难理解,居然还行。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-8-20 08:26:31 | 显示全部楼层
本帖最后由 /db_自贡黄明儒_ 于 2013-8-20 08:48 编辑


你的这段很有意思
(setq total '(lambda (a b) (+ a b))) 等价(setq total ''((a b) (+ a b)))

(apply total '(101 102))

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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-8-20 08:34:19 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2013-8-20 08:26
这段也很有意思
(setq total '(lambda (a b) (+ a b)))
(apply total '(101 102))

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

使用道具 举报

发表于 2013-8-20 08:35:08 | 显示全部楼层
本帖最后由 Free-Lancer 于 2013-8-20 08:38 编辑

照猫画虎
_$ (setq getdxf (lambda (a b) (cdr (assoc a b))))
#<USUBR @1c04e80c -lambda->
_$ (apply 'getdxf (list 10 (entget (car (entsel)))))
(4292.37 1304.45 0.0)
_$


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

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

 楼主| 发表于 2013-8-20 11:47:53 | 显示全部楼层
Free-Lancer 发表于 2013-8-19 22:36
仔细看了LEEMAC的程序,的确很多这样的写法

不懂英文,所以看Lee Mac的程序也很少,我的这段“灵感”主要来源于在明经下载的一本叫《On Lisp》的书,这是关于Common Lisp的书,书中关于函数定义有这样一段话:
“甚至可以不用defun 来定义函数。和大多数Lisp 对象一样,我们也可以通过其文字表达的形式来引用它。就像当我们提到一个整数时,只要使用这个数字本身那样。而表示字符串时,用括在两个双引号之间的一系列字符。如果要表达的是一个函数,我们可以使用一种称为λ表达式(lambda-expression) 的东西。λ表达式是一个由三个部分组成的列表:lambda 符号、参数列表,以及包含零个以上表达式的主体。”
于是我想到,这里lambda符号其实只是一印记,告诉大家这是函数,那么在函数这种默认求值的环境中,没有这个lambda会是怎样?
然后...
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-8-20 11:58:00 | 显示全部楼层
ll_j 发表于 2013-8-20 11:47
不懂英文,所以看Lee Mac的程序也很少,我的这段“灵感”主要来源于在明经下载的一本叫《On Lisp》的书, ...

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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-8-20 12:22:04 | 显示全部楼层
本帖最后由 Lispboy 于 2013-8-20 12:42 编辑
ll_j 发表于 2013-8-20 11:47
不懂英文,所以看Lee Mac的程序也很少,我的这段“灵感”主要来源于在明经下载的一本叫《On Lisp》的书, ...

我觉得现在写程序还是易懂最重要,其他的什么都在其次。现在的硬件速度很快了。

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

使用道具 举报

发表于 2013-8-20 12:37:06 | 显示全部楼层
LEE  MAC的很多程序看到云山雾罩的,忒难懂,其实可以写的易懂些的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-21 18:22 , Processed in 0.190090 second(s), 58 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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