我目前正在努力学习Nim(它进展缓慢 - 不能投入太多时间)。另一方面,为了获得一些正常工作的代码,我想将我正在研究的Nim应用程序的部分原型化为ruby。
由于mruby允许在C app中嵌入ruby子集,并且由于nim允许将任意C代码编译为函数,因此感觉这应该相对简单。有人这样做过吗?
我特别想找到使用Nim的时髦宏功能来突破内联ruby代码的方法。我将尝试自己,但我认为有人必须尝试它和/或提出比我目前的学习状态更优雅的解决方案:)
答案 0 :(得分:3)
https://github.com/micklat/NimBorg
这是一个目标有些类似的项目。它目前以python和lua为目标,但使用相同的技术与Ruby接口不应该太难。
Nim中有一些功能可以帮助您以流利的方式与外语交流:
1)使用Nim' dot operators
从Nim调用Ruby这些有点像Ruby中的method_missing
。
您可以在Nim中定义类似RubyValue
的类型,它将具有点运算符,可将任何表达式(如foo.bar
或foo.bar(baz)
转换为适当的Ruby方法调用。参数可以传递给像toRubyValue
这样的泛型函数,可以为各种Nim和C类型重载,以自动将它们转换为正确的Ruby类型。
2)从Ruby调用Nim
在大多数脚本语言中,有一种方法可以注册外部类型,通常在每个导出类型必须填充一次的特定数据结构中描述。您可以使用一些通用编程和Nim的.global.
变量来自动创建和缓存通过点运算符传递给Ruby的每种类型所需的数据结构。会有一个像getRubyTypeDesc(T: typedesc)
这样的通用过程可能依赖于typeinfo
,typetraits
或用户提供的一些重载过程,定义了必须为该类型导出的内容。
现在,如果你真的想依赖mruby(因为你有经验),你可以考虑使用.emit. pragma直接输出mruby代码。然后,您可以向Nim编译器询问generate only source code,您将在第二步编译,或者您只需更改编译器可执行文件,Nim将在编译项目时调用(这在上面链接的相同部分中进行了解释)