在nim应用程序中是否可以/容易包含一些mruby?

时间:2015-12-16 19:57:04

标签: nim mruby

我目前正在努力学习Nim(它进展缓慢 - 不能投入太多时间)。另一方面,为了获得一些正常工作的代码,我想将我正在研究的Nim应用程序的部分原型化为ruby。

由于mruby允许在C app中嵌入ruby子集,并且由于nim允许将任意C代码编译为函数,因此感觉这应该相对简单。有人这样做过吗?

我特别想找到使用Nim的时髦宏功能来突破内联ruby代码的方法。我将尝试自己,但我认为有人必须尝试它和/或提出比我目前的学习状态更优雅的解决方案:)

1 个答案:

答案 0 :(得分:3)

https://github.com/micklat/NimBorg

这是一个目标有些类似的项目。它目前以python和lua为目标,但使用相同的技术与Ruby接口不应该太难。

Nim中有一些功能可以帮助您以流利的方式与外语交流:

1)使用Nim' dot operators

从Nim调用Ruby

这些有点像Ruby中的method_missing。 您可以在Nim中定义类似RubyValue的类型,它将具有点运算符,可将任何表达式(如foo.barfoo.bar(baz)转换为适当的Ruby方法调用。参数可以传递给像toRubyValue这样的泛型函数,可以为各种Nim和C类型重载,以自动将它们转换为正确的Ruby类型。

2)从Ruby调用Nim

在大多数脚本语言中,有一种方法可以注册外部类型,通常在每个导出类型必须填充一次的特定数据结构中描述。您可以使用一些通用编程和Nim的.global.变量来自动创建和缓存通过点运算符传递给Ruby的每种类型所需的数据结构。会有一个像getRubyTypeDesc(T: typedesc)这样的通用过程可能依赖于typeinfotypetraits或用户提供的一些重载过程,定义了必须为该类型导出的内容。

现在,如果你真的想依赖mruby(因为你有经验),你可以考虑使用.emit. pragma直接输出mruby代码。然后,您可以向Nim编译器询问generate only source code,您将在第二步编译,或者您只需更改编译器可执行文件,Nim将在编译项目时调用(这在上面链接的相同部分中进行了解释)