使用Python与Ruby进行元编程[关闭]


90

我目前主要是D程序员,并且正在向我的工具箱中添加另一种语言,最好是一种支持元编程编程语言的工具,而这种编程语言只能用像D这样的静态编译语言来完成。

我已经阅读了一些有关Lisp的内容,我很想找到一种语言,该语言可以实现Lisp的一些出色功能,但是没有Lisp的奇怪语法等。我不想发动一场语言大战,并且我确定Ruby和Python都有它们的取舍,所以我将列出对我个人重要的内容。请告诉我Ruby,Python或其他语言对我来说是否最合适。

重要:

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

有一些重要:

  1. 性能。如果性能不错,那就太好了,但是当性能是真正的优先事项时,我将改用D。
  2. 有据可查。

不重要:

  1. 社区的规模,图书馆的可用性等。这些都不是语言本身的特征,并且所有这些都可以很快改变。
  2. 职位空缺。我不是专职的程序员。我是一名研究生,编程与我的研究有切向的关系。
  3. 最初设计的任何功能都需要考虑到由一百万个代码猴子完成的大型项目。

1
+1对于一个普遍问好的问题。
三联画

可悲的是,评分较高的答案基本上都说“取决于”,而评分较低的答案基本上是Python与Ruby的火焰之战。
丹·伯顿

您考虑过Clojure吗?
马克·托马斯

答案是朱莉娅!当时不存在:bit.ly/julia_meta ...很高兴!Julia涵盖了@dsimcha列出的所有重要点,以及性能,随着Julia的不断成熟,所有其他要点都变得真实。
SalchiPapa 2015年

Answers:


15

至少在意识形态方面,python和ruby之间并没有太大的区别。在大多数情况下,它们只是同一事物的不同口味。因此,我建议您看看哪种更适合您的编程风格。


30
最肯定是一样的。表面上看起来很相似,但是您实践了Ruby最强大的功能后就知道Python根本无法与之匹敌。例如,尝试用Ruby写DSL与编写一个Python或在运行时创建函数,方法,类等。在Ruby中更直接。
FelipeC 2010年

14
您需要执行元编程并不罕见,它已经完成。除了最琐碎的程序外,所有程序都具有重复模式,这些模式不属于通常的重构工具,但可以通过元编程轻松地消除。
韦恩·康拉德

10
Ruby和Python即使在控制其设计的想法上也有很大不同。他们希望使用Python,并且希望这是一种显而易见的处理方式。通常,这使得该语言不如Ruby富有表现力,但它使其更加一致。Ruby从Perl的方法中获得了更多收益,因为Perl的方法有很多。Ruby也使某些事情变得非常容易,并且实际上包含了私有成员的想法。另一方面,Python最多只会使某些事情变得更难执行,因此您必须更加明确(例如在类上添加或覆盖行为)。
肖恩·哥本哈根

5
您可能都应该在这两者中都做过速成课程,但是为了易于进行元编程,似乎Ruby更适合。我虽然没有太多经验,所以请带一点盐。
肖恩·哥本哈根

7
Ruby和Python 在宣扬“美丽的代码”这一点上相似。他们对那个美丽的东西(IMO很好)有完全不同的看法
Gabi Purcaru 2011年

69

我已经阅读了一些有关Lisp的内容,我很想找到一种语言,该语言可以实现Lisp的一些出色功能,但是没有Lisp的奇怪语法等。

难道我们都不会。

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

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

如果您想使用易于理解的语法,则可以使用Python。但是,该代码在任何常用的内置数据结构中表示。像大多数语言一样,它在“重要”列表的项目#1中失败。这使得很难提供有用的帮助。

你不能拥有全部。请记住,您并不是第一个有此想法的人。如果存在您理想语言之类的东西,我们都会使用它。由于现实世界达不到您的理想,因此您必须重新确定愿望清单的优先级。必须重新排列“重要”部分,以标识对您而言真正重要的部分。


3
我发现许多语言都以非Lispy语法实现类似Lisp的宏,而最终的结果是编写宏非常困难,因为没人自然知道代码所代表的数据结构,因此编写宏变得太难了而且没有人做。
2008年

11
人们发现Lisp难以阅读,因为他们不熟悉语法。我发现Lisp比C#更易读(但比Python难读)。
Jules

1
我在很大程度上同意这一点,但是我对Ruby和Lisp的经验表明,前者对于元编程同样有用,就像没有括号一样。TCL和JavaScript可能是其他接近的替代方案,但出于其他原因,我不赞成它们。
辛格

很久很久以前,有一种叫Dylan的语言应该就是这样。
弗里德里希

17

坦白地说,就元编程功能而言,Ruby和Python比其某些支持者所承认的要相似得多。这两种语言的评论提供了很好的比较/评论:

因此,只需根据一些条件选择一个即可。也许您喜欢Rails并想学习该代码。也许SciPy是您的事。查看图书馆,社区等的生态系统,然后选择其中一个。当然,您不会因选择其中一个而失去一些元编程的必杀技。


博客条目似乎与个人喜好更多有关(足够公平,但情人眼中的美丽),而不是元编程-这是OP的重点。
辛格

16

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

对于“多种范例”第3点,Ruby可能真的很不错,因为它努力使创建特定于域的语言变得容易。例如,在线浏览并查看Ruby on Rails代码的一些位和Rake代码的位。它们都是Ruby,您可以看到相似之处,但是它们看起来并不像您通常认为的相同语言。

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

两者在1和4中的得分都很好。您可以定义闭包,为对象分配方法等等。不知道这是否达到了您想要的程度。]

我个人觉得Ruby更有趣,但这部分是因为让人们分心思考一些有趣的做事方式变得容易了。实际上,我更多地使用了Python。有时您不想要凉爽的东西,想要继续下去,这样就可以在睡前完成...

它们都不难进入,因此您可以决定一个完成下一个较小的任务,另一个完成另一个。或从图书馆中挑选每本的入门书,略读它们,看看有什么吸引您。


15

您考虑过Smalltalk吗?它提供了具有反射性和自省功能的非常简单,清晰和可扩展的语法,并充分利用了这些功能。看看一些所做的工作存在的佳乐的Smalltalk的实例。许多使用Squeak的研究人员都在Squeak邮件列表和#node上的freenode上闲逛,因此您可以很轻松地获得复杂问题的帮助。

与其当前相关性的其他指标:它可以在您要命名的任何平台上运行(包括iPhone);吉拉德·布拉恰(Gilad Bracha)将他的Newspeak工作建立在Squeak的基础上;V8团队坚决反对Smalltalk VM ; 丹·英加尔斯(Dan Ingalls)和兰达·施瓦兹(Randal Schwartz)在旷野生活了数年后,最近又回到Smalltalk工作。

祝您搜索顺利-告诉我们您最终的决定。


14

Lisp满足您所有的标准,包括性能,并且它是唯一没有(奇怪)语法的语言。如果您在如此令人震惊的错误信息/错误观念的基础上避免使用它,因此错过了使用例如Emacs + SLIME + CL的经验,那将对自己造成极大的伤害。


4
或者,您可以尝试Clojure,我觉得非常不错。
pupeno

1
强烈同意。如果您想要Lisp的力量,那就快来潜入吧!习惯上很容易。他们没有大多数人认为的那么重要。
丹·伯顿

11

您的4个“重要”要点精确地指向Ruby,而2个“有些重要”要点由Python统治。就这样吧。


11

您正在描述Ruby。

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

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

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

  • 优美,干净,理智的语法和一致,直观的语义。基本上是一种经过深思熟虑,易于使用的现代语言。

Ruby遵循少惊喜原则,当将Ruby代码与其他语言中的等效代码进行比较时,许多人认为它更“美丽”。

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

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

  • 一种有趣的语言,实际上会影响人们对编程的思考方式。

这是非常主观的,但是从我的角度来看,同时使用多种范例的能力提出了非常有趣的想法。

我已经尝试过Python,但它不适合您的重点。


11
-1我正在使用Python,它非常适合,Python和Ruby之间的差异在于其他方面。歌迷般的喧闹声,你是。
gorsky 2010年

6
很多话,但不走。打算在Python中提供一个示例,以动态添加一个方法来说String类吗?
FelipeC

6
@john正是我的意思;这是非常复杂和丑陋的(更不用说不可能 String类)。Ruby中的OTOH非常简单:“ self.class.send(:define_method,:method_name){method_code}”
FelipeC 2010年

2
Ruby可能会尝试遵循PoLS,但我不会说这样。例如,lambda/ Proc.newSO在SO上被称为“令人惊讶的行为”和“高度违反直觉”。:-)任何像Ruby这样大而复杂的语言都必​​定会有如此令人困惑的领域。
肯(Ken)

2
这里@Token的猴子打补丁的例子String在Ruby的元编程目的:coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/...。子类化不会做;但是,将有一个简单的两参数函数。
P

8

比较使用不同语言(以反向字母顺序排列语言)执行相同操作(与列表中的项目的换行符非空描述)相同的代码示例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指南


3
(格式为nil“〜{~~
a〜

很好,但是这里的元编程在哪里?它似乎是一些略带功能的样式,与问题密切相关。
辛格

6

在成为“主流”方面,Ruby会比Lisp更好(无论这实际上意味着什么,但一个现实的问题是,如果您愿意,那么在Lisp编程中找到问题的答案将是多么容易。) ,我发现Ruby非常容易上手。在我第一次学习Python(或其他语言)的同时,我很快就比以前更有效地编写了更好的代码。不过,这只是一个人的意见。我猜要加一点盐。在这一点上,我对Ruby的了解比对Python或Lisp的了解要多得多,但是您应该知道,在我转换之前,我已经有一段时间了。

Lisp绝对很酷,值得研究。正如您所说,社区等的规模可能会迅速变化。话虽这么说,规模本身并不像社区的质量那么重要。例如,该#ruby-lang频道仍然充满了一些非常聪明的人。Lisp似乎也吸引了一些非常聪明的人。我没有太多关于Python社区的经验,因为我没有太多的第一手经验,但是有时候它似乎“太大了”。(我记得人们在他们的IRC频道上非常不礼貌,而且根据我从朋友那里真正了解Python的消息来看,这似乎是规则,而不是例外。)

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

1)实用程序员Ruby元编程系列(http://www.pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming)-不是免费的,但是后面的几集很有趣。(如果您要下载代码并查看要学习的内容,则该代码是免费的。)

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


5

我正在将Python用于许多项目,并且我认为Python确实提供了您所要求的所有功能。

重要:

  1. 元编程:Python支持元类和运行时类/方法生成等
  2. 语法:多数民众赞成在某种程度上是主观的。我喜欢Python语法的简单性,但是有些人抱怨Python对空格敏感。
  3. 范例:Python支持过程式,面向对象和基本的函数式编程。
  4. 我认为Python具有非常实用的面向风格,这对我来说非常鼓舞人心。

有一些重要:

  1. 性能:它是一种脚本语言。但是为Python编写C扩展是一种常见的优化实践。
  2. 文档:我不能抱怨。它不像人们从Java中了解的那么详细,但是它足够好。

当您是研究生时,您可能需要阅读这篇声称Python是科学家所需的文件。不幸的是,我无法将Python与Ruby进行比较,因为我从未使用过该语言。

问候,丹尼斯


3
Python不对空格敏感,它对缩进敏感。
jfs

5

@杰森我分别不同意。在元编程方面,有一些差异使得Ruby优于Python。对于初学者来说,Ruby可以通过Single Inheritance和Mixins正确继承继承。当涉及元编程时,您只需要了解一切都与自我有关。此处的典型区别是,在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中是如此美丽吗?我对此表示怀疑!


4

好吧,如果您不喜欢lisp语法,那么汇编程序可能是您的最佳选择。:-)

它无疑在代码和数据之间具有最小的区别,是多范式的(或者可能是无范式的),并且在学习和技巧上都是不断扩展的(如果很乏味的)经验。


我想我用汇编语言比其他任何语言都完成了更多的元编程。代码是数据,数据可以尝试成为代码。数据不是有符号的还是无符号的,它是由操作码决定的。
Nosredna

1
我有汇编代码,您可以声称是OO。它具有看起来像方法的东西-您称为依赖于“类”的东西。
justintime

4

艾欧满足您所有的“重要”要点。我认为没有一种更好的语言可以用于疯狂的元黑客。


谢谢,不知道。乍一看看起来很有趣,也许很多(())但无论如何。希望我能尽快找到时间。
flq

3

一个支持元编程黑客的工具,而这是用静态编译语言无法完成的

我很想找到一种语言,它可以让Lisp做一些很酷的事情

Lisp可以编译。



3

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


2

分离Python和Ruby的确没有很多。我想说Python社区比Ruby社区更大,更成熟,这对我来说真的很重要。Ruby是一种更加灵活的语言,具有积极和消极的影响。但是,我敢肯定会有很多人来详细介绍这两种语言,因此我将提出第三个选择。JavaScript怎么样?

JavaScript最初被设计为Web的Scheme,它基于原型,就多范式和元编程而言,它比Python和Ruby更具优势。该语法不如其他两种语法好,但它可能是现有使用最广泛的语言,并且性能每天都在提高。


2

如果您喜欢Lisp样式的“代码即数据”概念,但是不喜欢Lispy语法,那么Prolog可能是一个不错的选择。

不管这是否符合“有趣的使用方式,现代语言”,我将由他人来评判。;-)


2

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


2

OCaml呢?

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

我认为它满足以下条件:

重要:

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

有一些重要:

  1. 性能。如果性能不错,那就太好了,但是当性能是真正的优先事项时,我将改用D。
  2. 有据可查。

OCaml允许您在运行时创建类/方法吗?这是如何运作的?
贾森·克里顿

我刚读过有关OCaml的信息,也许它无法在运行时创建东西,所以我将其删除。
罗伯特·武科维奇(RobertVuković),2009年



1

我不确定Python是否会满足您的所有需求(尤其是关于代码和数据之间最小区别的观点),但是有一个论点支持python。那里有一个项目,使您可以轻松地在D中为python扩展编程,因此您可以两全其美。http://pyd.dsource.org/celerid.html



1

我建议您选择Ruby。

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


1

不要将Ruby编程语言与Ruby实现混为一谈,以为POSIX线程在ruby中是不可能的。

您可以简单地在pthread支持下进行编译,如果您对双关语宽恕,那么在创建此线程时就已经可以做到这一点

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




0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.