Lisp

开源公司:卡内基梅隆大学

作品详情

中文名
LISP(表处理语言)
展开
创造者
约翰·麦卡锡
展开
外文名
LIStProcessor
展开
主要版本
展开

1基本概述

表处理语言

LISP语言(全名LIStProcessor,即表处理语言),由约翰·麦卡锡在1960年左右创造的一种基于λ演算的函数式编程语言。(约翰·麦卡锡于2011年10月24日因病逝世于美国,享年84岁。)

LISP有很多种方言,各个实现中的语言不完全一样。各种LISP方言的长处在于操作符号性的数据和复杂的数据结构。1980年代GuyL.Steele编写了CommonLisp试图进行标准化,这个标准被大多数解释器和编译器所接受。在Unix/Linux系统中,还有一种和Emacs一起的EmacsLisp(Emacs的拓展语言便是Lisp)非常流行,并建立了自己的标准。

LISP的祖先是1950年代Carnegie-Mellon大学的Newell、Shaw、Simon开发的IPL语言。

LISP语言的主要现代版本包括CommonLisp和Scheme。

LISP拥有理论上最高的运算能力。

LISP在cad绘图软件上的应用非常广泛,普通用户均可以用lisp编写出各种定制的绘图命令。

名址分离网络协议

注意:LISP在近几年也指一种名址分离网络协议,即Location-IDSeparationProtocol。

在Internet的不断发展和壮大的同时,也呈现出了更多的弊端以及面临着诸多方面的挑战,包括全局路由表的持续不断的增长、缺乏对multi-homing和业务量工程以及移动性和安全性很好的支持等多方面的因素。

为了彻底地解决上述问题,众多研究者都提到名址分离这一想法,如LISP\HIP等。在LISP中,原有的网络IP地址被分成EID(end-identifier)和RLOC(routinglocator)。其中,EID用于标志主机,不具备全局路由功能;RLOC用于全网路由。名址分离网络自然会引入名与址的映射,即LISP中EID-to-RLOC的映射。众所周知,分级结构有着非常明显的优点,如结构简单、查询效率高等;已有方案中HRA、HAIR、RANGI、HiiMap、Lisp_CONS都提到采用分级结构进行映射系统的设计。

2基本介绍

Lisp的表达式是一个原子(atom)或表(list),原子(atom)是一个字母序列,如abc;表是由零个或多个表达式组成的序列,表达式之间用空格分隔开,放入一对括号中,如:

abc

()

(abcxyz)

(ab(c)d)

最后一个表是由四个元素构成的,其中第三个元素本身也是一个表。

正如算术表达式1+1有值2一样,Lisp中的表达式也有值,如果表达式e得出值v,我们说e返回v。如果一个表达式是一个表,那么我们把表中的第一个元素叫做操作符,其余的元素叫做自变量。

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

公理一:

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

公理二:

(atomx)当x是一个原子或者空表时返回原子t,否则返回空表()。在Lisp中我们习惯用原子t表示真,而用空表()表示假。

>(atom'a)

t

>(atom'(abc))

()

>(atom'())

t

现在我们有了第一个需要求出自变量值的操作符,让我们来看看quote操作符的作用——通过引用(quote)一个表,我们避免它被求值。一个未被引用的表达式作为自变量,atom将其视为代码,例如:

>(atom(atom'a))

t

反之一个被引用的表仅仅被视为表

>(atom'(atom'a))

()

引用看上去有些奇怪,因为你很难在其它语言中找到类似的概念,但正是这一特征构成了Lisp最为与众不同的特点——代码和数据使用相同的结构来表示,而我们用quote来区分它们。

公理三:

(eqxy)当x和y的值相同或者同为空表时返回t,否则返回空表()

>(eq'a'a)

t

>(eq'a'b)

()

>(eq'()'())

t

公理四:

(carx)要求x是一个表,它返回x中的第一个元素,例如:

>(car'(ab))

a

公理五:

(cdrx)同样要求x是一个表,它返回x中除第一个元素之外的所有元素组成的表,例如:

>(cdr'(abc))

(bc)

公理六:

(consxy)要求y是一个表,它返回一个表,这个表的第一个元素是x,其后是y中的所有元素,例如:

>(cons'a'(bc))

(abc)

>(cons'a(cons'b(cons'c())))

(abc)

公理七:

条件分支,在Lisp中,它是由cond操作符完成的,cond是七个公理中最后一个也是形式最复杂的一个(欧几里德的最后一个公理也如是):

(cond()()...())

p1到pn为条件,e1到en为结果,cond操作符依次对p1到pn求值,直到找到第一个值为原子t(还记得吗?)的p,此时把对应的e作为整个表达式的值返回,例如:

>(cond((eq'a'b)'first)

((atom'a)'second))

second

好了,至此我们已经有了Lisp世界的所有基本公理,我们可以开始构建整个世界的规则了。

3词条图册

查看全文
声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态
案例
cl-xmpp 是 Common Lisp 实现的一个 XMPP 协议支持的开发包。
MathB 是一种数学 pastebin 软件,为 MathB.in 提供支持。 它是一种基于网络的服务,旨在与万维网上的其他人共享数学文本片段。 特点 极简的用户界面 实时预览正在输入的 Ma...
Numcl 是适用于 Common Lisp 的 Numpy 克隆。目前该库使用纯 Common Lisp 编写,比起速度,更注重正确性和有效性。 用户可通过 https://github.co...
CL-JSON 是 Common Lisp 实现的一个 JSON 解析器和生成器。
McCLIM是Common Lisp接口管理(CLIM)规范(CLIM II Specification)的一个开源实现,用来在Common Lisp里编写GUI程序的强大的工具集。目前只能运行...
当前共32个项目

评论