2009-08-28 13 views
9

Grazie ai suggerimenti di uno previous question, sono occupato a provare IronPython, IronRuby e Boo per creare un DSL per la mia app C#. Il primo passo è IronPython, grazie alla più ampia base di utenti e conoscenze. Se riesco a far funzionare bene qualcosa qui, posso semplicemente fermarmi.Simplfying DSL scritto per un'applicazione C# con IronPython

Ecco il mio problema:

voglio il mio script IronPython di avere accesso alle funzioni in una classe chiamata Lib. In questo momento posso aggiungere l'assembly al runtime IronPython e importare la classe eseguendo l'istruzione nel campo di applicazione ho creato:

// 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); 

se voglio correre Lib :: InserisciMioNome, che è solo una dichiarazione di stile ciao mondo , il mio script Python contiene:

Lib.PrintHello() 

o (se non è statico):

library = new Lib() 
library.PrintHello() 

Come posso cambiare il mio ambiente in modo che io posso solo avere statments di base nello script Python come Thi s:

PrintHello 
TurnOnPower 
VerifyFrequency 
TurnOffPower 
etc... 

voglio questi script per essere semplice per un non-programmatore di scrivere. Non voglio che debbano sapere che cos'è una classe o come funziona. IronPython è davvero lì solo così che alcune operazioni di base come for, do, if e una definizione di funzione di base non richiedono la scrittura di un compilatore per la mia DSL.

+0

Sembra ancora più brutto in IronRuby dove devo scrivere ScriptLib :: Lib.PrintHello() È chiunque familiarità sia con IronRuby o IronPython in questo modo? Ho bisogno di uno script di installazione python per mappare tutti i metodi/variabili prima di eseguire uno script di test? Speravo di farlo in C#. – cgyDeveloper

risposta

19

Si dovrebbe essere in grado di fare qualcosa di simile:

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

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

In questo modo ottenere tutti i membri del obiet lib e poi iniettare nel ScriptScope. Questo viene fatto con la classe ObjectOperations di Python in modo che i membri che si trovano siano membri di Python. Quindi se poi fai qualcosa di simile con IronRuby lo stesso codice dovrebbe funzionare.

+1

Grazie! Vorrei poter dare più voti positivi, non ho trovato il modo di far funzionare le funzioni ovunque. – cgyDeveloper

+0

Sembra che questo potrebbe non funzionare in IronRuby. Non penso che supporti i membri non associati. Il meglio che posso ottenere ora è lib.PrintHello. – cgyDeveloper

+1

@cygDeveloper non ti preoccupare Ho aggiunto un ulteriore upvote alla risposta, è sicuramente la strada da percorrere, abbiamo anche creato una DSL per le nostre applicazioni in questo modo – TimothyP