您在Scala中缺少的动态语言(如Ruby或Clojure)的功能有哪些?

Ale*_*xey 13 ruby language-features scala dynamic-languages clojure

你在实践中失去了什么,当你选择一个静态类型语言,如Scala的(或F#,哈斯克尔,C#),而不是动态类型的人,比如Ruby,Python和Clojure中,Groovy中(其中有宏或运行时元编程能力)?请考虑最好的静态类型语言和最好的(在您看来)动态类型语言,而不是最差的语言.

答案摘要:

与像Scala IMHO这样的静态类型语言相比,像Ruby这样的动态语言的主要优点是:

  • 快速编辑 - 运行周期(JavaRebel是否缩小了差距?)
  • 目前Scala/Lift社区比Ruby/Rails或Python/Django小得多
  • 可以修改类型定义(虽然动机或需要不明确)

Rex*_*err 9

原则上,当你不清楚(在静态环境中)正确的事情是什么时,你放弃了能够忽略你正在使用的类型,而这就是它.

由于复杂的类型检查可能相当耗时,因此您可能也不得不放弃快速的在线元编程.

在实践中,使用Scala,你几乎没有放弃任何东西 - 而且我并不特别关心.您不能注入新方法,但可以编译并运行新代码.你必须在函数参数中指定类型(以及带递归函数的返回类型),如果你自己从不犯类型错误,这有点烦人.由于它编译每个命令,Scala REPL并不像Python shell那样活泼.而且由于它使用了Java反射机制,因此您无需使用Python进行在线检查(无论如何都不需要构建自己的检查库).


Mar*_*tos 3

  1. 动态语言往往具有更灵活的类型系统。例如,Python 允许您将新方法注入到现有的类中,甚至注入到单个对象中。
  2. 许多(不是全部)静态语言缺乏构造复杂文字的功能。例如,像 C# 和 Java 这样的语言无法轻易模仿以下 JavaScript { 'request':{'type':'GET', 'path':mypath}, 'oncomplete':function(response) { alert(response.result) } }
  3. 动态语言具有非常流畅的语义。Python 允许导入语句、函数定义和类定义出现在函数和if语句内。
  4. eval是大多数动态语言和少数静态语言的主要内容。
  5. 由于必须完全指定函数参数类型的尴尬,动态语言中的高阶编程比静态语言更容易(以我的主观观点)。
    • 对于递归 HOP 结构尤其如此,其中类型系统确实会造成阻碍。
  6. 动态语言用户不必处理协变和逆变。
  7. 动态语言中的通用编程实际上是免费的。

  • 我认为我从未处理过 Haskell 中的协变和逆变。我也没有指定函数参数的类型。2、5、6 和 7 是动态语言相对于 *wimpy* 静态语言的优势。许多静态语言都提供这些功能。 (4认同)
  • Marcelo,你真的了解问题所涉及的 Scala 吗?那里只有 (1) 和 (4) 大部分是正确的;(6) 和 (7) 可以以任何一种方式争论(“我喜欢它很简单”与“太容易在运行时搬起石头砸自己的脚”)。(2) 和 (3) 对于 Scala 来说比大多数动态语言更正确! (3认同)
  • 感谢大家的评论。我将仅提出一些观察结果。1)问题不仅仅与 Scala 有关,而且与一般的静态语言有关;2)我同意并非所有静态语言都具有相同的特征(我在某种程度上进行了概括,对于这样的问题这是不可避免的);3)我并不是想支持动态语言——问题是静态语言会失去什么,而不是它们有什么坏处(例如,我并不是说方法注入是一件好事,只是这是静态语言中通常无法获得的东西)。 (2认同)