精华内容
下载资源
问答
  • AutoLISP语言程序设计,本资源仅用于个人学习,禁止他用,如要他用请联系书内标明的本书作者
  • awesome-lisp语言:一系列Lisp风格的编程语言
  • AutoLISP语言在CAD图纸批量打印中的应用.pdf
  • Lisp程序员的圣经。 每个官方规范,Common Lisp中定义的每个功能都可以在此处找到。
  • cad二次开发之lisp语言

    2016-06-17 21:48:20
    LISP是最早和最重要的符号处理编程语言之一,它于1958年由美国的J. McCarthy提出,并于1960年发表了他的第一篇关于LISP的论文。之后,LISP很快受到人工智能工作者的欢迎,获得广泛应用。LISP是LISt Processing(表...
  • 学习 AutoLISP 是非常容易的,对初学者而言,即使没有学习过任何的程序语言, 都能很快的上手,写出精彩漂亮的 AutoLISP 程序! 语法简单 不用特殊的变量宣告,非常富有弹性,比起其它的程序语言,它的语 法可说是非常简单而...
  • Lisp语言教程

    2015-09-29 19:22:59
    简单的lisp语言教程,简单快速入门可用。
  • LISP语言(马希文).pdf

    2013-04-15 14:31:55
    LISP语言(马希文).pdf
  • 利用VisualLisp语言实现CAD中轴线任意点的中边桩计算.pdf
  • LISP语言入门(CLISP)

    2020-12-30 23:27:48
    曾经翻译整理的一篇LISP语言的入门文章,与大家分享. (请勿转载)----------------------------------------------------------------熟悉人工智能语言LISP程序设计LISP语言的特性:LISP语言是过去所有现存语言中最...

    曾经翻译整理的一篇LISP语言的入门文章,与大家分享. (请勿转载)

    ----------------------------------------------------------------

    熟悉人工智能语言LISP程序设计

    LISP语言的特性:

    LISP语言是过去所有现存语言中最接近函数式语言的一种语言。J.McCarthy在1960年提出的最初的LISP语言完全是函数型的,后来为改善在传统计算机上的执行效率,就在流行的LISP版本中,把非应用式特性加入了语言中。LISP语言具有如下特性:

    LISP程序的通常形式是一串函数定义,其后跟着一串带有参数的函数调用,函数之间的关系只是在调用执行时才体现出来。LISP中没有语句概念,也没有分程序结构或其他语法结构。语言中的一切成分都是以函数的形式给出。

    在纯LISP中只有很少几个原始函数,虽然现有的LISP系统已增加了大量的内部函数,但这些新增加的函数都可以用最初的原始函数来表示。

    在LISP中,程序和数据在形式上是等价的。LISP的唯一数据结构是S-表达式(表),而程序本身也是用S-表达式写的,因此可以把程序当作数据来处理,也可以把数据当作程序来执行。

    递归是LISP的基础,是语言的主要控制结构,它不像大多数程序设计语言那样以迭代(循环)作为主要控制结构。LISP的递归处理是基于递归定义的数据结构。

    LISP的数据结构——S-表达式

    LISP是一种适合于符号处理的语言,它与一般高级语言有着很大的不同。LISP处理的唯一对象是符号表达式。这种符号表达式又称S-表达式,这里S代表符号。因此,LISP程序是对符号表达式进行加工和处理的。

    原子是S-表达式的最简单情况,它可分为符号原子和数原子。符号原子是以字母开头的字母数字串,可用来表示变量、常量和函数的名字等。数原子是一串数字,在其前面可冠以符号‘-’或‘+’,分别表示负数原子和正数原子。

    S-表达式定义如下:

    原子是S-表达式。

    如果S1和S2是S-表达式,则(S1*S2)也是S-表达式。

    我们把(S1*S2)称为S-表达式的点对表示,S1、S2分别称为S-表达式的头部和尾部。应该注意,这个定义是一个递归定义。

    S-表达式的表表示法:

    表表示法的一般形式为:(<

    S-表达式>…<

    S-表达式>)其中,每个可以为原子,也可以为表。例如,(A ( B C ) ( D )

    )是表。表中有三个元素,即一个原子A,两外两个是表(B C)和( D

    ),叫做子表。不难看出,表的结构是嵌套的,定义是递归的。我们把最外层表中元素的个数定义为该表的长度。例如,表(

    A ( B C ) ( D ) )的长度为3。表元素是按次序排的,所以表是有序的,比如( A B C )不同于( B C A).

    在表表示法中有一种特殊情况。若表的长度为0,亦即表中没有任何元素时,此表称空表,可写作()或NIL。

    点对表示法转换成表表示法有如下两条规则:

    ( A * NIL ) * ( A ) 也即 ( A * ( ) ) * ( A )

    ( A * ( B C

    D … H )) * ( A B C D … H

    )

    这表明若点对的右部是NIL时,可把圆点与NIL去掉,剩下的部分构成一新表。若点对的右部是一张表时,此时称混合表,则可把点与右部表的括号去掉,剩下部分组成一张新表。在转换中,原子仍保持原来形式。

    LISP的基本函数

    LISP中函数调用的一般形式为:

    (函数名 自变量1

    自变量2 …… 自变量n)

    其中函数名为符号原子,每个自变量可为下列六种形式之一。

    我们约定:S 代表S-表达式

    L 代表表

    F 代表函数

    A 代表原子

    NA 代表非原子

    N 代表数原子

    其基本函数有如下几个:

    ( CAR NA )

    一元选择函数。自变量为非空表。函数CAR取自变量的第一个元素(即表的头部)。

    例 (CAR “( ( A B C) X Y Z )

    ) * ( A B C )

    ( CAR “M )

    出错,自变量为原子,函数无意义。

    如果CAR作用于点对形式的自变量时,则取其左部。

    ( CDR NA )

    一元选择函数。自变量为非空表。函数CDR回送一张表,这张表包含了自变量中除第一元素以外的所有元素,即表的尾部。所以它是CAR的补函数。

    例: (CDR “( ( A B C) X Y Z )

    ) * (X Y Z)

    如果CDR作用于点对形式的自变量时,则取其右部。当CDR作用于只含一个元素的表时,则CDR的结果为空表。

    ( CONS S1 S2 )

    二元构造函数,第一个自变量与第二个自变量分别是S-表达式。当第二个自变量为一张表时,则函数CONS回送一张表,该表的CAR是第一个自变量,它的CDR是第二个自变量。

    例: ( CONS “A “( B C )

    ) * ( A B C )

    ( ATOM S )

    一元谓词函数。自变量为S-表达式。函数ATOM是一个判断自变量是否为原子的谓词。当自变量为原子时,则函数值为T;当自变量为非原子的S-表达式时,则函数值为NIL。

    例: ( ATOM “HAPPY )

    * T

    ( EQ A1 A2 )

    二元谓词函数。两个自变量均为原子。函数EQ检验两个自变量,若为相同原子,则EQ函数值为T,否则为NIL。

    例: ( EQ “AB “CD ) * NIL

    ( EQ “(AB) “(AB) ) * NIL 虽然两个自变量为相同的S-表达式,但它们不是原子,所以结果仍为NIL。

    ( NULL S )

    一元谓词函数。其自变量为S-表达式。函数NULL判别自变量是否为空表,是空表时回送T,否则回送NIL。

    例:( NULL “( ) ) * T

    ( QUOTE S )

    一元函数。自变量为S-表达式。函数QUOTE回送的值就是跟在它们后面的S-表达式。换句话说QUOTE相当于符号“,是禁止求值的意思。

    在解决实际问题时,常需要把基本函数加以复合。例如,要取出表( X Y

    Z )中的第二个元素,需要先进行一次CDR运算,舍去第一个元素,然后再进行CAR运算,把剩下的表( Y Z

    )中的第一个元素取出来,即:

    ( CAR ( CDR “( X Y Z ) ) )*( CAR “( Y Z ) )*Y

    赋值函数和EVAL函数

    ( SET A S )

    二元函数。第一个自变量为符号原子,第二个自变量为S-表达式。函数SET把第二个自变量的值赋给第一个自变量,并以第二个自变量的值作为SET函数的值。

    ( SETQ A S )

    二元函数。第一个自变量为符号原子,第二个自变量为S-表达式。函数SETQ的作用与SET一样,只是不对第一个自变量求值。

    ( EVAL S )

    EVAL函数对S-表达式求值。因为在调用一函数时,若自变量未加引号的话,则要对自变量求值。因此,在这种情况下,EVAL函数是对一个函数自变量求值之后,再求一次值。

    其它表处理函数

    ( APPEND L S )

    二元函数。第一个自变量为表,第二个自变量为S-表达式。当第二自变量为表时,则函数APPEND将两个自变量联成一个表,即它只是把两个表的元素放在一个表中;当第二自变量为原子时,则函数APPEND把第一个自变量表与第二自变量原子组成点对形式的S-表达式。

    ( LIST S1

    S2 …… Sn

    )

    多元函数。每个自变量为S-表达式。函数LIST构成一个新表,它的元素是所有的自变量本身。

    ( LENGTH L )

    一元函数。自变量为表。函数LENGTH求出自变量中最外层元素的个数,或者说求表L

    的长度。

    ( REVERSE L )

    一元函数。自变量为表。函数REVERSE把自变量表中元素(指最外层元素)顺序倒排。

    ( SUBST S1 S2

    S3)

    三元函数。每个自变量都为S-表达式。函数SUBST将S3表达式中出现的S2表达式用S1表达式来代替。更直观些,可写为( SUBST

    )

    ( LAST NA)

    一元函数。自变量为非原子的表。函数LAST回送一张表,其中只含有自变量表中的最后一个元素。

    ( EQUAL S1 S2

    )判断两个S-表达式是否相同,如果相同则值为T,否则为NIL。

    ( MEMBER S1 S2

    )测试S1表达式是否为S2表达式中的元素,如果是则值为T,否则为NIL。

    算术运算函数与逻辑运算函数

    ( PLUS N1 N2 ……

    Nk)实现K个数相加。

    ( DIFFERENCE N1 N2)或(DIFF N1 N2

    )实现N1减N2。

    ( MINUS N )函数MINUS改变自变量值的符号。

    ( TIMES N1 N2 N3 ……

    Nk)实现K个数相乘。

    ( QUOTIENT N1 N2 )实现N1除以N2,结果值为商。

    ( REMAINDER N1 N2 )取N1除以N2的余数。

    ( DIVIDE N1 N2 )结果值为N1除以N2的商和余数组成的表。

    (NOT S )一元谓词函数。自变量为S-表达式。当自变量为原子NIL时才回送T,否则回送NIL。

    ( AND S1 S2 … Sn

    )

    ( OR S1 S2 … Sn

    )

    条件函数

    条件函数COND

    LISP对如下结构的条件分支

    If p1

    then e1 else

    If p2

    then e2 else

    If pn then en else

    en+1

    采用[p1*e1;

    p2*e2; …;

    pn*en;

    T*en+1]

    以上的形式在LISP中称为元语言表达式或M_表达式。上述分支的M_表达式,用S-表达式表示则写成如下形式:

    ( COND L1 L2 …

    Ln+1)其中每个Li有表形式(pi

    ei)。

    COND函数依次对各表的P求值。

    递归与迭代

    我们把函数在自己的定义中使用自己,或者通过调用其它函数导致间接地对自身的使用,称为函数的递归定义。递归是LISP语言的基础。

    迭代的意思就是重复。迭代和递归有所区别。迭代是某一计算过程的重复循环,而递归是在计算过程中要反复调用过程自身。

    下载CLISP编译环境,并了解此系统的特点

    经过长时间的上网搜索,下载到了CLISP

    编译环境的2.33-2版本,通过测试,能运行一些基本的函数,具体能不能编译通过QSIM算法的LISP代码还需要进一步验证。不行的话只能再找其他版本的编译器。

    具体运行过程也很简单,先打开命令行对话框,再在lisp.exe所在目录下输入:

    ...\lisp.exe –M lispinit.mem

    即可进入Clisp界面,在此系统中不区分字母的大小写,且与其他lisp系统有个别出入,现已发现的有:加减乘除以及求反等各函数不再用ADD,DIFFERENCE,TIMES,MINUS等,而直接用符号“+,-,*,/”代替,此系统可用的其他数值计算函数还有floor,ceiling,mod,sin,cos,tan,sqrt,exp,expt等,且在此clisp系统中,比较函数LT,LE,GT,GE,ONEP,EQN等均被符号,>=等代替,可以使用的比较函数经上机证实的有:ZEROP,NUMBERP,MINUSP,EQ,MEMBER等,但是对于MEMBER函数,我们发现当参数S1属于参数S2的最外层元素时返回的不是T,而是整个S2参数。这一点和以前的系统略有不同。

    还有,在对原子的性质表进行操作时,GET

    和REMPROP函数均有效,但是PUTPROP函数无效,现在还不清楚此系统使用什么函数加入新的性质表项。

    对于LET函数,他的作用和SETQ函数的不同之处在于LET函数只是暂时绑定,即原来存放SYMBOL的值的存储区域并没有被覆盖,可能只是将指针暂时指向一个临时存储区。

    这种情况如:(IF 4 5 6),结果是5,这说明此系统默认所有非NIL值为真。除T和NIL外的自赋值符号变量可通过在符号串前加冒号(COLON)实现。

    我们证实该系统支持科学计数法和复数表示,如:1.722e-15,#c(1.722e-15

    0.75)该系统还支持自动类型转换,即当两个不同类型的数相加(减)时,遵循如下原则:整数+有理数->有理数;有理数+实数->实数;实数+复数->复数。除了机器的内存大小外,整数的最大绝对值没有其他限制。

    一个空表可看成是一个空栈,可用PUSH和POP对其进行操作,为了更清楚地说明,举例如下:

    > (setq a

    nil)

    NIL

    > (push 4

    a)

    (4)

    > (push 5

    a)

    (5 4)

    > (pop

    a)

    5

    > a

    (4)

    > (pop

    a)

    4

    > (pop

    a)

    NIL

    > a

    NIL

    在此系统中并不是用参考资料中所说的DEFINE定义函数,而是用DEFUN,可能是因为这样用更能明确定义的是一个函数而不是变量或其他什么东西。

    此LISP系统还提供了&optional关键字,所有此关键字后的参数均为可选的,可选参数可用类似(x

    3)的形式赋缺省值,若无明确定义则系统默认其缺省值为NIL,如:

    >(defun baaz

    (&optional (x 3) (z 10)) (+ x z))

    BAAZ

    >(baaz

    5)

    15

    >(baaz 5

    6)

    11

    >(baaz)

    13

    该系统还提供了&rest关键字用此关键字后的变量代表所有多出来的参数所组成的一个LIST。如:

    >(defun foo (x

    &rest y) y)

    FOO

    >(foo 4 5

    6)

    (5 6)

    展开全文
  • Lisp语言入门.pdf

    2012-01-17 21:10:28
    Lisp语言入门.pdf,这个语言比较老,是用很多括号来进行编程的,非常奇怪,但至今依然被许多人用来学习,自然有其存在的价值。
  • 为什么Lisp没有流行起来本文探讨的是为什么Lisp语言不再被广泛使用的。很久以前,这种语言站在计算机科学研究的前沿,特别是人工智能的研究方面。现在,它很少被用到,这一切并不是因为古老,类似古老的语言却被广泛...

    为什么Lisp没有流行起来

    本文探讨的是为什么Lisp语言不再被广泛使用的。

    很久以前,这种语言站在计算机科学研究的前沿,特别是人工智能的研究方面。现在,它很少被用到,这一切并不是因为古老,类似古老的语言却被广泛应用.

    其他类似的古老的语言有 FORTRAN, COBOL, LISP, BASIC, 和ALGOL 家族,这些语言的唯一不同之处在于,他们为谁设计,FORTRAN是为科学家和工程师设计的,他们在计算机上编程的目的是是为了解决问题.COBOL是为了商业设计的,最好的体现在于让商人们可以利用电脑时代.LISP是了计算机科学研究设计的,最突出的体现在计算机基本原理研究.BASIC是为初学者设计的.最后,ALGOL语言是有计算机程序员修改,演变成其他流行的语言,如C,Pascal和Java的一个庞大的家族。

    上面提到的某些语言已经不像当初那么流行了。我们在这里可以把它们称作“失败”。问题是它们为什么失败?第一站出来的是COBOL. 很不幸,它以面向商业人员的很好的可读性就是它的失败点。商业人员发现,他们可以雇佣程序员去管理他们的系统。程序员自然会偏向于为他们设计的语言,而不是他们的老板。所以随着时间推移,越来越多的商业功能都使用例如VB, C, C++ 和JAVA实现了。现在,只有很少一部分软件仍通过COBOL语言编写。

    BASIC却有不同的命运。他是为入门人员设计的。那些在微机上学习编程,他们会使用内置的BASIC语言作为起点。随着时间推移,微机被运行微软操作系统的个人电脑,或者MacOS的苹果电脑所代替。这种语言逐渐被VB所取代。虽然他是面向初级程序员,它有一段时间代替了COBOL。为什么要耗费这么多的资源在昂贵的编译器上,而便宜的解释器在我们的电脑上已经存在?最近,微软以迁移到.NET框架上,让VB跟在后面。它的替代者, C#就是ALGOL家族中的一员,跟Java相近。

    这些年FORTRAN的使用起起伏伏。在某一阶段,差不多所有科学方面的代码是用它来写的。它的优点是这门语言中没有指针,并且不允许存在递归。这意味着所有数据的引用位置都可以在编译时确定。FORTRAN编译器利用这些额外的信息使程序运行格外地迅速。不幸的是,随着时间的推移,固定大小的数组这种数据结构变得过时了。现在,科学要处理任意形状的风格,甚至表述更为复杂的真实世界。这需要在语言中额外地加入指针。这些情况发生的时间段里,FORTRAN逐渐走向没落。现在,它被转移到高性能计算工作,其中新的并行矩阵和矢量运算最近添加到这门语言中,仍然使它拥有性能优势。

    ALGOL语言家族取得了成功。其原因是,这些语言是由程序员为程序员写的。随着时间的推移,这些与系统和应用相关的语言成为了现在最常用的语言。它的优点是越多地程序员使用,这门语言就能得到更多地改进,并且越来越多地程序是用它们来写就的。这提供了一个良性循环,更多的程序员们又被聘请在己编写的程序上工作。这是一个网络效应的例子。一个系统的“价值”是它的用户数目的平方,在于以此速率增长的用户之间的交互作用。

    那么为什么Lisp语言家族会站在失败者一边呢?有些人认为是语法的错。Lisp因为它的括号而臭名昭著。我并不认为是这个理由。许多用户说良好的格式可以让他们跟上这些括号。同时,Lisp语言被发明不久后,有一个叫“super-bracket”的语法可以让人快速表示出任意数量的回括号")"。这个特性在今天已经很少有人使用了。最后,优秀的编辑器解决了大多数的语法问题。

    另一些人经常抱怨Lisp是一门函数式语言。这是失败的理由吗?自然,跟早期的语言相比,只有Lisp算是函数式的。但事实上,我认为没有这么简单。Lisp也有命令式语言的特性,ALGOL系列语言也可以被当作一门纯正的函数式语言来用。 如果有人想选择一种特定的编程范式来写代码,一些特定的语言可以让这个选择更容易的实现。然而,现代语言已经足够灵活,它们能支持多种编程范式,近乎完全命令式的Lisp没有理由不存在。

    或许lisp的问题在于他使用了垃圾回收?在那个时候,只有lisp作为计算机语言采用了这个特性。诚然,垃圾回收会占用大量的计算资源,而早期计算机在该方面的不足足以组织lisp大展拳脚了。但是,我认为这仍然不是主要的原因。lisp是用来写那些复杂度相当高的程序的,而这些程序在事实上都必须带有一个垃圾回收模块,如果你用其他的语言来写……大概很难比lisp实现的要好吧?众所周知的事实是,任何一个如此复杂的程序,如果用其他语言写的话都不可避免的戴上一个比lisp垃圾回收臃肿不少的功能模块……

    lisp的失败,恰恰是因为他太成功,这让他的目标变得模糊。lisp相对与早期的语言实在是非常灵活,灵活到足以改变自身形式以适应需求。对于其他的语言来说,如果想要完成一个庞大的任务,就需要把这个任务打碎成一小块一小块的然后完成。如果是一个更大的呢?甚至连编译都需要分步完成了。但是lisp不是这样的,由于他强大的能力,程序员可以将lisp改造成特定领域的专门工具——顺手的工具将顺手的解决问题——任务轻松完成了。由于语言的正交性(译者注:这里可能应该理解为“自洽”),我们改造过的lisp仍然可以使用原有的编译器,解释器运行。

    那么建立特定领域的语言来作为一个问题的解决方案,它会出现什么问题呢?结果是它非常高效。然而,这种做法会使语言分化。这导致许多子语言都略有不同。这是Lisp代码对其他人而言可读性差的真正原因。在其他语言中,相对来说比较简单就能臆测出一段给定代码的作用。有着超强的表达力的Lisp,由于一个给定的符号(symbol)可能是一个变量,函数或操作,需要阅读大量代码才能找出它。

    Lisp失败的原因是因为它的碎片化,并且它的碎片化是因为其语言天性与特定领域方案的风格造成的。而网络效应则恰恰相反。越来越少的程序员使用相同的方言,因此它相对与ALGOL语言家族的总价值下降。

    如果有人现在设计一种语言,该如何避免这种问题呢?如果语言的表达性是我们的目标,那么它必须以某种方式加以调整。这门语言必须要有特意的限制,来保证所编写代码的可读性。Python是一门成功的语言,它已经做到了这些,其中某些限制是硬编码的,而另一些则是以约定成俗的方式存在。

    不幸的是,这么久过去了并且发明了这么多Lisp的变种语言,在其之上建立的其它新语言大概并不是所要的答案。根本不会有足够多的用户使它与众不同。也许解决的办法是,慢慢加入类似Lisp的语言功能到ALGOL语言家族中。幸运的是,这似乎是正在发生的事。新的语言(C#,D,Python等)趋向于拥有垃圾回收机制。他们也往往比旧的语言更具正交性。在未来,最终会有行为很像Lisp的一种流行语言。

    展开全文
  • LISP语言

    2021-01-15 18:29:06
    LISP语言是1960年J.麦卡锡在递归函数论基础上首先设计出来的。LISP语言的形式化程度高,表达力强,适合于描述各种知识和编写问题求解的程序,因此一直是用来研究人工智能的一种基本语言。自然语言中词可以认为是能...

    [拼音]:LISP yuyan

    [外文]:LISP

    为非数值符号运算而设计的表处理语言。LISP是英文LIST PROCESSING(表处理)的缩写。 LISP语言是1960年J.麦卡锡在递归函数论基础上首先设计出来的。LISP语言的形式化程度高,表达力强,适合于描述各种知识和编写问题求解的程序,因此一直是用来研究人工智能的一种基本语言。

    自然语言中词可以认为是能单独用来构成句子的最小单元,由词可以构成词组,由词组可以构成更复杂的词组或句子。LISP语言的“词”称为原子,如15(数值原子)、IFAC(非数值原子)。LISP语言的“词组”就是由一组原子构成的有一定形式的表,如(A-KIND-OF FEDERATION)。表和原子可以组成更复杂的表称为符号表达式(相当于复杂词组)如 (IFAC(A-KIND-OF FEDERATION))。

    程序结构

    符号表达式不但是LISP语言的数据结构形式而且也是它的程序结构形式,也就是说符号表达式可以代表一个语句,即一段程序。这种数据结构和程序结构在格式上的一致性是LISP语言的显著特点。从语义角度考虑:对符号表达式求值的函数称为EVAL。求值也可用简式表出,记为“符号表达式⇒值”。求值规则如下:

    (1)数字、T(真)、NIL(假,空表)的值就是自身。

    (2)如果符号表达式是表,且表的第一元素是函数,那么首先求出其他元素的值,然后对函数求值,如(PLUS(TIMES3 5)2)⇒17。

    (3)对以保留词形式出现的函数,其值完全取决于保留词的意义。如 (SETQ X (PLUS 15 1))即对X赋予16的值(SETQ是对原子赋值的意思)。

    (4)如果符号表达式是一原子,那么其值就是最近赋予的值。

    符号表达式的基本操作

    如果符号表达式是一个复杂的表,对其操作可归结为取、删、添、并、组合等。为了防止EVAL将所有表的第一元素都看成函数,引入符号“\”,表示对紧随“\”后的表或其他符号表达式不求值。也可用函数QUOTE来实现同样的目的。例如:

    (CAR\(ABC))⇒A

    CAR表示取表的首元素

    (CDR\(ABC))⇒(BC)

    CDR表示删去表的首元素

    (CONS\A\(BC))⇒(ABC)

    CONS表示在表中添入新的首元素

    (APPEND\(AB)\(CD))⇒(ABCD)

    APPEND表示将两表合并为一

    (LIST\A\B\(CD))⇒A(AB(CD))

    LIST表示将各元素列入表中作为简例,下面给出用LISP语言写的求表 L中各数之和的程序,例如L=(7,5,3,0),则SUM(和)之值为15。

    PROG (SUM)

    (SETQ SUMφ)

    LOOP (COND ((NULL L)(RETURN SUM)))

    (SETQ SUM (PLUS SUM (CAR L)))

    (SETQ L (CDR L))

    (GO LOOP)

    这段程序的含义是:用PROG引入分程序,它的局部变元是SUM,赋予SUM的初值是零(φ),循环:条件是,如果L等于空表,则返回SUM的值,

    否则

    将SUM原来值与表L首元素值之和赋予SUM,

    将表L删去首元素后的值赋予表L,

    继续循环

    用户自定义函数

    LISP语言的用户自定义函数常用LAMBDA表达式给出,其一般形式为(LAMBDA(atom 1,atom2,…,atom k)e),LAMBDA 之后是一形式参数表,e是有待求值表达式的LISP形式。函数调用时,对所有形式参数赋予实在参数的值,然后对函数体 e求值。函数定义的 LAMBDA记法是 J.麦卡锡根据 A.丘奇的 λ演算理论引入程序设计语言的。LAMBDA是希腊字母λ的英语拼音。这种记法有助于函数定义精确化,是LISP语言中定义非基本函数的普遍方法。例如用户可自行定义一新函数 EXCHANGE(交换):EXCHANGE=(LAMBDA(Y)(LIST(CADR Y)(CAR Y)))。这样(EXCHANGE\(AB))的值便是(BA),定义中CADR为先作CDR后作CAR两次函数运算的简写形式。因此,LISP程序的运行可归结为函数求值,LISP语言是一种函数型程序设计语言。这是70年代发展起来的新型程序设计语言。LISP语言的函数定义方式允许被定义函数间相互调用,也允许直接或间接地调用自身(称为递归)。下面是一个定义阶乘(!)函数的递归程序例子。FACTORIAL:(LAMBDA (N) (COND (EQUAL N 1)1)

    (T (TIMES N

    (FACTORIAL

    (SUB1 N)))))

    由于在函数体中出现被定义函数 FACTORIAL,所以这个定义是递归的。LISP语言兼有递归和迭代(见上例PROG)的功能,具有较强的表达力和较大的灵活性。LISP还可用于逻辑程序设计。用于逻辑程序设计的、扩展的LISP语言称为LOGLISP,它的功能与PROLOG等价。

    LISP语言有很多变种,但最基本的是LISP1.5,比较著名的还有MACLISP,INTERLISP等。

    参考书目

    Winston, Horn著,黄昌宁、陆玉昌译:《LISP程序设计》,清华大学出版社,北京,1983。(P.H.Winston and B.K.P.Horn,Lisp,Addison-Wesley Publ. Co., Reading, Mass.,1981.)

    展开全文
  • Lisp语言基础

    2020-03-06 21:24:31
    在介绍Lisp语言之前,先要说一说什么是广义表。广义表(generalized list) 是一种非线性的数据结构,是线性表的一种推广。 在广义表中,每个元素可以是一个值,即原子(atom),或者是一个子表。广义表(a,b,(c,d),e)(a,...

    Lisp

    Lisp是一款语法很简单,应用却很广的语言。它适用于符号处理、自动推理、硬件描述和超大规模集成电路设计等。它是最有影响的人工智能语言。

    在介绍Lisp语言之前,先要说一说什么是广义表。广义表(generalized list) 是一种非线性的数据结构,是线性表的一种推广。

    在广义表中,每个元素可以是一个值,即原子(atom),或者是一个子表。广义表 ( a , b , ( c , d ) , e ) (a,b,(c,d),e) (a,b,(c,d),e)可以表示成

    A = ( c , d ) , B = ( a , b , A , e ) A=(c,d),B=(a,b,A,e) A=(c,d),B=(a,b,A,e)

    同样,广义表 ( a , b , ( c , ( d , e ) ) , f , ( g ) ) (a,b,(c,(d,e)),f,(g)) (a,b,(c,(d,e)),f,(g))也可以拆成:

    A = ( d , e ) , B = ( g ) , C = ( c , A ) , D = ( a , b , C , f , B ) A=(d,e),B=(g),C=(c,A),D=(a,b,C,f,B) A=(d,e),B=(g),C=(c,A),D=(a,b,C,f,B)

    好了,那么我们就开始介绍Lisp语言的基本语法。

    lisp所有变量和函数都可以归结成两类:atom和list,当然,有一个例外,即NIL。NIL既可以认为是0或false,也可以认为是空表。

    lisp中的运算可表示成列表的形式:

    (+ a b):返回一个元素, a + b a+b a+b
    (- a b):返回一个元素, a − b a-b ab
    (* a b):返回一个元素, a ∗ b a*b ab
    (/ a b):返回一个元素, a / b a/b a/b

    给元素赋值用SETSETQ

    例:(SET 'a 2)意为给变量a赋值为2
    (SET 'a (ADD 2 3))就是将2+3赋值给a
    (SET 'a '(ADD 2 3))就是将列表(ADD 2 3)赋值给a。

    顺便说一句,lisp语言中如果一个列表前加上引号’,就代表这个列表本身。否则代表列表计算得到的结果(别忘了,lisp函数也是用列表表示的)。

    注意,SET给变量赋值的时候,要在待赋值的变量前面加上引号。如果你不想加引号,你可以用SETQ

    (SET 'a 2) ⇒ \Rightarrow (SETQ a 2)

    lisp对列表也有操作。

    (CAR A)返回列表A的第一个元素
    (CDR A)返回列表A去掉第一个元素剩下的列表。

    例子:
    (SETQ L '(a e i o u)) ⇒ \Rightarrow L=(a e i o u)
    (SETQ B (CAR L)) ⇒ \Rightarrow B=a
    (SETQ C (CDR L)) ⇒ \Rightarrow C=(e i o u)

    注意:CDR返回的一定是一个列表。不管列表里有几个元素。比如(CDR '(a b))返回(b)
    注意:当列表的元素也是列表的时候,CAR也会返回这个元素。比如(CAR '((a b) c (d e)))返回(a b)

    练习:
    (+ (- 2 3) (* 2 (+ 2 1)) (/ (* 3 8) 2))是多少?
    (SETQ L ((a b c d) c (b a b) a b))那么(CAR L),(CDR L),(CAR (CDR L)),(CDR (CAR L))分别是多少?

    解答:

    1. (+ (- 2 3) (* 2 (+ 2 1)) (/ (* 3 8) 2))对应的数学表达式就是(2-3)+(2*(2+1))+((3*8)/2),结果是17
    2. L是(a b c d) c (b a b) a b),那么L的第一个元素,即(CAR L)就是(a b c d)。剩余元素组成的列表,即CDR(L),就是(c (b a b) a b)(CAR (CDR L))c(CDR (CAR L))(b c d)

    Lisp常量
    T即布尔变量true
    NIL0,false或者空表格

    Lisp中其他运算:

    比较运算
    (> a b):即a>b
    (< a b):即a<b
    (= a b):即a==b
    (>= a b):即a>=b
    (<= a b):即a<=b
    (/= a b):即a!=b

    逻辑运算
    (AND a b):a与b
    (OR a b):a或b
    (NOT a):非a
    (XOR a b):a异或b

    展开全文
  • 以大比例尺符号库的开发为基础,充分利用AutoCAD的二次开发平台,使用Visual LISP语言,在AutoCAD2006平台下制作大比例尺地形图符号库,详细阐述了符号库的制作全过程,实现了适合大比例尺地形图需求的点状、线状、面状...
  • Common Lisp Koans(lisp-koans)是一个语言学习练习程序,类似 ruby koans,python koans 等等。Common Lisp Koans 主要是帮助学习一些 lisp 规范特性和改进,可以学习到大量的 Common Lisp 语言特性。终端,在文件...
  • Hua(㕦)是lua编译器的一种类似于的lisp语言。 它利用hy的解析器和宏扩展机制,并将解析后的hy语法树编译为 。 然后将结果传递到lua运行时(使用python / lua bridge ),并使用的代码生成器生成lua代码。 Hua尚在...
  • Lisp语言的各种尝试:主要是Common Lisp,Emacs Lisp,Maxima甚至Haskell 根据以下文献: 克鲁索诺托:Funktionale Programmierung and Metaprogrammierung 康拉德·巴尔斯基(Conrad Barski) 道格·霍伊特...
  • 语言程序设计资料:LISP语言教程.doc
  • Lisp语言教程(Scheme)

    2010-11-03 11:39:54
    lisp语言教程(scheme),基础,入门,本人制作的pdf
  • 本文本是1996年刘启卫老师发表的技术研究文章,为在探索AutoLisp与数据库连接方式的新手提供具体化的概念,更生动形象的了解Lisp语言与数据库的联系。
  • Lisp语言

    千次阅读 2018-09-15 22:36:54
    一: atom原子,是一个数字连续字符或字符串,它包括数字和特殊字符; list表,是包括在括号中的原子或其他列表的序列 string字符串 二:七个操作符 1、(quote x)返回x,记做’x 2、(atom x)当x是一个原子...
  • 通过嵌套在AutoCAD内部的AutoLISP语言来构建和驱动机器人仿真模型,并能获取解决动力学问题的参数。该系统能够检测出仿真模型各个部件之间是否出现干涉,并将干涉部分立刻显示出来。当驱动的程序加载到机器人并转换成...
  • 功能语言,易于扩展并且可能(使用LISP语言和功能的Lua功能)可以安装在软件Go!中! 历史 在看到已经有一些CLISP解析器写成之后,在GopherCon Brasil 2017(使用Go语言编写的语言)中理想化,其目的是成为CLISP的...
  • Emacs Lisp语言

    2019-03-01 16:12:28
    博文链接:https://dogstar.iteye.com/blog/33331
  • 龙源期刊网http://www.qikan.com.cnAutoLISP语言在房产测绘中的应用作者:周蓝捷,刘玲燕来源:《电脑知识与技术》2010年第06期摘要:该文主要讨论在房产测绘中对于autocad软件中的lisp语言编程的应用。通过使用符合...
  • The data process of looking-up in forms during the secondary development base on the LISP language is proposed.
  • autolisp语言程序

    2014-05-17 13:47:29
    简单的autoliso语言程序,适合入门者。。
  • LISP语言(马希文)

    2012-12-14 20:57:19
    一至三章介绍lisp的基本语法、语义、s表达式的概念、以及lisp的核心部分lisp1;四至十章主要讨论lisp的函数程序设计方法;十一至十三章是lisp的非函数程序设计部分;十四章介绍lisp中的一些高级成分和高级应用。 马...
  • 学习 Lisp 语言的相关书籍

    千次阅读 2016-01-22 12:04:31
    Lisp语言难以推广的原因有很多,而相对来说,比较高额的学习成本便是这众多原因的其中之一 ......

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 42,061
精华内容 16,824
关键字:

lisp语言