3

私は現在 Nim を学ぼうとしています (それはゆっくりと進んでいます - それに多くの時間を費やすことはできません)。一方で、動作するコードを取得するために、Ruby で作業している Nim アプリのセクションのプロトタイプを作成したいと考えています。

mruby では Ruby サブセットを C アプリに埋め込むことができ、nim では任意の C コードを関数にコンパイルできるため、これは比較的簡単なはずです。誰もこれをやったことがありますか?

私は特に、Nim のファンキーなマクロ機能を使用して、インライン Ruby コードに分割する方法を探しています。私は自分自身を試してみますが、誰かがそれを試した、および/または現在の学習状態でできるよりも洗練された解決策を考え出すにちがいないと思います:)

4

2 に答える 2

3

https://github.com/micklat/NimBorg

これは、やや似たような目標を持つプロジェクトです。現時点では python と lua を対象としていますが、Ruby とのインターフェイスに同じ手法を使用することはそれほど難しいことではありません。

Nim には、流暢な方法で外国語とやり取りするのに役立ついくつかの機能があります。

1) Nim のドット演算子を使用して Nim から Ruby を呼び出す

method_missingこれらはRubyと少し似ています。RubyValueNim のような型を定義できます。これには、foo.barまたはfoo.bar(baz)適切な Ruby メソッド呼び出しのような式を変換するドット演算子があります。引数は、さまざまな Nim および C 型に対してオーバーロードできるような汎用関数に渡してtoRubyValue、適切な Ruby 型に自動的に変換できます。

2) Ruby から Nim を呼び出す

ほとんどのスクリプト言語では、外部の型を登録する方法があります。これは、多くの場合、エクスポートされた型ごとに 1 回入力する必要がある特定のデータ構造で記述されます。少しの汎用プログラミングと Nim の.global.変数を使用して、ドット演算子を介して Ruby に渡された型ごとに必要なデータ構造を自動的に作成してキャッシュすることができます。getRubyTypeDesc(T: typedesc)に依存する可能性のある一般的な procやtypeinfotypetraitsユーザーが提供するオーバーロードされた proc があり、その型に対してエクスポートする必要があるものを定義します。

ここで、mruby に本当に依存したい場合 (たとえば、経験があるなどの理由で) 、.emit の使用を検討できます。mruby コードの断片を直接出力するプラグマ。その後、Nim コンパイラにソース コードのみを生成するように依頼することができます。ソース コードは 2 番目のステップでコンパイルします。または、Nim がプロジェクトのコンパイル時に呼び出すコンパイラ実行可能ファイルを変更することもできます (これについては、上記のリンク先の同じセクションで説明されています)。

于 2015-12-17T12:14:59.487 に答える