lisp函数大全详解,lisp与python

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: