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

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

分享到:
评论

相关推荐

    How to make Lisp go faster than C

    这些发现对于那些希望在科学计算、数值分析以及图像处理等领域中利用Lisp强大功能同时保持高效执行的研究人员和开发者来说非常重要。随着更多人了解这些技术和方法,Lisp作为一种高性能编程语言的地位将得到进一步...

    on lisp 中文版

    《OnLisp》不仅是一本关于 Lisp 高级编程技术的手册,更是一本引导程序员探索 Lisp 强大功能和灵活性的指南。通过学习本书,读者不仅可以掌握 Lisp 的宏和其他高级特性,还可以学会如何利用 Lisp 的独特优势来解决...

    Loving Lisp

    6. **列表处理**:Lisp强大的列表处理能力体现在`car`、`cdr`、`cons`等函数上,以及`mapcar`、`append`等高阶函数。读者将学会如何操作和遍历列表。 7. **宏**:Lisp的宏系统允许程序员创建新的语法结构。读者将...

    Lisp函数_上海工程技术大学_htm格式

    列表可以被视为函数调用或者数据结构,这是Lisp强大的地方,因为它允许程序与数据具有相同的表示形式。 二、AutoCAD Lisp函数概述 AutoCAD的Lisp函数集包含了大量的内置函数,用于控制图形、查询属性、读写数据库...

    基本的Lisp技术Basic Lisp Techniques

    每一点都是Lisp编程中不可或缺的组成部分,也是构成Common Lisp强大能力的关键所在。 本书是学习Common Lisp和高级编程技巧的宝贵资源,对于那些希望掌握这门古老而又现代的编程语言的开发者来说,它不仅提供了理论...

    AutoCAD Lisp程序100例.rar

    5. 数据处理:Lisp强大的数据处理能力在AutoCAD中大有作为。例如,你可以编写程序来读取、修改或分析图形中的对象属性,如长度、角度、颜色等,或者进行几何计算,如距离、面积和体积的测量。 6. 图形交互:Lisp...

    AutoLISP基础知识

    它提供了大量的功能函数,包括许多专门针对AutoCAD的特殊函数,可以直接调用所有AutoCAD的命令和系统变量,这赋予了AutoLISP强大的功能。编写AutoLISP程序的环境非常宽松,普通的文本编辑器如Windows的记事本就能...

    practical common lisp

    Lisp与众不同的括号语法经常让新手感到困惑,但正是这种语法赋予了Lisp强大的表达能力。作者详细解释了S-表达式和Lisp形式,包括函数调用、特殊操作符、宏以及真假和相等性的概念,并教授了格式化Lisp代码的技巧。 ...

    AutoLISP 编程.zip_autoLisp编程_autolisp_autolisp教程_lisp编程

    AutoLISP是一种基于LISP语言的编程环境,专为Autodesk的AutoCAD软件设计,用于扩展AutoCAD的功能和自定义工作流程。...无论你是AutoCAD的新手还是经验丰富的用户,AutoLISP都将是你提高效率、解决复杂问题的强大工具。

    基于Visual LISP的服装CAD放码系统.pdf

    系统利用Visual LISP强大的开发环境和Auto LISP的编程优势,开发出了一个操作简便、功能强大、适应性高的放码平台,能够满足服装企业在多样化设计和生产过程中的需求。通过对系统开发背景、技术实现以及运行环境的...

    lisp功能函数.pdf

    这些函数构成了LISP强大功能的基础,无论是进行数学计算、逻辑判断,还是处理列表和字符串,都有相应的工具支持。了解并熟练使用这些函数是掌握LISP的关键。在实际编程中,LISP程序员可以利用这些函数来构建复杂的...

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

    ### AutoCAD 的 AutoLISP 编程环境的强大功能 #### 14.1 关于 AutoLISP AutoLISP 是由 Autodesk 公司开发的一种基于 Lisp 的编程语言。“Lisp”是“List Processor”的缩写,它最早由 John McCarthy 在 1960 年的...

    CAD-lisp.rar_CAD LiSp代码_CAD菜单lisp源码_cad lisp 源代码_cad 图层‘_lisp 块

    Lisp是一种函数式编程语言,以其括号语法和强大的列表处理能力而闻名。 - 在AutoCAD中,CAD Lisp可以用来创建自定义命令,增加绘图效率,提高工作流程的灵活性。 2. **图层工具**: - 图层在CAD中是组织和控制...

    lisp工具.rar

    LISP(List Processing)是一种古老而强大的编程语言,它的设计思想独特,主要应用于人工智能、计算机科学、软件工程等领域。在给定的“lisp工具.rar”压缩包中,包含了一个LISP程序,用于辅助绘图工具,使得用户...

    Lisp Excel

    在《Lisp and Symbolic Functionality in an Excel Spreadsheet: Development of an OLE Scientific Computing Environment》这篇论文中,作者 Ronen Gradwohl 和 Richard Fateman 介绍了如何将 Lisp 的强大功能与 ...

    ANSI Common Lisp 中文翻译版.pdf

    ANSI Common Lisp 是一种功能强大且灵活的编程语言,广泛应用于人工智能、机器学习、自然语言处理、计算机视觉等领域。该语言的特点是拥有强大的宏机制,可以轻松地扩展语言的功能,使其在实际应用中具有很高的灵活...

    实用Common.Lisp编程.pdf

    Common Lisp作为Lisp语言的一个标准化版本,旨在为开发者提供一个稳定且功能强大的编程平台。 ### Common Lisp的特点与优势 #### 1. 动态类型和垃圾回收机制 Common Lisp支持动态类型,这意味着变量可以在运行时...

    Lisp的本质学习思考

    Lisp 语言是一种功能强大且灵活的编程语言,具有元编程、数据和代码形式合一、自修改代码、特定应用的子语言等特性。但是,对于初学者来说,Lisp 的语法和概念可能会显得很难理解和晦涩。因此,本文尝试从初学者的...

    MIT 的lisp手册《LISP Programmers Manual》

    LISP(LISt Processing)是一种历史悠久且功能强大的高级编程语言,它最早由John McCarthy于1958年设计。LISP的设计初衷是为了支持人工智能领域的研究,其独特的列表处理能力、灵活的数据结构以及强大的函数式编程...

Global site tag (gtag.js) - Google Analytics