90

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

我已经阅读了一点 Lisp,我很想找到一种语言,它允许 Lisp 所做的一些很酷的事情,但没有 Lisp 的奇怪语法等。我不想引发一场语言之战,而且我确信 Ruby 和 Python 都有各自的取舍,所以我将列出对我个人而言重要的内容。请告诉我 Ruby、Python 或其他语言是否最适合我。

重要的:

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

有一些重要:

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

不重要:

  1. 社区规模、图书馆可用性等。这些都不是语言本身的特征,而且都可以很快改变。
  2. 工作可用性。我不是一个全职的专业程序员。我是一名研究生,编程与我的研究密切相关。
  3. 任何主要设计用于由一百万个代码猴子处理的大型项目的功能。
4

31 回答 31

69

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

难道我们都不会。

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

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

如果您想要易于阅读的语法,那么您有 Python。但是,代码没有以任何常用的内置数据结构表示。它失败了——就像大多数语言一样——在你的“重要”列表的第 1 项中。这使得提供有用的帮助变得困难。

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

于 2008-09-28T00:11:51.917 回答
17

老实说,就元编程工具而言,Ruby 和 Python 比它们的一些追随者愿意承认的要相似得多。这两种语言的评论提供了一个很好的比较/评论:

因此,只需根据一些标准选择一个。也许您喜欢 Rails 并想研究该代码。也许 SciPy 是你的菜。查看图书馆、社区等的生态系统,然后选择一个。根据您的选择,您当然不会错过一些元编程必杀技。

于 2009-07-30T07:48:57.373 回答
16

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

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

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

两者都在 1 和 4 中得分很高。 [编辑:实际上 1 是很有争议的——两者都有“eval”,这在解释语言中很常见,但它们在概念上几乎不是纯粹的。您可以定义闭包、将方法分配给对象等等。不知道这是否如你所愿。]

就我个人而言,我发现 Ruby 更有趣,但部分原因是更容易分心思考做事的酷方法。我实际上更多地使用了 Python。有时你不想要酷,你想继续它,所以它在睡前完成......

它们都不难进入,所以你可以决定在一个中完成你的下一个小任务,然后在另一个中完成之后的一个。或者从图书馆拿起一本介绍性书籍,略读一下,看看有什么吸引你。

于 2008-09-27T23:35:19.743 回答
15

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

于 2008-09-28T00:31:09.827 回答
15

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

它当前相关性的其他指标:它可以在您愿意命名的任何平台上运行(包括iPhone);Gilad Bracha 的新话作品基于 Squeak;V8 团队在Smalltalk 虚拟机上崭露头角;Dan Ingalls 和 Randal Schwartz 在旷野多年后,最近回到了 Smalltalk 的工作。

祝您搜索顺利 - 让我们知道您最终的决定。

于 2008-09-28T08:54:17.527 回答
14

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

于 2008-09-29T21:34:03.980 回答
11

您的 4 个“重要”点完全指向 Ruby,而 2 个“有些重要”点由 Python 统治。随它吧。

于 2008-09-28T08:36:39.520 回答
11

您正在描述 Ruby。

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

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

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

  • 漂亮、干净、健全的语法和一致、直观的语义。基本上是一种经过深思熟虑、使用起来很有趣的现代语言。

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

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

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

  • 一种有趣的语言,它实际上会影响人们对编程的看法。

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

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

于 2008-09-29T00:42:39.853 回答
8

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

红宝石

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

或者

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

蟒蛇

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

或者

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

珀尔

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")

艾欧

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

这是Io 指南

于 2008-12-28T08:58:21.850 回答
6

就“主流”而言,Ruby 会比 Lisp 更好(不管这到底意味着什么,但一个现实的问题是,如果你要这样做,那么在 Lisp 编程中找到问题的答案是多么容易。)无论如何,我发现 Ruby 很容易上手。在我第一次学习 Python(或其他语言)所花费的相同时间里,我很快就比以往任何时候都更有效地编写了更好的代码。不过,这只是一个人的意见;我猜是加一粒盐。在这一点上,我对 Ruby 的了解比我对 Python 或 Lisp 的了解要多得多,但你应该知道,在我转行之前,我已经有一段时间是 Python 人了。

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

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

1) Pragmatic Programmers 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 )。它有点旧,但它是经典之作(可免费下载)。

于 2009-07-29T20:52:06.810 回答
6

@Jason 我分别不同意。有一些差异使得 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 中开花如此美丽吗?我由衷地怀疑!

于 2011-01-30T02:13:59.913 回答
5

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

重要的:

  1. 元编程:Python 支持元类和运行时类/方法生成等
  2. 语法:嗯,这有点主观。我喜欢 Python 的简单语法,但有些人抱怨 Python 对空格敏感。
  3. 范式:Python 支持过程式、面向对象和基本函数式编程。
  4. 我认为 Python 有一种非常实用的风格,这对我很有启发。

有一些重要:

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

作为研究生,您可能想阅读这篇声称Python 是科学家所需要的全部内容的论文。不幸的是,我无法将 Python 与 Ruby 进行比较,因为我从未使用过那种语言。

问候,丹尼斯

于 2008-09-28T08:27:12.333 回答
4

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

它当然在代码和数据之间的区别很小,是多范式(或者可能是无范式),并且在学习和你可以做的技巧方面,它是一种思维扩展(如果乏味)的体验。

于 2008-10-02T16:05:07.893 回答
4

Io 满足您所有的“重要”点。我认为没有更好的语言来进行疯狂的元黑客攻击。

于 2008-10-15T21:09:45.283 回答
3

一种支持静态编译语言无法完成的元编程技巧

我很想找到一种语言,它允许Lisp所做的一些很酷的事情

Lisp 可以编译。

于 2009-07-29T20:15:59.750 回答
3

你试过 Rebol 吗?

于 2009-09-28T22:08:47.423 回答
3

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

于 2012-02-02T23:45:44.840 回答
2

将 Python 和 Ruby 分开并没有太多需要注意的地方。我想说 Python 社区比 Ruby 社区更大、更成熟,这对我来说真的很重要。Ruby 是一种更灵活的语言,它有正面和负面的影响。但是,我敢肯定会有很多人详细介绍这两种语言,所以我会提出第三个选项。JavaScript 怎么样?

JavaScript 最初是为 web 设计的,它是基于原型的,就多范式和元编程而言,这比 Python 和 Ruby 更有优势。语法不如其他两个好,但它可能是现有最广泛部署的语言,并且性能每天都在变得更好。

于 2008-09-28T03:38:38.363 回答
2

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

这是否符合“使用乐趣,现代语言”的资格,我将留给其他人来判断。;-)

于 2008-09-28T06:43:45.017 回答
2

我使用 Python 非常多,但更多的是 Ruby。但是,我认为它们都提供了您所要求的。

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

Mozart/Oz 对你来说可能也很有趣:http: //mozart.github.io/

问候弗里德里希

于 2008-09-28T08:07:03.553 回答
2

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

于 2008-09-28T13:29:25.977 回答
2

OCaml 呢?

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

我认为它满足以下条件:

重要的:

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

有一些重要:

  1. 表现。如果性能不错,那就太好了,但是当性能是真正的优先事项时,我将使用 D 代替。
  2. 有据可查。
于 2008-10-01T19:07:13.567 回答
1

对于 python 样式的语法和类似 lisp 的宏(是真实代码的宏)和良好的 DSL,请参阅收敛

于 2008-09-28T11:42:21.117 回答
1

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

于 2008-09-29T06:10:31.967 回答
1

如果你爱玫瑰,你必须学会​​忍受荆棘:)

于 2008-12-27T23:07:20.437 回答
1

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

您可以简单地使用 pthread 支持进行编译,如果您原谅双关语,那么在创建此线程时这已经是可能的。

这个问题的答案很简单。如果你喜欢 lisp,你可能会更喜欢 ruby​​。或者,随便你。

于 2010-12-17T21:36:55.927 回答
1

我建议您使用 Ruby。

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

于 2011-06-20T01:15:06.427 回答
0

我建议您尝试两种语言并选择一种吸引您的语言。Python 和 Ruby 都可以为所欲为。

另请阅读此线程

于 2008-09-27T23:04:12.953 回答
0

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

于 2009-05-11T23:42:49.420 回答
0

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

于 2009-07-29T19:59:42.987 回答
0

我推荐哈斯克尔。它不是“重要”标准 1(除非您包含 Template Haskell)或 3(Haskell 是一种坚定的函数式语言,但您会惊讶地发现,如果您愿意,在 Haskell 中进行命令式编码实际上是多么容易到)。不过,您肯定会喜欢 Haskell 的一流功能。

Haskell 是“重要”标准 2 和 4 的可靠选择。尤其是 #4:“一种有趣的语言,实际上会影响人们对编程的看法。” 任何学习过大量 Haskell 的人都可以证明它能够扩展你的思维。

于 2011-06-10T06:37:47.337 回答