Ruby Rubinius 正在成为 Ruby 的方言

mizuhashi · 发布于 2017年1月11日 · 最后由 rennyallen 回复于 2017年1月11日 · 756 次阅读
23529

https://medium.com/@rubinius/rubinius-takes-the-fun-out-of-ruby-21db64ce87a6

Rubinius不再自称Ruby已经有一段时间了,不过官网上也看不太出他们到底想干什么,刚刚去看了他们的博客,才知道他们打算把Rubinius做成Ruby的扩展。

例如这篇博文提到,为Ruby添加了函数,类型和模式匹配语法:


# Note the block syntax to get around not being
# able to make 'data' a keyword.
data str do
  # ...
end

data int do
  # ...
end

data color do
  # ...
end

# The types above would be defined at the system level
# and available for import as desired.

data MyModel do
  field :name, str
  field :age, int
  field :color, color

  # Return type is specified by annotations.
  type bool
  fun compare_age(a: int, b: int)
    a <=> b
  end
end

文中提到Object Oriented面向组件的交互,而Functional面向数据操作,OO和FP是对立的,但是可以各取所需。也就是在实际的工程中,应该依据不同的需求选用不同的范式,而不是分成两个派系相互对立。

而作者本人花了八年尝试说服Ruby团队接受这些新的设计,依旧没有结果,只好自己来做了这个"additions to Ruby"。

Rubinius还设计了一个defm关键字,可以用来简化case when:

class Array
  defm [](index)
    # return element at index or nil
  end

  defm [](index, num)
    # return num elements starting at index
  end

  defm [](index: Integer())
    # convert index to an Integer if it's not already
  end

  defm [](range: Range())
    # convert range to a Range if it's not already
  end
end

这个大概就是[]的实际定义,index: Integer()意味着匹配可以被转换为Integer的对象。

其实做方言还是不错的,只能希望未来和Ruby本身不会有太多冲突,因为Ruby目前没有靠谱的LLVM前端,如果Rubinius不做了,wasm平台可能就看不到Ruby的身影了。

我个人认为模式匹配不是真的那么重要,只是些锦上添花的东西,其实用dsl写也没差....Ruby倒是挺需要一个import/export,来解决常量作用域的问题..

共收到 1 条回复
26688
rennyallen · #1 · 2017年1月11日

Over time, Rubinius has changed from using C to using C++, changed the way primitives are implemented, rewritten the bytecode compiler, changed the bytecode interpreter execution model from stackless to using the C stack, changed the way exceptions are handled, added a custom JIT compiler, and replaced that with an LLVM-based one–just to name a few things.

感觉Rubinius一直在努力改变,希望最终能成为一门地道的方言,与Ruby能够互补,没有冲突各有用途~

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册