当前位置:  开发笔记 > 编程语言 > 正文

Python与Ruby的元编程

如何解决《Python与Ruby的元编程》经验,为你挑选了12个好方法。

我目前主要是D程序员,我希望在我的工具箱中添加另一种语言,最好是支持元编程黑客的语言,而这些语言无法用静态编译的语言完成.

我已经阅读了一点Lisp,我很想找到一种语言,允许Lisp做的一些很酷的东西,但没有Lisp的奇怪语法等.我不想开始语言火焰战,我确信Ruby和Python都有他们的权衡,所以我将列出对我个人来说重要的事情.请告诉我Ruby,Python或其他语言是否最适合我.

重要:

    好的元编程.能够在运行时创建类,方法,函数等.最好是代码和数据之间的最小区别,Lisp风格.

    漂亮,干净,理智的语法和一致,直观的语义.基本上是一个深思熟虑,有趣的使用,现代语言.

    多种范式.没有一个范例适用于每个项目,甚至是项目中的每个小子问题.

    一种有趣的语言实际上影响了人们对编程的看法.

有一些重要:

    性能.如果性能很好,那将是很好的,但是当性能是一个真正的优先级时,我将使用D代替.

    充分证明.

不重要:

    社区规模,图书馆可用性等.这些都不是语言本身的特征,而且所有这些都可以很快改变.

    工作可用性.我不是一名全职的专业程序员.我是一名研究生,编程与我的研究相关.

    任何主要针对非常大型项目设计的功能都会考虑到一百万个代码猴子.

S.Lott.. 69

我已经阅读了一点Lisp,我很想找到一种语言,允许Lisp做的一些很酷的东西,但没有Lisp的奇怪语法等.

我们不是全部.

代码和数据之间的最小区别,Lisp风格

遗憾的是,代码和数据之间的最小区别以及"奇怪"的语法是彼此的后果.

如果您想要易于阅读的语法,那么您就拥有了Python.但是,代码没有在任何常用的内置数据结构中表示.它失败了 - 正如大多数语言所做的那样 - 你的'重要'列表的第1项.这使得很难提供有用的帮助.

你无法拥有一切.记住,你并不是第一个有这种想法的人.如果存在类似于您理想语言的东西,我们都会使用它.由于现实世界不符合您的理想,您必须重新确定您的愿望清单的优先顺序.必须重新安排"重要"部分,以确定对您来说真正重要的内容.



1> S.Lott..:

我已经阅读了一点Lisp,我很想找到一种语言,允许Lisp做的一些很酷的东西,但没有Lisp的奇怪语法等.

我们不是全部.

代码和数据之间的最小区别,Lisp风格

遗憾的是,代码和数据之间的最小区别以及"奇怪"的语法是彼此的后果.

如果您想要易于阅读的语法,那么您就拥有了Python.但是,代码没有在任何常用的内置数据结构中表示.它失败了 - 正如大多数语言所做的那样 - 你的'重要'列表的第1项.这使得很难提供有用的帮助.

你无法拥有一切.记住,你并不是第一个有这种想法的人.如果存在类似于您理想语言的东西,我们都会使用它.由于现实世界不符合您的理想,您必须重新确定您的愿望清单的优先顺序.必须重新安排"重要"部分,以确定对您来说真正重要的内容.


人们发现Lisp难以阅读,因为他们不熟悉语法.我发现Lisp比C#更容易阅读(但比Python更难).
我发现许多语言在非Lispy语法中实现类似Lisp的宏,最终发生的事情是编写宏非常困难,因为没有人自然知道代码所代表的数据结构,因此编写宏太难了没有人这样做.

2> ars..:

老实说,就元编程设施而言,Ruby和Python比他们的一些相似的人更加相似.对这两种语言的评论提供了相当不错的比较/评论:

http://regebro.wordpress.com/2009/07/12/python-vs-ruby/

所以,只需根据一些标准选择一个.也许你喜欢Rails并想学习那些代码.也许SciPy是你的事.查看图书馆,社区等的生态系统,然后选择一个.根据你的选择,你当然不会失去一些元编程的必杀技.



3> Steve Jessop..:

免责声明:我只涉及任何一种语言,但我至少写过两个小工作程序(不仅仅是快速脚本,我使用Perl,bash或GNU make).

Ruby可以非常适合"多范式"第3点,因为它很难创建特定于域的语言.例如,在线浏览并查看几个Ruby on Rails代码和几个Rake代码.他们都是Ruby,你可以看到相似之处,但它们看起来并不像你通常认为的那样.

Python在我看来更容易预测(可能与'干净'和'理智'第2点相关),但我真的不知道这是因为语言本身还是因为它通常被具有不同价值观的人使用.我从未在Python中尝试过深刻的魔法.我当然会说两种语言都经过深思熟虑.

两者在1和4中得分都很好.[编辑:实际上1是相当有争议的 - 两者都有"eval",在解释语言中很常见,但它们在概念上很难纯粹.您可以定义闭包,为对象分配方法等等.不确定这是否符合您的要求.]

我个人认为Ruby更有趣,但部分原因是因为更容易分心思考很酷的做事方式.我实际上更多地使用了Python.有时你不想要凉爽,你想继续使用它,所以它在睡觉前完成...

它们都不难进入,所以你可以决定在一个中完成下一个小任务,在另一个中完成后一个.或者从图书馆中挑选一本关于每本书的介绍性书籍,浏览它们并看看是什么抓住了你.



4> Jason Baker..:

至少在意识形态层面上,python和ruby之间并没有太大的区别.在大多数情况下,它们只是同一种东西的不同口味.因此,我建议您更多地了解哪一个符合您的编程风格.


绝对是*不是*同一件事.表面上的外观相似,但是你运用Ruby最强大的功能,你就会明白Python是不匹配的.举个例子,尝试在Ruby中编写DSL,编写一个Python,或者在运行时创建函数,方法,类等.它在Ruby中更直接.
你需要进行元编程并不罕见,这种情况很少见.除了最琐碎的程序之外,所有程序都有重复的模式,这些模式不会落入通常的重构工具,但可能会被元编程很容易地杀死.
即使在管理其设计的想法上,Ruby和Python也有很大的不同.Python他们想要一个,希望有一个明显的方法来做事.这通常使语言不像Ruby那样具有表现力,但它使它更加一致.从Perl的方式来看,Ruby有更多的东西,有很多方法可以做.Ruby也使一些东西变得非常简单,实际上包含了私有成员的想法.另一方面,Python最多只是让事情变得更难,所以你必须更加明确(比如在类上添加或覆盖行为).
Ruby和Python之间的相似之处在于它们传播"漂亮的代码".他们对这件美容事物有完全不同的看法(IMO很好)
你可能应该在两者中都做一个速成课程,但为了便于元编程,看来Ruby更适合.虽然我没有太多的经验,所以拿一点盐.
是的,但杰森的观点仍然存在.大多数人都在使用Ruby,Python,Perl,无论做什么"正常"的编程任务.您绝对需要使用动态编程是很少见的,您需要自己定制的DSL更为罕见.如果你远离动态世界,总的来说,ruby和Python,甚至Perl在较小程度上都非常相似.

5> 小智..:

你考虑过Smalltalk吗?它提供了一种非常简单,清晰且可扩展的语法,具有反射性和内省功能以及利用这些功能的完全集成的开发环境.看看在Squeak Smalltalk中正在完成的一些工作.很多使用Squeak的研究人员都在Squeak邮件列表和freenode 上的#squeak上闲聊,因此您可以非常轻松地获得有关复杂问题的帮助.

其当前相关性的其他指标:它可以在您想要命名的任何平台上运行(包括iPhone); 吉拉德·布拉查(Gilad Bracha)将他的新闻剧作品基于吱吱声; V8团队在Smalltalk虚拟机上大肆宣传 ; Dan Ingalls和Randal Schwartz最近在荒野中回到了Smalltalk工作.

祝您好运 - 请告诉我们您最终的决定.



6> 小智..:

Lisp满足您的所有标准,包括性能,它是唯一没有(奇怪)语法的语言.如果你在如此令人震惊的不明智/错误的基础上避开它并因此错过使用例如Emacs + SLIME + CL的经验,你将会给自己带来极大的伤害.


或者你可以尝试Clojure,我觉得非常好.

7> Neo..:

你的4个"重要"点完全导致了Ruby,而Python则统治了2个"重要"点.就这样吧.



8> FelipeC..:

你在描述Ruby.

好的元编程.能够在运行时创建类,方法,函数等.最好是代码和数据之间的最小区别,Lisp风格.

在运行时扩展修改现有基元非常容易.在ruby中,一切都是对象,字符串,整数,甚至是函数.

您还可以构造语法糖的快捷方式,例如使用class_eval.

漂亮,干净,理智的语法和一致,直观的语义.基本上是一个深思熟虑,有趣的使用,现代语言.

Ruby遵循不那么惊讶的原则,当比较Ruby代码与其他语言中的等价物时,许多人认为它更"漂亮".

多种范式.没有一个范例适用于每个项目,甚至是项目中的每个小子问题.

您可以遵循命令式,面向对象,功能性和反思性.

一种有趣的语言实际上影响了人们对编程的看法.

这是非常主观的,但从我的观点来看,同时使用多种范式的能力允许非常有趣的想法.

我已经尝试过Python,它不适合你的重点.


-1我正在使用Python,它非常适合,Python和Ruby之间的差异在于其他方面.你是Fanboy-ish发声器.
很多谈话但没有走路.注意在Python中提供一个动态添加方法的例子,比如String类?
@john这正是我的观点; 它非常复杂和丑陋(更不用说*String类的不可能*).Ruby中的OTOH非常简单:"self.class.send(:define_method,:method_name){method_code}"
Ruby可能*尝试*遵循PoLS,但我不会说它**.例如,`lambda` /`Proc.new`混乱在SO上被称为"令人惊讶的行为"和"高度违反直觉".:-)任何像Ruby一样大而复杂的语言必然会有这样令人困惑的领域.
@Token这里是Ruby中用于元编程目的的猴子修补`String`的例子:http://coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/51.子类化不会做; 但是,一个简单的双参数函数会.

9> jfs..:

比较使用不同语言执行相同操作(使用列表中的项的换行符非空描述)的代码示例myList(语言按反向字母顺序排列):

Ruby:

myList.collect { |f| f.description }.select { |d| d != "" }.join("\n")

要么

myList.map(&:description).reject(&:empty?).join("\n")

Python:

descriptions = (f.description() for f in mylist)
"\n".join(filter(len, descriptions)) 

要么

"\n".join(f.description() for f in mylist if f.description())

Perl:

join "\n", grep { $_ } map { $_->description } @myList;

要么

join "\n", grep /./, map { $_->description } @myList;

Javascript:

myList.map(function(e) e.description())
      .filter(function(e) e).join("\n")

Io:

myList collect(description) select(!="") join("\n")

这是一个Io指南.


(格式为nil"〜{~a~ ^〜%〜}"(删除nil(mapcar#'description mylist)))

10> Benjamin Oak..:

在"主流"方面,Ruby会比Lisp更好(无论真正意味着什么,但一个现实的问题是,如果你要使用它,那么在Lisp编程上找到问题的答案是多么容易.)无论如何. ,我发现Ruby非常容易上手.在我第一次学习Python(或其他语言)的时间相同的时间里,我很快就比以前更有效地编写了更好的代码.但这只是一个人的意见; 我想,带上一粒盐.我在这一点上比我对Python或Lisp更了解Ruby,但是在我切换之前你应该知道我是一个Python人已经有一段时间了.

Lisp绝对非常酷,值得研究; 正如你所说,社区的规模等可以很快改变.话虽如此,规模本身并不像社区的质量那么重要.例如,#ruby-lang频道仍然充满了一些非常聪明的人.Lisp似乎也吸引了一些非常聪明的人.我不能谈论Python社区,因为我没有很多第一手经验,但有时似乎"太大了".(我记得人们在他们的IRC频道上非常粗鲁,而且从我从真正使用Python的朋友那里听到的,这似乎是规则而不是例外.)

无论如何,您可能会发现一些有用的资源是:

1)实用程序员Ruby Metaprogramming系列(http://www.pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming) - 不是免费的,但后面的剧集非常有趣.(代码是免费的,如果你想下载它,看看你会学到什么.)

2)Paul Graham的Lisp(http://www.paulgraham.com/onlisp.html).它有点旧,但它是经典的(可免费下载).



11> xardias..:

我在许多项目中使用Python,我认为Python确实提供了您要求的所有功能.

重要:

    元编程:Python支持元类和运行时类/方法生成等

    语法:那就是主观的.我喜欢Pythons语法的简单性,但有些人抱怨Python是空白敏感的.

    范例:Python支持过程式,面向对象和基本的函数式编程.

    我认为Python有一种非常实用的风格,对我来说非常鼓舞人心.

有一些重要:

    性能:它是一种脚本语言.但是为Python编写C扩展是一种常见的优化实践.

    文件:我不能抱怨.它不是那么详细,因为有人可能从Java知道,但它足够好.

当你是研究生时,你可能想阅读本文,声称Python完全是科学家需要的.不幸的是我无法将Python与Ruby进行比较,因为我从未使用过该语言.

问候,丹尼斯


Python不是对空白敏感的.它是对缩进敏感的.

12> 小智..:

@Jason我分别不同意.有些差异使Ruby在元编程方面优于Python - 无论是哲学还是实用.首先,Ruby使用Single Inheritance和Mixins获得继承权.当谈到元编程时,你只需要理解它就是关于自我的.这里的规范差异是,在Ruby中,您可以在运行时访问自身对象 - 在Python中,您不需要!

与Python不同,在Ruby中没有单独的编译或运行时阶段.在Ruby中,每行代码都是针对特定的自我对象执行的.在Ruby中,每个类都继承自对象和隐藏的元类.这会产生一些有趣的动态:

class Ninja
  def rank
    puts "Orange Clan"
  end

  self.name #=> "Ninja"
end

使用self.name访问Ninja类的元类名称方法以返回Ninja的类名.元编程花在Python中如此美丽吗?我真诚地怀疑它!

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有