Python与Ruby的元编程

时间:2008-09-27 22:50:16

标签: python ruby lisp metaprogramming

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

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

重要的:

  1. 好的元编程。能够在运行时创建类,方法,函数等。最好是代码和数据之间的最小区别,Lisp风格。
  2. 漂亮,干净,理智的语法和一致,直观的语义。基本上是一个经过深思熟虑,有趣的现代语言。
  3. 多种范例。没有一个范例适用于每个项目,甚至是项目中的每个小子问题。
  4. 一种有趣的语言,实际上会影响人们对编程的看法。
  5. 有点重要:

    1. 性能。如果性能很好,那将是很好的,但是当性能是一个真正的优先级时,我将使用D代替。
    2. 充分证明。
    3. 不重要:

      1. 社区规模,图书馆可用性等。这些都不是语言本身的特征,所有这些都可以很快改变。
      2. 工作可用性。我不是一名全职的专业程序员。我是一名研究生,编程与我的研究相关。
      3. 任何主要针对大型项目设计的功能都会考虑到百万代码猴子。

31 个答案:

答案 0 :(得分:69)

  

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

我们不是全部。

  

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

可悲的是,代码和数据之间的最小区别以及“奇怪”的语法是彼此的后果。

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

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

答案 1 :(得分:17)

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

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

答案 2 :(得分:16)

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

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

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

两者在1和4中得分都很好。[编辑:实际上1是相当有争议的 - 两者都有“eval”,在解释语言中很常见,但它们在概念上很难纯粹。您可以定义闭包,为对象分配方法以及诸如此类的东西。不确定这是否可以达到你想要的程度。]

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

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

答案 3 :(得分:15)

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

答案 4 :(得分:15)

您是否考虑过Smalltalk?它提供了一种非常简单,清晰且可扩展的语法,具有反射性和内省功能以及利用这些功能的完全集成的开发环境。例如,请查看some of the work being done中的Squeak Smalltalk。许多使用Squeak的研究人员都在freenode上的Squeak mailing list和#squeak上闲逛,因此您可以非常轻松地获得有关复杂问题的帮助。

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

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

答案 5 :(得分:14)

Lisp满足您的所有标准,包括性能,它是唯一没有(奇怪)语法的语言。如果你在如此令人震惊的不明智/错误的基础上避开它,从而错过了使用例如Emacs + SLIME + CL,你会伤害自己。

答案 6 :(得分:12)

您正在描述Ruby。

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

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

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

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

Ruby跟随principle of less surprise,当比较Ruby代码与其他语言中的等价代码时,许多人认为它更“漂亮”。

  
      
  • 多种范例。没有一个范例适合每个项目,   甚至是内部的每个小子问题   一个项目。
  •   

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

  
      
  • 一种有趣的语言,实际上影响了人们的思维方式   关于编程。
  •   

这是非常主观的,但从我的角度来看,同时使用多种范式的能力可以产生非常有趣的想法。

我已经尝试过Python并且它不适合你的重点。

答案 7 :(得分:11)

你的4个“重要”点完全导致了Ruby,而Python则统治了2个“有些重要”的点。就这样吧。

答案 8 :(得分:9)

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

<强>红宝石

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 guide

答案 9 :(得分:6)

Ruby在“主流”方面会比Lisp更好(无论真正意味着什么,但一个现实的问题是,如果你找到Lisp编程问题的答案是多么容易我不得不接受。)无论如何,我发现Ruby非常容易上手。在我第一次学习Python(或其他语言)的时间相同的时间里,我很快就用更好地编写了更好的代码 。但这只是一个人的意见;我想,带上一粒盐。我在这一点上对Ruby的了解远远多于我对Python或Lisp的了解,但在切换之前你应该知道我已经是一个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)关于保罗格雷厄姆的Lisp(http://www.paulgraham.com/onlisp.html)。它有点旧,但它是经典的(可免费下载)。

答案 10 :(得分:5)

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

重要的是:

  1. 元编程:Python支持元类和运行时类/方法生成等
  2. 语法:那就是主观的。我喜欢Pythons语法的简单性,但有些人抱怨Python是空格敏感的。
  3. 范例:Python支持程序,面向对象和基本的函数式编程。
  4. 我认为Python有一种非常实用的风格,对我来说非常鼓舞人心。
  5. 有点重要:

    1. 性能:它是一种脚本语言。但是为Python编写C扩展是一种常见的优化实践。
    2. 文档:我不能抱怨。它不是那么详细,因为有人可能从Java知道,但它足够好。
    3. 由于你是研究生,你可能想阅读这篇论文,声称Python is all a scientist needs。 不幸的是我无法将Python与Ruby进行比较,因为我从未使用过该语言。

      此致 丹尼斯

答案 11 :(得分:5)

@Jason我分别不同意。有些差异使Ruby在元编程方面优于Python - 无论是哲学还是实用。首先,Ruby gets inheritance right with Single Inheritance and Mixins。当谈到元编程时,你只需要了解它就是 self 。这里的规范差异是,在Ruby中,您可以在运行时访问 self 对象 - 在Python中您不能访问它!

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

class Ninja
  def rank
    puts "Orange Clan"
  end

  self.name #=> "Ninja"
end

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

答案 12 :(得分:4)

Io满足您所有的“重要”要点。我不认为有更好的语言来做疯狂的元hackery。

答案 13 :(得分:4)

好吧,如果你不喜欢lisp语法,那么汇编程序就是你的选择。 : - )

它在代码和数据之间肯定有最小的区别,是多范式(或者可能是非范式),它是一种思维扩展(如果单调乏味)的经验,无论是学习还是你可以做的技巧。 / p>

答案 14 :(得分:3)

我的答案都不是。我知道这两种语言,在Ruby上上过课,并且已经在python中编程了好几年。 Lisp擅长元编程,因为它的唯一目的是转换列表,它自己的源代码只是一个令牌列表,所以元编程很自然。我最喜欢这种类型的三种语言是Rebol,Forth和Factor。 Rebol是一种非常强大的方言语言,它从输入流中获取代码,对其运行表达式并使用该语言编写的规则对其进行转换。非常富有表现力,非常善于辩证。因子和Forth或多或少完全脱离语法,你可以通过定义和调用单词来编程它们。它们通常大多用自己的语言编写。您不是在编写传统意义上的应用程序,而是通过编写自己的单词来定义特定应用程序来扩展语言。因子可以特别好,因为它有许多我在Smalltalk中看到的用于评估和使用源代码的功能。一个非常好的工作区,交互式文档等。

答案 15 :(得分:3)

  

一个支持元编程的黑客只是无法用静态编译的语言完成

     

我很想找到一种允许 Lisp 做的一些很酷的东西的语言

可以编译Lisp。

答案 16 :(得分:3)

你试过Rebol吗?

答案 17 :(得分:2)

OCaml怎么样?

OCaml功能:静态类型系统,类型推断,参数多态,尾递归,模式匹配,第一类词法闭包,仿函数(参数模块),异常处理和增量世代自动垃圾收集。

我认为它满足以下条件:

  

重要的:

     
      
  1. 漂亮,干净,理智的语法和一致,直观的语义。基本上是一个经过深思熟虑,有趣的现代语言。
  2.   
  3. 多种范例。没有一个范例适用于每个项目,甚至是项目中的每个小子问题。
  4.   
  5. 一种有趣的语言,实际上会影响人们对编程的看法。
  6.         

    有点重要:

         
        
    1. 性能。如果性能很好,那将是很好的,但是当性能是一个真正的优先级时,我将使用D代替。
    2.   
    3. 充分证明。
    4.   

答案 18 :(得分:2)

在探索Python,Smalltalk和Ruby之后,Ruby是我的选择。

答案 19 :(得分:2)

我使用了Python,但更多的是Ruby。但是,我认为他们都提供了你所要求的。

如果我看到你的所有四点,你至少可以检查: http://www.iolanguage.com/

莫扎特/奥兹对你也很有意思: http://mozart.github.io/

此致 弗里德里希

答案 20 :(得分:2)

如果您喜欢lisp风格的代码是数据概念,但不喜欢Lispy语法,那么Prolog可能是个不错的选择。

这是否有资格作为“使用乐趣,现代语言”,我会留给别人来判断。 ; - )

答案 21 :(得分:2)

将Python和Ruby分开并不是很多。我会说Python社区比Ruby社区更大,更成熟,这对我来说非常重要。 Ruby是一种更灵活的语言,具有积极和消极的影响。但是,我确信会有很多人详细介绍这两种语言,所以我会在第三个选项中加入第三个选项。 JavaScript怎么样?

JavaScript最初被设计为Web的Scheme,它是基于原型的,就多范式和元编程而言,这是一个优于Python和Ruby的优势。语法不如其他两种语法好,但它可能是现存最广泛部署的语言,性能每天都在提高。

答案 22 :(得分:1)

如果你喜欢玫瑰,你必须学会​​和荆棘一起生活:)

答案 23 :(得分:1)

我不确定Python会满足你想要的所有东西(特别是关于代码和数据之间最小区别的观点),但有一个论点支持python。有一个项目可以让你轻松编程D中的python扩展,这样你就可以充分利用这两个世界。 http://pyd.dsource.org/celerid.html

答案 24 :(得分:1)

对于python风格的语法和类似lisp的宏(真实代码的宏)和良好的DSL,请参阅converge

答案 25 :(得分:1)

不要将Ruby编程语言与Ruby实现混合在一起,认为在Ruby中不可能使用POSIX线程。

如果你原谅双关语,你可以简单地使用pthread支持和this was already possible at the time this thread was created进行编译。

这个问题的答案很简单。如果你喜欢lisp,你可能更喜欢红宝石。或者,无论你喜欢什么。

答案 26 :(得分:1)

我建议你选择Ruby。

当我第一次开始学习时,我发现它很容易上手。

答案 27 :(得分:0)

使用JS,只需在我的github http://github.com/visionmedia查看AJS(替代JavaScript语法),它会给你一些看起来更干净的闭包等:D

答案 28 :(得分:0)

关于你的要点(元编程): Groovy的1.6版本内置AST(抽象语法树)编程作为标准和集成功能。 Ruby有RubyParser,但它是一个附加组件。

答案 29 :(得分:0)

我推荐Haskell。对于“重要”标准1(除非你包括模板Haskell)或3(Haskell是一种功能强大的语言,它并不是很有竞争力,尽管如果你想要在Haskell中强制编码实际上是多么容易,你会感到惊讶至)。不过,你肯定会喜欢Haskell的头等功能。

Haskell是“重要”标准2和4的坚实选择。特别是#4:“一种有趣的语言实际上影响了人们对编程的看法。”任何学过大量Haskell的人都可以证明自己有能力扩展自己的思维。

答案 30 :(得分:0)

我建议您试用这两种语言并选择一款吸引您的语言。 Python和Ruby都可以做你想做的事。

另请阅读this thread