10

前の質問からの提案のおかげで、IronPython、IronRuby、および Boo を試して C# アプリ用の DSL を作成するのに忙しくしています。ステップ 1 は、ユーザーとナレッジ ベースが大きいため、IronPython です。ここでうまく機能することができれば、やめることができます。

これが私の問題です:

IronPython スクリプトが Lib というクラスの関数にアクセスできるようにしたいと考えています。これで、アセンブリを IronPython ランタイムに追加し、作成したスコープでステートメントを実行してクラスをインポートできます。

// load 'ScriptLib' assembly
Assembly libraryAssembly = Assembly.LoadFile(libraryPath);
_runtime.LoadAssembly(libraryAssembly);

// import 'Lib' class from 'ScriptLib'
ScriptSource imports = _engine.CreateScriptSourceFromString("from ScriptLib import Lib", SourceCodeKind.Statements);
imports.Execute(_scope);

// run .py script:
ScriptSource script = _engine.CreateScriptSourceFromFile(scriptPath);
script.Execute(_scope);

Hello world スタイルのステートメントである Lib::PrintHello を実行する場合、Python スクリプトには次のものが含まれます。

Lib.PrintHello()

または(静的でない場合):

library = new Lib()
library.PrintHello()

次のように、Python スクリプトに基本的なステートメントだけを含めることができるように、環境を変更するにはどうすればよいですか。

PrintHello
TurnOnPower
VerifyFrequency
TurnOffPower
etc...

これらのスクリプトは、プログラマーでなくても簡単に記述できるようにしたいと考えています。クラスとは何か、どのように機能するかを彼らに知られたくありません。IronPython はまさにそこにあるので、for、do、if などのいくつかの基本的な操作と、基本的な関数定義では、DSL 用のコンパイラを作成する必要がありません。

4

1 に答える 1

20

次のようなことができるはずです。

var objOps = _engine.Operations;
var lib = new Lib();

foreach (string memberName in objOps.GetMemberNames(lib)) {
    _scope.SetVariable(memberName, objOps.GetMember(lib, memberName));
}

これにより、lib オブジェクトからすべてのメンバーが取得され、ScriptScope に挿入されます。これは Python ObjectOperations クラスで行われるため、降りるメンバーは Python メンバーになります。したがって、IronRuby で同様のことを行うと、基本的に同じコードが機能するはずです。

于 2009-08-29T00:51:11.653 に答える