`
deepfuture
  • 浏览: 4332575 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:79404
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:68361
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:101484
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:281140
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:14597
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:65552
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:31311
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:45199
社区版块
存档分类
最新评论

lisp强大

 
阅读更多

以前就听说过Lisp被很多人认为是世界上最好的语言 ,但是它是那么的古老,这种言论很可能来自于不能进化到学习Ruby,Python的老古董,所以其实也没有太在意。
Lisp(这里特指Common lisp,下同)1978年被设计完成,是个多么古老的语言啊。。。。却总是不停的听到太多的Lisp的好话,总是感觉有些难以相信,BS说,"一个新设计的语言不比老的好,那新语言的设计者是要被打屁股的 ",假如Lisp还是世界上最好的语言,那么从BS自己,到James Gosling到Anders到Guido van Rossum 不都要被打屁股啊? 你说我能轻易相信吗?
“如果我们把流行的编程语言,以这样的顺序排列:Java、Perl、Python、Ruby。你会发现,排在越后面的语言,越像Lisp。 ”这个话 真的可信吗?
正好碰到一篇妄图说服我的文章《Features of Common Lisp》,眼见为实,是骡子是马,跑起来看看^^本文以Features一文为线索,(标题翻译的不好,请童鞋们见谅)与Python作为对比,C++啥的就都不太好意思拿出来比了,因为总是可以以效率为理由搪塞过去,但是,有可能我还是顺带提及一下。但是,总的来说,这是在Lisp的领地上战斗,,C++,Python是很吃亏的,但是作为已经足够强大的语言,还能够自我革新,Python的最新版本(3.1.1,以下没有特指,均指此版本)能够怎么应付,我拭目以待。特别提及,相比Lisp实现,CPython的运行速度慢得惊人,甚至差5-10倍,对于一个牺牲速度来换取表达性的语言,要是比不过速度比自己快那么多的语言,实在有些说不过去,即使是在别人的地盘..........迎战的Lisp是lispbox-0.7版本中集成的common lisp。

Lisp特性列表
强大抽象的数学计算(Rich, exact arithmetic):

大数(Bignums ): 不用当心溢出。
Lisp:
CL-USER> (expt (expt (expt (expt 10 10) 10) 10) 10)
100000000000000000000000000000000000...

这个貌似还行,C++虽然是需要通过外部库来处理,(在新标准中有过关于大数的提案,我以前还翻译过一篇《(N1744)Big Integer Library Proposal for C++0x 》)
但是Python对大数的支持还是非常不错的,特别提及,在Python2.1时代,虽然有大数支持,但是你得自己指定,假如都是用普通整数,还是会溢出。在2.2以后版本中已默认会进行类型提升。(参考PEP237 )呵呵,这点挺符合越新的语言(在Python来看,也就是越新的版本越接近)也就是越接近Lisp的理论。

Python:
>>> ((((10 ** 10) ** 10) ** 10) ** 10)
1000000000000000000000000000000000000000000 .....

分数(Rational numbers ): 保留成比例的形式。
Lisp:
CL-USER> (+ 5/9 3/4)
47/36

这个很牛很牛。。。。我目前懂的语言,(C/C++,Lua,Python,Objc以后提及均表示此意)还没有哪个是这样计算分数的,给你的都是浮点数。
特别提及一点,在Python2.x时代,上面的整数运算会像C++中那样,直接变成整数(5/9也就是0),但是新版本中已经不那么扭曲了。

Python 2.6.4:
>>> 5 / 9
0

Python3:
>>> 5 / 9
0.5555555555555556
我很遗憾的表示,同样的,python3比2.X版本更加像lisp,但是还不是足够像。

 

复数(Complex numbers ):
内建支持

Lisp:
CL-USER> (* 2 (+ #c(10 5) 4))
#C(28 10)

这个也还算方便,虽然我平时好像也用不上,C++中得通过库处理。Python也内建支持。

Python:
>>> (((10 + 5j) + 4) * 2)
(28+10j)

相对来说,以近似伪码著称的Python表达还是更加清晰一些。

统一的引用(Generalized references):
Lisp:
CL-USER> (defvar *colours* (list red green blue))
*COLOURS*
CL-USER> (setf (first *colours*) yellow)
YELLOW
CL-USER> *colours*
(YELLOW GREEN BLUE)
CL-USER> (push red (rest *colours*))
(RED GREEN BLUE)
CL-USER> *colours*
(YELLOW RED GREEN BLUE)

Lisp的操作都是使用引用对列表进行操作,你可以改变这个列表,实际操作的是同一个列表,就像你使用了rest操作,并对其进行push,但是实际也还是会改变原来的colours,因为rest返回的也还是引用而不是临时变量,这个特性看起来很有意思,有些特殊,具体的使用范围我还不是太清除(因为毕竟没有lisp编写大型的程序)

 


比如:

 


Python:

>>> l
[red, yellow, green, blue]
>>> l ;
[red, yellow, green, blue]
>>> l = ["red", "green", "blue"]
>>> l[0] = "yellow"
>>> l
[yellow, green, blue]
>>> l[1:]
[green, blue]
>>> l2 = l[1:].insert(0, "red")
>>> l2
>>> l
[yellow, green, blue]

 


需要注意的是,l[1:].insert(0, "red")操作是不会返回[red,green,blue]的,这样你临时的变量都获取不到,同样的,用切片操作来模拟的话,不仅没有返回值,原列表更不会改变,因为切片后的是临时变量,而不是引用。

 

多重值(Multiple values):
Lisp:
CL-USER> (floor pi)
3
0.14159265358979312D0

有简单的内建语法支持多个值,因此能方便的让函数返回多个值。此点C++就靠其他手段吧,比如异常ugly的用传指针/引用,然后再通过指针/引用传出去,虽然用了这么多年的C++了,这种方式也习惯了,但是一比较,就知道那不过是个因为语言的抽象能力太弱,使用的walk round的办法而已。 Python还是可以的。
虽然,Python的floor不返回两个值。

Python:
>>> import math
>>> math.floor(math.pi)
3

但是,你的确是可以返回多个值。

Python:
>>> def myFloor(x):
    return math.floor(x), x - math.floor(x)

>>> myFloor(math.pi)
(3, 0.14159265358979312)

但是,需要特别注意的是,这只是个假象......因为实际上是相当于将返回值作为一个tuple返回了。

Lisp:
CL-USER> (+ (floor pi) 2)
5

在计算时,让第一个多重值的第一个变量作为计算的变量,所以非常方便。

因为Python的返回值如上面所言,其实是用tuple模拟多个返回值的,不要奢望了。

 


Python:

>>> myFloor(math.pi) + 1
Traceback (most recent call last):
  File "<pyshell#58>", line 1, in <module>
    myFloor(math.pi) + 1
TypeError: can only concatenate tuple (not "int") to tuple

 


不过,lua倒是可以,可能lua还是从lisp那吸收了很多东西吧:

 


Lua(5.1.2以下同):

> math.floor(math.pi)
> print(math.floor(math.pi))
3
> function myFloor(x)
>> return math.floor(x), x - math.floor(x)
>> end
> print(myFloor(math.pi)+ 1)
4


而且在Lisp中可以很方便的使用多重值的第二个值。(通过multiple-value-bind)

 


Lisp:

CL-USER> (multiple-value-bind (integral fractional)
         (floor pi)
       (+ integral fractional))
3.141592653589793D0

分享到:
评论

相关推荐

    本教程用于示范 AutoCAD 的 AutoLISP 编程环境的一些强大功能

    本教程用于示范 AutoCAD 的 AutoLISP 编程环境的一些强大功能

    LISP 程序最新知识

    ★功能函数强大 除一般性的功能函数外,又拥有为数不少控制配合AutoCAO的特殊函数,再加上AutoLISP可直接调用执行所有AutoCAD的命令,以及掌握运用所有的AutoCAD系统变量,功能之强大令人欣喜不已! ★撰写的环境不...

    VISUAL LISP教程(AutoCAD2000)_visualLISP语法_lisp_autolisp语法_教程_

    功能函数强大C.撰写的环境不挑剃D.直译式程序『即写即测、即测即用』E.横跨 AutoCAD 各作业平台悠然自得 (注:以上五点读者可以参考上一章的剖析!!!)2.学好 AutoLISP 的关键:充份掌握『语法结构』&amp;『功能函数』...

    ansi common lisp 教程

    新的和更强大的方法教育学生的思考程序,该文本包含一个教程的例子,说明Lisp编程的基本概念,以及ANSI Common Lisp的一个跟上时代的总结,列出每个运营商在语言。信息和乐趣,它给学生提供了他们所需要的一切,开始...

    在裸机 x86-64硬件(WIP) 上运行的 Lisp 操作系统_lisp_代码_相关文件_下载

    系统编程语言是Ink,一种新的 Lisp 方言,它结合了 Scheme 的优雅和 Common Lisp 的强大功能 使用 Common Lisp 编写的汇编程序和 64 位引导加载程序。 VGA 文本模式,无需使用 BIOS。 不使用 BIOS 的键盘处理。 ...

    cad lisp 初级教程

    既具备一般高级语言的基本结构和功能,亦有一般高级语言没有的强大图形处理能力。内建于AutoCAD应用程序,不须另行购买;亦不须使用特定的编辑器或开发环境。可配合AutoCAD提供的PDB,建立DCL(Dialog Control ...

    lisp学习软件

    Lisp 语言的强大使它在其它方面诸如编写编辑命令和集成环境等显示其优势。而 GNU Emacs Lisp 主要由 Maclisp 发展而来,该语言由 MIT 在 20 世纪 60 年代写成。它在某种程度上继承了 Common Lisp,而 Common Lisp 在...

    AutoLiSP 教程 (AutoLiSP Tutorial 中文版)

    本教程用于示范 AutoCAD® 的 AutoLISP® 编程环境的一些强大功能,并介绍 AutoLISP 语言的新功能。

    Visual LISP程序设计技巧与范例

    Visual LISP程序设计技巧与范例本书通过开发AutoCAD 的新命令绘制花园小径并以圆形花砖填满这个花园小径,介绍了Visual LISP的强大功能。全书共分七章,第一章提出了程序设计的目标,第二章至第五章则介绍了如何实现...

    Emacs:我的 emacs 配置。 用 lisp 的强大功能构建! 还包括许多有用的片段。 享受!

    我的 Emacs 配置我喜欢 emacs。 让我们分享爱! 如果您不熟悉emacs,请访问。...贡献如果您想做出贡献,请通过与我联系或创建推送请求。 我会尽快审核。一些有用的片段看到其他开发人员的 emacs 配置总是很有启发性,...

    Lisp之根源(初学则必看)手册

    随着计算机变得越来越强大,新开发的语言一直在坚定地趋向于Lisp模式. 二十年来,开发新编程语言的一个流行的秘决是,取C语言的计算模式,逐渐地往上加Lisp模式的特性,例如运行时类型和无用单元收集. 在这篇文章中我尽...

    emacs-lisp编程入门

    强大的emacs lisp编程 不仅仅适用于初学者

    GNU Emacs Lisp编程入门

    lisp是一门古老的语言,但它简单易学,而且是强大的文本编辑软件Emacs的配置语言。

    [muchong.com]AUTOLISP语言参考.pdf

    学习 AutoLISP 是非常容易的,对初学者而言,即使没有学习...以及掌握运用所有的 AutoCAD 系统变量,功能之强大令人欣喜不 已! 撰写的环境 不挑剔 只要是一般的文书编辑软件都适用! 如:Windows 的记事本、 PE2、 PE3、DW3

    Lisp入门教程--介绍 AutoLISP 语言

    本教程用于示范 AutoCAD® 的 AutoLISP® 编程环境的一些强大功能,并介绍 AutoLISP 语言的新功能。 本教程的目标是用自动绘图工具绘制花园小路。这些工具可以最大限度地节省绘图时间,显示出参数化编程的能力。 将...

    基于AutoCAD的DCL与AutoLISP的有机整合

    分析了用AutoCAD内嵌的AutoLISP与DCL整合的开发过程,通过开发表面结构代号绘制工具的实例,说明了利用DCL和AutoLISP能够编写出人机交互强和功能强大的程序,从而对AutoCAD进行有效的二次开发,提高绘图效率,使AutoCAD...

    Build Your Own Lisp

    本书包含了 17 个短小精练的章节。你应该安排好你的阅读进度,每天按照计划阅 读并及时实践。建议每天至少阅读一个章节。读完本书之后,你还可以继续完善你 的 Lisp,使它更加完整与强大。

    AUTOLISP培训教程-4.pdf

    功能函数强大:除一般性的功能函数外,又拥有为数不少控制配合 AutoCAD 的特殊函数,再加上 AutoLISP 可直接呼叫执行所有 AutoCAD 的指令,以及掌握运用所有的 AutoCAD 系统变量,功能之强 大令人欣喜不已! 撰写的环境...

    lisp.js:JavaScript 中的一个小 lisp 解释器

    Lisp.js 受到 Peter Norvig 的的,我花了两天时间用 JavaScript 编写了一个小巧但功能强大的 lisp 解释器。 我改进了算术运算符以支持多参数计算,例如(add 1 2 3 4) ,并添加了一些语法糖,例如let 、 let* 、 cond...

    taijizhenjing:太极朗书

    lisp强大的宏功能在太极语言里表现为元编译的一个特例。当前,太极语言利用coffee-script编写开发,基于javascript实现。太极语言代码文件被编译为javascript。因此,类似于coffee-script,太极语言能够使用...

Global site tag (gtag.js) - Google Analytics