找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 7749|回复: 34

[他山之石] Lisp的七个公理-转自百度百科

[复制链接]

已领礼包: 6530个

财富等级: 富甲天下

发表于 2013-5-18 14:03:22 | 显示全部楼层 |阅读模式

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

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

×
各位好!
    几年不搞ALisp了,最近又看了看,发现已经都忘差不多了,查查资料,再仔细回忆,还多少有些发现,有些甚至是在自己“顶峰”时期也没有搞明白的。
    最早学习ALisp,是弄一本书(for R11),没有看完就开始“写”程序,说实在的,也看不懂,只知道照葫芦画瓢,还好,当时有一个志同道合的同事一起,也拼凑了几个程序,不过,似乎每一次想完善那些程序都几乎要重写。
    现在没精力写了,只能看了,除此之外,也只剩“好为人师”了,不过现在从实用方面,连“为人师”的资本也没有了,所以只能是把近来“反思”的东西“卖弄”一下,希望能对新手有点用途。
    下面大段是摘自百度百科的Lisp解释,红色部分是本人的理解。


概述    LISP语言(全名LISt Processor,即表处理语言),由约翰·麦卡锡在1960年左右创造的一种基于λ演算的函数式编程语言。
    LISP有很多种方言,各个实现中的语言不完全一样。
    LISP拥有理论上最高的运算能力。
    LISP在cad绘图软件上的应用非常广泛,普通用户均可以用lisp编写出各种定制的绘图命令。

    对于绝大多数新手而言,A/VLisp的表处理语言都是一种陌生的结构形式,似乎根本无法理解,实际上,即使使用了很长时间,也未必能真的理解,不过,如果能理解了,即使哪怕并不全面,也会感觉到她独特的魅力。
    这里所说的Lisp并不就是A/VLisp,A/Vlisp只是其中的方言之一,与Lisp有共性,也有特殊性,下面的内容可以都是共性。

基本介绍

    Lisp的表达式是一个原子(atom)或表(list),原子(atom)是一个字母序列,如abc;表是由零个或多个表达式组成的序列,表达式之间用空格分隔开,放入一对括号中,如:
    ()
    (abc xyz)
    (a b (c) d)
    最后一个表是由四个元素构成的,其中第三个元素本身也是一个表。
    正如算术表达式1+1有值2一样,Lisp中的表达式也有值,如果表达式e得出值v,我们说e返回v。如果一个表达式是一个表,那么我们把表中的第一个元素叫做操作符,其余的元素叫做自变量。
    ()表示一个空表,ALisp更多的时候表示为nil,是的,这是等价的,至少我是这样理解的,请看:
    > (eq () nil) -> T
    > (listp nil) -> T

Lisp的7个公理(基本操作符):

    学习并使用了那么多年的ALisp,还不知道Lisp有“公理”,是该好好看看,因为这是基础中的基础,说是“公理”,或许用“基本假定”更容易理解。

公理一:


    (quote x)返回x,我们简记为'x


公理二:


    (atom x)当x是一个原子或者空表时返回原子t,否则返回空表()。在Lisp中我们习惯用原子t表示真,而用空表()表示假。
    > (atom 'a) ->  t
    > (atom '(a b c)) -> ()
    > (atom '()) -> t
    现在我们有了第一个需要求出自变量值的操作符,让我们来看看quote操作符的作用——通过引用(quote)一个表,我们避免它被求值。一个未被引用的表达式作为自变量,atom将其视为代码,例如:
    > (atom (atom 'a)) -> t
    反之一个被引用的表仅仅被视为表
    > (atom '(atom 'a)) -> ()
    引用看上去有些奇怪,因为你很难在其它语言中找到类似的概念,但正是这一特征构成了Lisp最为与众不同的特点——代码和数据使用相同的结构来表示,而我们用quote来区分它们。
    用ALisp的解释,qoute“将返回(后面参数)未判别前的状态”,很是拗口,同样难以理解。
    说起来也不难理解,qoute其实就是“不求值”、“不计算”,保持你看到的样子。所以:
    > (= (+ 1 1) 2) -> T
    > (= '(+ 1 1) 2) -> nil


公理三:


    (eq x y)当x和y的值相同或者同为空表时返回t,否则返回空表()
    > (eq 'a 'a) -> t
    > (eq 'a 'b) -> ()
    > (eq '() '()) -> t


公理四:


    (car x)要求x是一个表,它返回x中的第一个元素,例如:
    > (car '(a b)) -> a


公理五:


    (cdr x)同样要求x是一个表,它返回x中除第一个元素之外的所有元素组成的表,例如:
    > (cdr '(a b c)) -> (b c)
    在百度百科的AutoLisp词条中,有这样一句话:“AutoLISP语言的主要控制结构是采用递归方式。递归方式的使用,使得程序设计简单易懂”,这里的“递归”一词似乎让人理解,因为“递归”的结构似乎是那么的高深,不过如果仔细分析上面两条公理,或许可以看出,从某种意义上,car、cdr的结构本身就是递归,或者说是广义的递归。


公理六:


    (cons x y)要求y是一个表,它返回一个表,这个表的第一个元素是x,其后是y中的所有元素,例如:
    > (cons 'a '(b c)) -> (a b c)
    > (cons 'a (cons 'b (cons 'c ()))) -> (a b c)
    本人尚不能完全理解这一条的真正含义,但感觉得到,对于表处理语言而言,把一个元素加入一个表,应该比诸多元素“堆积”(lisp)成一个表更有意义。


公理七:


    条件分支,在Lisp中,它是由cond操作符完成的,cond是七个公理中最后一个也是形式最复杂的一个(欧几里德的最后一个公理也如是):
    (cond (p1 e1) (p2 e2)...(pn en))
    p1到pn为条件,e1到en为结果,cond操作符依次对p1到pn求值,直到找到第一个值为原子t(还记得吗?)的p,此时把对应的e作为整个表达式的值返回,例如:
    > (cond ((eq 'a 'b) 'first) ((atom 'a) 'second)) -> second
    没有分支的程序大概也解决不了什么大问题吧。

    以上内容虽然不是仅仅针对A/VLisp的,但同样也是A/VLisp的核心所在,虽说是它山之石,但更像是“祖上遗产”,以前清楚的和不清楚的都可以一看。
    以上个人的理解,难免有不对或不完全的地方,希望大家指正,在此先谢过。



评分

参与人数 7威望 +1 D豆 +33 贡献 +2 收起 理由
yularna + 5 伟大的公理,一统LISP!占位,留名。呵呵。
Highflybird + 1 + 5 + 1 很给力!经验;技术要点;资料分享奖!
Lispboy + 5 好主题奖!
wowan1314 + 5 热心帮忙奖!
xshrimp + 4 + 1 技术引导讨论和指点奖!
XDSoft + 4 很给力!经验;技术要点;资料分享奖!
炫翔 + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

已领礼包: 1742个

财富等级: 堆金积玉

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

使用道具 举报

已领礼包: 2688个

财富等级: 家财万贯

发表于 2013-5-18 14:06:40 | 显示全部楼层
虽然比较基础,但还是要顶下,基础是最重要的!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-18 15:28:46 | 显示全部楼层
本帖最后由 wowan1314 于 2013-5-18 15:39 编辑

感谢,有的学总是好的。 基础永远是最重要的。
头两公理都没听过,好像没用过。
第六个公理,(cons x y)要求y是一个表。。最近不知道哪里看的帖子,Y是nil也可以. NIL 也是个表
例如:
命令: (SETQ A 1)
1

命令: (CONS A (CONS A NIL))
(1 1)

命令: (IF NIL NIL (PRINC "123"))
123"123"

命令: (IF NIL () (PRINC "123"))
123"123"

点评

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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-5-18 15:33:44 | 显示全部楼层
wowan1314 发表于 2013-5-18 15:28
感谢,有的学总是好的。 基础永远是最重要的。
头两公理都没听过,好像没用过。
第六个公理,(cons x y) ...

从数据结构而言,NIL本身就是个表,元素是NULL。

点评

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

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2013-5-18 15:34:30 | 显示全部楼层
元老的“反刍”味道很重,有分量!赞一个。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-5-18 15:38:48 | 显示全部楼层
dwg001 发表于 2013-5-18 15:34
元老的“反刍”味道很重,有分量!赞一个。

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

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

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

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2013-5-18 18:33:01 | 显示全部楼层
本帖最后由 Highflybird 于 2013-5-18 18:38 编辑

如果要理解第6条,首先应该理解LISP是一个链表形式的数据结构。
就是说cons就是好像一环套一环一样,把数据链接起来。
这个数据链的的第一个元素是节点的本身数据,第二个(CDR)就是表的剩余数据。CAR是头,CDR是衔住它,你可以这样继续进行下去,这颇有递归的意味。好比你扯住了一个头,就能把其他的全都拔出来。
就这样,你一直弄到CDR是nil为止。


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

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

 楼主| 发表于 2013-5-18 19:09:45 | 显示全部楼层
Highflybird 发表于 2013-5-18 18:33
如果要理解第6条,首先应该理解LISP是一个链表形式的数据结构。
就是说cons就是好像一环套一环一样,把数 ...

谢谢指点。
一直觉得这就是car、cdr倒过来的意思,但是就是说不清,听您这样说,有豁然开囊的感觉。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2013-5-18 20:32:55 | 显示全部楼层
ll_j 发表于 2013-5-18 19:09
谢谢指点。
一直觉得这就是car、cdr倒过来的意思,但是就是说不清,听您这样说,有豁然开囊的感觉。

想必你的LISP语言功底深厚,以上观点仅仅是我个人理解,远不及你之透彻。
欢迎楼主继续深化这个话题。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-18 21:14:59 | 显示全部楼层
大家手笔果真不一样,受教受教
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-5-18 21:22:38 | 显示全部楼层
关于CONS的理解:

CONS是把一个元素(不是表,是一个节点)插入到表头,这在单链表结构中是最快的操作,因为不用遍历表找到插入位置)

把节点的指针指向另外一个表头元素的内存地址。

QQ截图20130518210728.png

QQ截图20130518210914.png

QQ截图20130518210336.png
QQ截图20130518210506.png


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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-5-18 21:27:48 | 显示全部楼层
QQ截图20130518210622.png
上面这个图是在表中间插入一个元素,对应LISP应该是:

(append list1 (cons data list 2))

list1 是插入位置前的表

list2 是插入位置后面的表

过程是先遍历LIST1找到指定位置的NODE节点,先保存NODE节点的NEXT地址a(就是LIST2 第一个元素的内存地址),把该节点的NEXT指针指向 DATA 的内存地址。
然后把DATA的NEXT指针指向上面保存的a地址,就把表链接起来了。

评分

参与人数 1D豆 +5 收起 理由
ll_j + 5 十分感谢!

查看全部评分

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

使用道具 举报

已领礼包: 685个

财富等级: 财运亨通

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 18:07 , Processed in 0.479160 second(s), 71 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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