导航:首页 > 编程语言 > lisp函数式编程

lisp函数式编程

发布时间:2023-01-17 00:20:20

⑴ lisp 可以做什么

楼上都没说出lisp的特点和本质,总的来说,lisp有两个特征:函数式编程和面向语言

  1. 函数式编程决定了它与数学有天然的契合度,因此可以利用它来表达数学思想、推演符号类型

  2. 面向语言说明lisp是一门可以生成代码的语言。lisp对待数据和代码均采用同一种数据结构表示,因此lisp可以优雅的处理自身的代码。解决问题的时候,你完全可以利用lisp自己设计一门适合问题领域的语言,然后再处理


其实lisp有很多方言:

  1. Elisp:配置神器Emacs

  2. Scheme:最纯的lisp,实用的库很少,一般人只是在学习SICP的时候接触过,应用方面当然也有, 如作为texmacs的配置语言,还有Gimp的开发。如果利用这门语言学习编译器的设计将会是一个不错的选择

  3. comman lisp:lisp的集大成者,有很多库可用,可以用来做web开发、人工智能应用、系统应用程序(如邮件过滤器、mp3、html生成器等等)、类型符号推演

  4. clojure:做网站开发,运行在JVM上,有java基础比较好入手

  5. AutoLisp:与autocad结合用在绘图领域

⑵ Lisp 语言优点那么多,为什么国内很少运用

很久以前,这门语言一直处于计算机科学研究的前沿,尤其是在人工智能领域。现在,它很少使用,它不是因为古代,类似于古代语言被广泛使用。


其他类似的古代语言包括FORTRAN,COBOL,口齿不清,基本的,和ALGOL家族,这些语言之间唯一的区别是,他们为谁设计,Fortran是专为科学家和工程师,他们对计算机编程是为了解决问题of.cobol是设计业务,最好是反映交易者可以使用计算机era.lisp是计算机科学的研究与设计,最突出的表现是为初学者设计的in.basic研究计算机的基本原理。最后,ALGOL语言是一种计算机程序员修改,演变成其他语言,如C,一个大家庭的Pascal和java。

Lisp失败的原因是它是支离破碎的,它的分裂是由它的语言性质和特定域方案的风格造成的。网络效应是相反的。越来越少的程序员使用相同的方言,所以它是相对的ALGOL语言家族的总价值。

如果有人正在设计一门语言,我们怎样才能避免这个问题呢?如果语言的表达能力是我们的目标,就必须以某种方式加以调整。这种语言必须有特殊的限制,以确保编写代码的可读性。Python是一种成功的语言,它已经完成了,其中一些是硬编码的,而其他的则以习惯的方式存在。

总结:将来,最终会有一种流行的语言像Lisp一样。

⑶ LISP代码是什么

LISP(全名LISt Processor,即链表处理语言),由约翰·麦卡锡在1960年左右创造的一种基于λ演算的函数式编程语言。

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

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

LISP语言的主要现代版本包括Common Lisp和Scheme。
lisp拥有理论上最高的运算能力

1 基本介绍

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

abc
()
(abc xyz)
(a b (c) d)

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

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

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

(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来区分它们。 (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)

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

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

2 Common LISP的Hello World程序

下面是一个在标准输出设备上输出Hello World的简单程序,这种程序通常作为开始学习编程语言时的第一个程序:

(format t "Hello, world!~%")

⑷ 函数式编程的特点

函数式编程具有五个鲜明的特点。

1、函数是"第一等公民"
所谓"第一等公民"(first class),指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。

2、只用"表达式",不用"语句"
"表达式"(expression)是一个单纯的运算过程,总是有返回值;"语句"(statement)是执行某种操作,没有返回值。函数式编程要求,只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。

3、没有"副作用"
所谓"副作用"(side effect),指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。

4、不修改状态
上一点已经提到,函数式编程只是返回新的值,不修改系统变量。因此,不修改变量,也是它的一个重要特点。

5、引用透明性
函数程序通常还加强引用透明性,即如果提供同样的输入,那么函数总是返回同样的结果。就是说,表达式的值不依赖于可以改变值的全局状态。

⑸ Python和lisp在函数式编程上有哪些异同

Python内在的函数式功能

自Python 1.0起,Python就已具有了以上所列中的绝大多数特点。但是就象Python所具有的大多数特性一样,这些特点出现在了一种混合了各种特性的语言 中。和Python的OOP(面向对象编程) 特性非常象,你想用多少就用多少,剩下的都可以不管(直到你随后需要用到它们为止)。在Python 2.0中,加入了列表解析(list comprehensions)这个非常好用的”语法糖“。 尽管列表解析没有添加什么新功能,但它让很多旧功能看起来好了不少。

Python中函数式编程的基本要素包括functionsmap()、rece()、filter()和lambda算子(operator)。 在Python 1.x中,apply()函数也可以非常方便地拿来将一个函数的列表返回值直接用于另外一个函数。Python 2.0为此提供了一个改进后的语法。可能有点让人惊奇,使用如此之少的函数(以及基本的算子)几乎就足以写出任何Python程序了;更加特别的是,几乎 用不着什么执行流程控制语句。

所有(if,elif,else,assert,try,except,finally,for,break,continue,while,def)这 些都都能通过仅仅使用函数式编程中的函数和算子就能以函数式编程的风格处理好。尽管真正地在程序中完全排除使用所有流程控制命令可能只在想参 加”Python混乱编程“大赛(可将Python代码写得跟Lisp代码非常象)时才有意义,但这对理解函数式编程如何通过函数和递归表达流程控制很有 价值。

剔除流程控制语句

剔除练习首先要考虑的第一件事是,实际上,Python会对布尔表达式求值进行“短路”处理。这就为我们提供了一个if/elif/else分支语句的表达式版(假设每个分支只调用一个函数,不是这种情况时也很容易组织成重新安排成这种情况)。 这里给出怎么做:

对Python中的条件调用进行短路处理

Python

# Normal statement-based flow control

if <cond1>: func1()

elif <cond2>: func2()

else: func3()

# Equivalent "short circuit" expression

(<cond1> and func1()) or (<cond2> and func2()) or (func3())

# Example "short circuit" expression

>>> x = 3

>>> def pr(s): return s

>>> (x==1 and pr('one')) or (x==2 and pr('two')) or (pr('other'))

'other'

>>> x = 2

>>> (x==1 and pr('one')) or (x==2 and pr('two')) or (pr('other'))

'two'

我们的表达式版本的条件调用看上去可能不算什么,更象是个小把戏;然而,如果我们注意到lambda算子必须返回一个表达式,这就更值得关注了。既然如我 们所示,表达式能够通过短路包含一个条件判断,那么,lambda表达式就是个完全通用的表达条件判断返回值的手段了。我们来一个例子:

Python中短路的Lambda

Python

>>> pr = lambda s:s

>>> namenum = lambda x: (x==1 and pr("one"))

....or (x==2 and pr("two"))

....or (pr("other"))

>>> namenum(1)

'one'

>>> namenum(2)

'two'

>>> namenum(3)

'other'

将函数作为具有首要地位的对象

前面的例子已经表明了Python中函数具有首要地位,但有点委婉。当我们用lambda操作创建一个函数对象时, 我们所得到的东西是完全通用的。就其本质而言,我们可以将我们的对象同名字”pr”和”namenum”绑定到一起, 以完全相同的方式,我们也也完全可以将数字23或者字符串”spam” 同这些名字绑定到一起。但是,就象我们可以无需将其绑定到任何名字之上就能直接使用数字23(也就是说,它可以用作函数的参数)一样,我们也可以直接使用 我们使用lambda创建的函数对象,而无需将其绑定到任何名字之上。在Python中,函数就是另外一种我们能够就像某种处理的值。

我们对具有首要地位的对象做的比较多的事情就是,将它们作为参数传递给函数式编程固有的函数map()、rece()和filter()。这三个函数接受的第一个参数都是一个函数对象。

⑹ Lisp 语言优点那么多,为什么国内很少运用

之前在学校学编程的时候,偶然间听过这种语言,还是挺意外的,毕竟在中国这种语言太冷门了。有些人估计都没听说过这种语言啊。


定义

我认为一个语言的没落失败必定是因为他不适应这个社会的需求和发展。只有随时顺应社会人编程的需求和习惯还能更好的别使用。Lisp失败的原因是因为它的碎片化,并且它的碎片化是因为其语言天性与特定领域方案的风格造成的。而网络效应则恰恰相反。越来越少的程序员使用相同的方言,因此它相对与ALGOL语言家族的总价值下降。

阅读全文

与lisp函数式编程相关的资料

热点内容
能否给隐藏相册加密 浏览:596
糖心app改什么名 浏览:823
战地1控服务器如何部署 浏览:394
xp还原系统输入命令 浏览:323
mysql命令行版本 浏览:303
如何进入itunes找文件夹 浏览:832
CAD中重复命令使用 浏览:477
心智pdf 浏览:475
网站电台直播间源码 浏览:852
文件夹14c和18c的区别 浏览:34
android隐式调用 浏览:667
plc的编程指令边沿继电器 浏览:723
voc文件夹 浏览:865
租广东联通服务器注意什么云空间 浏览:934
javascript高级程序设计pdf 浏览:292
pwm单片机原理 浏览:348
ai算法在线修复图片 浏览:982
scratch编程中如何做射击游戏 浏览:479
at89c51编程器 浏览:344
项目经理叫醒程序员 浏览:344