使用Python与Ruby进行元编程
我目前主要是D程序员,并且正在向我的工具箱中添加另一种语言,最好是一种支持元编程编程语言的工具,而这种编程语言不能像D这样的静态编译语言来完成。
我已经阅读了一些有关Lisp的内容,我很想找到一种语言,该语言可以实现Lisp的一些出色功能,但是没有Lisp的奇怪语法等。我不想发动一场语言大战,并且我确定Ruby和Python都有它们的取舍,所以我将列出对我个人重要的内容。请告诉我Ruby,Python或者其他语言对我来说是否最合适。
重要的:
- 良好的元编程。能够在运行时创建类,方法,函数等。最好,代码和数据之间最小的区别,Lisp样式。
- 优美,干净,理智的语法和一致,直观的语义。基本上是一种经过深思熟虑,易于使用的现代语言。
- 多种范例。没有一个范例适合每个项目,甚至一个项目中的每个小子问题。
- 一种有趣的语言,实际上会影响人们对编程的思考方式。
有一些重要:
- 表现。如果性能不错,那会很好,但是当性能是真正的优先事项时,我将改用D。
- 有据可查。
不重要:
- 社区规模,图书馆可用性等。这些都不是语言本身的特征,并且所有内容都可以快速改变。
- 职位空缺。我不是专职的程序员。我是一名研究生,编程与我的研究有切向的关系。
- 最初设计的任何功能都需要考虑到由百万猴子编写的大型项目。
解决方案
我建议我们尝试两种语言,然后选择一种对我们有吸引力的语言。 Python和Ruby都可以做我们想要的。
另请阅读此线程。
免责声明:我只涉猎任何一种语言,但是我至少都编写了小型的工作程序(不仅仅是快速脚本,为此我使用Perl,bash或者GNU make)。
对于"多种范例"第3点,Ruby可能真的很不错,因为它努力使创建特定于领域的语言变得容易。例如,在线浏览并查看Ruby on Rails代码的一些位和Rake代码的位。它们都是Ruby,我们可以看到相似之处,但是它们看起来并不像我们通常认为的相同语言。
在我看来,Python似乎更具可预测性(可能与"干净"和"理智"的第2点相关),但是我真的不知道这是因为语言本身还是仅仅因为它被具有不同价值观的人所使用。我从未尝试过使用Python进行深度魔术。我当然会说两种语言都经过深思熟虑。
两者在1和4中的得分都很高。[编辑:实际上1相当有争议,这在解释语言中很常见,但两者在概念上并不一样。我们可以定义闭包,为对象分配方法等等。不知道这是否达到了我们想要的程度。]
我个人觉得Ruby更有趣,但这部分是因为更容易将注意力转移到一些有趣的做事方式上。实际上,我更多地使用了Python。有时我们不想要凉爽的东西,想要继续下去,这样就可以在睡前完成...
它们都不难进入,因此我们可以决定一个完成下一个较小的任务,另一个完成另一个。或者从图书馆中挑选每本的入门书,略读它们,看看有什么吸引我们。
I've read up on Lisp a little and I would love to find a language that allows some of the cool stuff that Lisp does, but without the strange syntax, etc. of Lisp.
难道我们都不会。
minimal distinction between code and data, Lisp style
可悲的是,代码和数据之间的最小区别和"奇怪的"语法是彼此的结果。
如果我们想使用易于理解的语法,则可以使用Python。但是,该代码未在任何常用的内置数据结构中表示。它失败了,因为大多数语言都在"重要"列表中列出了项目#1. 这使得很难提供有用的帮助。
你不能拥有全部。请记住,我们并不是第一个有此想法的人。如果存在我们理想语言之类的东西,我们都会使用它。由于现实世界达不到理想,因此我们必须重新确定愿望清单的优先级。必须重新布置"重要"部分,以标识对我们而言真正重要的部分。
至少在意识形态方面,python和ruby之间并没有太大的区别。在大多数情况下,它们只是同一事物的不同口味。因此,我建议我们看看哪一种更符合编程风格。
分离Python和Ruby并没有太多的区别。我想说Python社区比Ruby社区更大,更成熟,这对我来说真的很重要。 Ruby是一种更灵活的语言,具有积极和消极的影响。但是,我敢肯定会有很多人详细介绍这两种语言,因此我将提出第三个选择。 JavaScript呢?
JavaScript最初被设计为Web的Scheme,它是基于原型的,在涉及多范式和元编程方面,它比Python和Ruby更具优势。语法不如其他两种语法好,但它可能是现有使用最广泛的语言,并且性能每天都在提高。
如果我们喜欢Lisp样式的"代码即数据"概念,但是不喜欢Lispy语法,那么Prolog可能是一个不错的选择。
不管这是否符合"有趣的使用方式,现代语言",我将由他人来评判。 ;-)
我已经很少使用Python,但更多使用了Ruby。但是我认为它们都可以提供我们所要求的。
如果我看到所有四点,那么我们至少可以检查一下:
http://www.iolanguage.com/
莫扎特/奥兹州也可能对我们很有趣:
http://mozart.github.io/
问候
弗里德里希
我正在将Python用于许多项目,并且我认为Python确实提供了我们要求的所有功能。
重要的:
- 元编程:Python支持元类和运行时类/方法生成等
- 语法:多数民众赞成在某种程度上是主观的。我喜欢Python语法的简单性,但是有些人抱怨Python对空格敏感。
- 范例:Python支持过程式,面向对象和基本的函数式编程。
- 我认为Python具有非常实用的面向风格,这对我来说非常鼓舞人心。
有一些重要:
- 性能:它是一种脚本语言。但是为Python编写C扩展是一种常见的优化实践。
- 说明文件:我不能抱怨。它不像人们从Java中了解的那么详细,但是它足够好。
当我们是研究生时,我们可能想阅读这篇声称Python是科学家所需要的文件。
不幸的是,我无法将Python与Ruby进行比较,因为我从未使用过该语言。
问候,
丹尼斯
4个"重要"要点准确地指向Ruby,而2个"有些重要"要点由Python统治。随它吧。
我们考虑过Smalltalk吗?它提供了具有反射性和自省功能的非常简单,清晰和可扩展的语法,并充分利用了这些功能。例如,看看Squeak Smalltalk中正在做的一些工作。许多使用Squeak的研究人员都在Squeak邮件列表和#node上的freenode上闲逛,因此我们可以很轻松地获得复杂问题的帮助。
当前相关性的其他指标:它可以在我们要命名的任何平台上运行(包括iPhone);吉拉德·布拉恰(Gilad Bracha)将他在Newspeak的工作建立在Squeak的基础上。 V8团队在Smalltalk VM上刻骨铭心;丹·英加尔斯(Dan Ingalls)和兰达·施瓦兹(Randal Schwartz)在旷野生活了数年后,最近又回到Smalltalk工作。
祝我们好运,最后让我们知道决定。
对于python样式的语法和类lisp的宏(宏是真实的代码)和良好的DSL,请参见收敛。
在探索了Python,Smalltalk和Ruby之后,我选择了Ruby。
我们正在描述Ruby。
Good metaprogramming. Ability to create classes, methods, functions, etc. at runtime. Preferably, minimal distinction between code and data, Lisp style.
在运行时扩展和修改现有原语非常容易。在ruby中,一切都是对象,字符串,整数甚至函数。
我们还可以构造语法糖的快捷方式,例如,使用class_eval。
Nice, clean, sane syntax and consistent, intuitive semantics. Basically a well thought-out, fun to use, modern language.
Ruby遵循较少惊喜的原则,当将Ruby代码与其他语言中的等效代码进行比较时,许多人认为它更"美丽"。
Multiple paradigms. No one paradigm is right for every project, or even every small subproblem within a project.
我们可以遵循命令式,面向对象,功能性和反射性。
An interesting language that actually affects the way one thinks about programming.
这是非常主观的,但是从我的角度来看,同时使用多种范例的能力提出了非常有趣的想法。
我已经尝试过Python,但它不适合要点。
我不确定Python是否会满足所有需求(尤其是关于代码和数据之间最小区别的观点),但是有一个论点支持python。那里有一个项目,使我们可以轻松地在D中为python扩展编程,因此我们可以两全其美。 http://pyd.dsource.org/celerid.html
Lisp满足我们所有的标准,包括性能,并且它是唯一一种不具有(奇怪的)语法的语言。如果我们在如此令人震惊的错误信息/错误观念的基础上避开了它,因此错过了使用例如Emacs + SLIME + CL,我们将对自己造成极大的伤害。
OCaml呢?
OCaml的功能:静态类型系统,类型推断,参数多态性,尾部递归,模式匹配,一流的词法闭包,函子(参数模块),异常处理和增量生成的自动垃圾收集。
我认为它满足以下条件:
Important: Nice, clean, sane syntax and consistent, intuitive semantics. Basically a well thought-out, fun to use, modern language. Multiple paradigms. No one paradigm is right for every project, or even every small subproblem within a project. An interesting language that actually affects the way one thinks about programming. Somewhat important: Performance. It would be nice if performance was decent, but when performance is a real priority, I'll use D instead. Well-documented.
好吧,如果我们不喜欢lisp语法,那么汇编程序也许是理想选择。 :-)
它无疑在代码和数据之间具有最小的区别,是多范式的(或者也许是无范式的),并且在学习和技巧上都是不断扩展(如果很乏味)的经验。
艾欧(Io)满足我们所有的"重要"要点。我认为目前还没有更好的语言来进行疯狂的元黑客。
如果我们喜欢玫瑰,就必须学会与荆棘一起生活:)
比较使用不同语言(以反向字母顺序排列)执行相同操作的代码示例(与" 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")
o
myList collect(description) select(!="") join("\n")
这是一个Io指南。
与JS一起使用,只需在我的github http://github.com/visionmedia上查看AJS(替代JavaScript语法),它会为我们提供一些更简洁的闭包等:D
关于要点(元编程):
Groovy的1.6版具有内置的AST(抽象语法树)编程作为标准和集成功能。
Ruby具有RubyParser,但这是一个添加组件。
one that supports the metaprogramming hacks that just can't be done in a statically compiled language I would love to find a language that allows some of the cool stuff that Lisp does
Lisp可以编译。
在成为"主流"方面,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)。它有些旧,但很经典(可免费下载)。
坦白地说,就元编程功能而言,Ruby和Python比其支持者所承认的要相似得多。这两种语言的评论提供了很好的比较/评论:
- http://regebro.wordpress.com/2009/07/12/python-vs-ruby/
因此,只需根据一些条件选择一个即可。也许我们喜欢Rails并想学习该代码。也许SciPy是事。查看图书馆,社区等的生态系统,然后选择其中一个。当然,我们不会因选择其中任何一个而失去一些元编程的必杀技。
我们尝试过Rebol吗?
不要以为POSIX线程在ruby中是不可能的,所以不要将Ruby编程语言与Ruby实现混在一起。
我们可以简单地使用pthread支持进行编译,如果我们对双关语宽恕,那么在创建此线程时就已经可以做到这一点。
这个问题的答案很简单。如果我们喜欢Lisp,可能会更喜欢红宝石。或者,无论我们喜欢什么。