lisp函数大全详解,lisp与python
Lisp的强大功能(V.S. Python3)第2部分-程序是生命-博客频道-CSDN。网
Lisp的强大功能(V.S. Python3)第2部分
分类:
2010-12-24 01:01
322人阅读
评论(16)
收集
报告由九天雁翎撰写(JTI安陵)-blog.csdn.net/vagrxie
腾讯微博
-讨论新闻组
-代码库
-豆瓣
前一篇文章
在这里。
Lisp特征列表处理):
CL-用户(defvar *nums*(列表0 1 2 3 4 5 6 7 8 9 10))
*NUMS*
CL-用户(列表(第四个*nums*)(第八个*nums*)(最后一个*nums*))
(3 8 (0 1 2 3 4 5 6 7 8 9))
CL-用户(remove-if-not #evenp *nums*)
(0 2 4 6 8 10)
在Lisp中,几乎所有东西都是列表。甚至比在lua里做表还不如,因为不仅仅是数据,任何表达式,函数调用等等。也是桌子。不过我习惯了[n]的形式,但还是不太适应first,last,rest的方式,而是last,n来获取表中的具体指标值。但很明显,Lisp对list的操作支持无循环遍历。似乎也许你会说只是语法糖,但其实代表了更高层次的抽象,就像C中STL的for_each,transform一样,不过,我想每个使用C的人都能理解他们的使用有多不方便。
虽然Python中并不是所有东西都是列表,但是Python对列表的处理还是相当强大的。
Python:
l=列表(范围(11))
l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
lo=[l[3],l[7],[l[0:len(l)-1 ]]]
瞧
[3, 7, [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]]
[x为l中的x,如果不是x % 2]
[0, 2, 4, 6, 8, 10]
Liscompressions(列表解析)这一强大特性的存在使得Python可以像Lisp一样方便地进行这种遍历,而无需外部循环。(具体来说,列表解析是从Lisp家族的函数式语言Haskell学来的)
其实在这里我想多说两句。直接操作一个序列(即不使用循环)非常方便,也是一种更高级的抽象。这符合我们应该表达做什么而不是怎么做,使用循环是怎么做的低级。其实即使在C中,我们也更倾向于高级抽象,根本不会有性能损失。比如前面提到的for_each,transform,实际上还有min _ element和max _ element就是典型的例子。但与Lisp和Python相比,在功能上还是显得比较弱。
Lisp:
CL-用户(defvar *首都-城市* ((新西兰。惠灵顿)
(AU。堪培拉)
(约。渥太华)))
*首都城市*
CL-用户(cdr(assoc CA *首都-城市*))
渥太华
CL-用户(mapcar # 汽车*首都-城市*)
(新西兰和加拿大)
关联列表,就像C里的map,Python里的dictionary,没感觉有多强大。
Python:
capital _ cities={ NZ : Wellington , AU :堪培拉, CA :渥太华 }
首都城市[CA]
渥太华
[首都城市中的x代表x]
[新西兰,澳大利亚,加拿大]
在Python中,默认情况下遍历dict就是遍历键,所以可以通过列表解析轻松处理。虽然Python在这些方面并不逊色于Lisp,但是需要提到的是Python并不逊色于Lisp.因为它从Haskell那里学会了列表解析。
匿名列表:CL-USER (Defun Explode(字符串可选(分隔符#/空格))
(let((位置分隔符字符串)))
(如果(空位置)
(列表字符串)
(cons(子序列字符串0位置)
(分解(子序列字符串(1位))
分隔符))))))
CL-用户(explode foo,bar,baz #/,)
(“福”“巴”“巴兹”)
CL-用户(展开foo,bar,baz’)
(“福”、“吧”、“巴兹”)
Lambda一般对童鞋不会太陌生。通俗点就是匿名函数,稍微现代一点的语言都有。之前试过C中的Boost:Lambda。
但是,这个特性并没有提到lambda,因为它太普通了。看清楚了,是lambda列表,虽然很神秘,但其实挺普遍的。相当于在传递参数时使用了list的特性,可以实现可选参数和关键字参数(也叫命名实参)。默认参数对于C来说可能很神奇,但是可选参数对于C来说很常见,关键字参数是BS主动放弃的C特性之一。(见070有意思的是,上面的例子是用递归来实现string的遍历。太花哨了。而且这个例子对于Python来说太普通了。Python甚至自带了这个函数实现的功能,我也懒得实现了。
Python:
导入字符串
福,酒吧,巴兹。拆分(,)
[foo , bar , baz]
福,酒吧,巴兹。拆分()
[foo , bar , baz]
第一类价值符号:(一级符号)Lisp:
CL-用户(defvar *foo* 5)
*FOO*
CL-用户(符号值 *foo*)
五
听过第一类价值函数,很少听说第一类价值符号。在Lisp中,符号可以用作变量的名称,或者占位符。说白了,它们有点像处理不当的字符串。Python里应该没有类似的概念。它说Python没有与之相似的东西,这激怒了一些Python粉丝。在此,为自己浅薄的Python知识道歉。我很乐意作为一种消遣来让你了解Lisp的特性。不要太认真。语言真的不是信仰,平台不是信仰,一切都是浮云。尽情享受吧。
第一类价值包:(一级包)cl-user (in-package: foo)
# Package FOO
FOO(包名*包*)
福
FOO(实习生‘任意’
(make-package :foo2 :use (:cl)))
FOO2:任意
无
我才明白什么叫太强。注意上面代码使用后的反应:foo package.命令提示符已更改。同时我理解,前CL-USER其实代表的是CL-USER package。在Lisp中,包类似于名称空间。虽然C的命名空间真的只是一个空格,但是JAVA、Python、Lua中的包已经非常好用了,不仅有命名空间,还有我不知道的这个。不知道是不是Lisp这种古老的特性现在太流行了,难怪变成这样,还是我太火星了?大师请指教。
特殊变量:(特殊变量)Lisp:
FOO(with-open-file(file-stream # p some file
:方向:输出)
(let(*标准输出*文件流))
(print 这将打印到文件,而不是标准输出。))
(print 打印到标准输出,而不是文件。))
这将打印到标准输出,而不是文件。
这将打印到标准输出,而不是文件。
据说Lisp变量有动态语法范围,也就是说你可以动态地把变量的范围从全局改变到局部,反之亦然,这有点不合常规。但是就示例中的代码而言,它类似于重定向函数,将标准输出定向到一个文件。Python也有这个功能。
Python:
导入系统
stdoutTemp=sys.stdout
sys.stdout=open(somefile , w )
print(这从Python打印到文件,而不是stdout。)
sys.stdout.close()
控制权转移:(控制权转移)翻译起来有点混乱。大致意思是执行语句从一个地方跳到另一个地方,类似于汇编时代就有的goto语句。
Lisp:
CL-用户(提前阻止
(循环:对于x:从1:到5:将x:收集到xs中
:最后(从早期x返回)))
(1 2 3 4 5)
CL-用户(提前阻止
(循环:重复5 :do
(循环:对于x:从1:到5:将x:收集到xs中
:最后(从早期xs返回))))
(1 2 3 4 5)
可能很难理解。其实这个时候的return-from类似于goto,而block就像是C的logo以:
Lisp:
CL-用户(默认投掷距离(a b)
(循环:对于x:从a:到b:收集x:到xs
:最后(throw :early xs)))
投掷距离
CL-用户(捕捉:早期
(循环:重复5 :do
(投掷范围1 10)))
(1 2 3 4 5 6 7 8 9 10)
Catch/throw语法的跳转有点像现代语言的变态,也是如此。看例子中的cath,对:早抛给出一个xs值,然后每次都能接住。这有点有趣,虽然有点怪异。
可能是因为现代语言足够强大,即使是从命令式语言(命令式语言的本质是模拟和简化机器语言)传播过来的,也逐渐变得越来越抽象,也学到了很多函数式语言。所以,其实语言的选择并没有那么重要,(参考此处。
)根据具体情况选择。你熟悉的,你高兴的都行。(当然不是一个人开心,而是整个开发团队)
另外,这里有一本特别有意思的书《Python》,是给Lisp程序员看的。
》,里面详细列举了Python和Lisp的异同。可以看出Python其实和Lisp差不多,也有一些关于当前语言效率的信息,可以作为参考。也算是给看了上一篇文章,对Lisp比Python快有疑问的人一个回答。其实这个世界的人都很奇怪。用C/C的人可以强调效率,因为我们是有效率的。用Python的人可以强调一下我们的伪代码,开发效率高。现在程序员的时间比机器宝贵多了,于是C/C的人又回答了。你可以尝试用Python为我开发一个操作系统。Python本身是用C语言写的,类似的论点还有很多。呵呵,不过,当效率和抽象更强的时候,它就更有话语权了,就像Lisp的用户宣称Lisp是世界上最好的语言一样.................
最后,感觉后期的Lisp功能没有之前的那么具体和突出,有些平淡。另外晚饭喝了几口二锅头,现在不怎么写了。未完待续。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。