Estoy echandole un vistazo a LUA en .NET. Me parece un tema muy interesante, pero he visto una cosa que no me ha gustado mucho.
Segun parece desde el código de .NET puedes registrar las funciones y tipos que quieres que se puedan llamar desde un script. Correcto
Lo que no me gusta mucho es que desde el script de LUA se puedan acceder a tipos de la biblioteca de clases sin haberlo registrado desde el código .NET.
En el script te podrian meter algun código que accediendo a clases del framework te hiciera alguna gran faena. ¿que os parece?
Por si alguien no conocía la combinación LUA+.NET os copio un par de enlaces:
http://luaforge.net/projects/luainterface/
http://einfall.blogspot.com/2006/05/scripting-with-lua-in-c.html
Si trabajas en .Net no es más fácil utilizar el propio C# como lenguaje de script?
Creo que hay algun ejemplo en el SDK de DirectX
...
jejeje, veo que he hecho bien al aparcar esas movidas....
me pierdo el aprender como va pero parece que lo gano en salud :P
Si, hace tiempo vi una instruccion que lo que hacia era ejecutar una cadena que contenia codigo.
No recuerdo cual era exactamente, creo q era eval, evaluate o algo asi. Vivent ¿Sabes cual era? ¿Te referias a eso?
El problema de que pudieran ejecutar lo que les diera la gana desde el script se mantendria.
Lex, en .NET parece que ni siquiera hace falta registrar las funciones si forman parte de un objeto. Que es justo lo que a mi no me gusta.
Registrar una funcion es bastante sencillo. De todas formas estoy empezando a ver LUA y no he hecho nada serio. No he tenido tiempo para encontrarme con muchos problemas ni quebraderos de cabeza
Como dice vincent lo mejor en .NET yo creo que es usar el propio C# como lenguaje de script (System.Codedom, System.Reflection.Emit,...). Si quisieras usar otro, yo creo que me decantaría por IronPython (Python.NET)
Un saludo!
Vicente
Cita de: VicenteComo dice vincent lo mejor en .NET yo creo que es usar el propio C# como lenguaje de script (System.Codedom, System.Reflection.Emit,...)
Esto me lo estuvo comentando
Haddd en la kdd de la
Imagine Cup ya que le saque el tema de scripts en
.NET. Pero una duda, el codigo que cargas mediante la clase
Reflection no deja a la vista el resto de clases y objetos de
.NET?
Salu2...
Buenas a todos,
Despues de hecharle un vistazo a lua y a otros interpretes, al final me decidi por hacer el mio propio. Creo que con las facilidades que viene con .net hacerse un pequeño parser, paras tus principales funciones y objetos es bastante simple. No creo que puedan hacer nada usando tu propio lenguaje, ya que eres tu el que decides que funciones quieres que se puedan usar desde fuera, con la ventaja de que pones tu las restricciones. La idea de usar
C# como propio lenguaje script me parece peligroso.
Cita de: [EX3]Cita de: VicenteComo dice vincent lo mejor en .NET yo creo que es usar el propio C# como lenguaje de script (System.Codedom, System.Reflection.Emit,...)
Esto me lo estuvo comentando Haddd en la kdd de la Imagine Cup ya que le saque el tema de scripts en .NET. Pero una duda, el codigo que cargas mediante la clase Reflection no deja a la vista el resto de clases y objetos de .NET?
Salu2...
Te refieres a que el código que cargas por reflexión no se ve desde otras partes de tu código normal?
Un saludo!
Vicente
Si, a mi tambien me parece peligroso usar C# como script y lo mismo utilizar LUA ya que parece que permite llamar a clases del framework sin que previamente haya que registrar las funciones. Supongo que lo que haré será lo que comentas de crearme mi propio lenguaje de script.
Pero me surgen algunas dudas.
¿como almacenas las variables del script en .NET?
¿Para evaluar expresiones del tipo ((X+3) > 4) && (Y * 3 != 33) como lo hariais? Supongo que habria que currarse un analizador lexico y sintactico y eso no seria tan sencillo, aunque si muy interesante.
Aqui tienes un pequeño analizador lexico, de aqui saque mis propias ideas.
//
http://www.picdev.com.ar/lexicografico.php?menu=4&title=Lexicogr%E1fico
Para guardar las variables usa una lista en c#, cuando necesites sacar un valor lo puedes hacer, como ejemplo, lista.find("Nombre"). Yo enfoque el tema a relación del motor haddd, es decir, me cree algunas funciones, por ejemplo puse una funcion que es Carga y le paso un string con el nombre del objeto a cargar.
Tienes que crear tanto delegados como funciones quieras usar.
delegate bool Carga(string arg);
struct Token
{
public string name;
public Carga miFunc;
}
Token testToken = new Token();
testToken.name = "Carga" <== Esta es la palabra reservada que usaras en tu script.
testToken.miFunc = Haddd.scene.import; <== La funcion que llamaras.
While(Aqui vas leyendo linea a linea tu script)
{
exec(linea);
}
funcion de exec:
string[] argumentos;
argumentos = line.Split(char.Parse(" ")); <== Usas el separador como tu quieras "="
if (argumentos[0] == testToken.name)
{
testToken.miFunc(argmentos[1]);
<== Aqui se ejecutaria esto : haddd.scene.import(argumentos[1]);
}
Cita de: DiferencialBuenas a todos,
Despues de hecharle un vistazo a lua y a otros interpretes, al final me decidi por hacer el mio propio. Creo que con las facilidades que viene con .net hacerse un pequeño parser, paras tus principales funciones y objetos es bastante simple. No creo que puedan hacer nada usando tu propio lenguaje, ya que eres tu el que decides que funciones quieres que se puedan usar desde fuera, con la ventaja de que pones tu las restricciones. La idea de usar
C# como propio lenguaje script me parece peligroso.
Aquí hablo sin mucho conocimiento, pero creo que se puede restringir bastante bastante lo que le permites hacer al "script". No por ser C# va a poder tocar todo lo que se le antoje como si fuera código normal. Vamos, o creo que se le puede restringir.
Un saludo!
Vicente
Si tienes razon Vicente, pero he estado mirando es namespace System.CodeDom y no me he enterado de nada. Te dejo este enlace creo que me quedo con mi idea de tener mi propio lenguaje script e ir tirando de delegate... Por haber visto muy complicado System.CodeDom.
//
http://msdn.microsoft.com/library/spa/default.asp?url=/library/SPA/cpref/html/frlrfSystemCodeDomCompilerCodeDomProviderClassTopic.asp
Menos mal que es un simple hola mundo, imaginate si lo complican un poco más.
He hecho un pequeño ejemplo para aprender a manejar el codedom. Os lo pego por si a alguien le puede servir. Simplemente a partir de una cadena (q se podria leer de un fichero) que contiene el codigo de una clase la compilo y la ejecuto sin escribir en disco.
Dim fuente As String
fuente = "Imports Microsoft.VisualBasic" & vbCrLf
fuente &= "Public Class Clase" & vbCrLf
fuente &= "Public shared Sub Saluda()" & vbCrLf
fuente &= "MsgBox(""222Hello, World!"") " & vbCrLf
fuente &= "End Sub" & vbCrLf
fuente &= "End Class" & vbCrLf
Dim provider As VBCodeProvider = New VBCodeProvider()
Dim cp As New CompilerParameters()
cp.ReferencedAssemblies.Add("System.dll")
cp.GenerateInMemory = True
cp.GenerateExecutable = False
Dim cr As CompilerResults = provider.CompileAssemblyFromSource(cp, fuente)
If cr.Errors.Count = 0 Then
Dim a As System.Reflection.Assembly
a = cr.CompiledAssembly
Nothing)
a.GetType("Clase").GetMethod("Saluda").Invoke(Nothing, Nothing)
End If
No habia visto el ultimo enlace.
Mi hola mundo es bastante sencillote
Con el system.codeDom seguro que puedes crear tu propio lenguaje. bnl tu que te has enterado mejor del tema, sabes como se podria hacer?
Tampoco lo he mirado demasiado. No sabría decirte. Seguramente si a partir de codigo en tu lenguaje generas el codedom luego podrias grabarlo como un ensamblado.
O quiza con el emit tendrias que ir traducciondo cada instruccion de tu lenguaje a MSIL.
No se, lo mismo son burradas.
Hola.
No comentas el mismo error que mucha gente y te pongas a programar tu lenguaje de script... porque siendo sincero. no creo que superes el nivel de los lenguajes que hay en un tiempo aceptable.
Mirate bien LUA y que veras que realmente es super sencillo y sino te gusta, mirate el AngelScript.
Yo he usado los dos y ambos tienen cosas buenas y malas, pero molan mucho y son sencillos de usar. Vamos, muchisimo más que hacerte tu uno propio...
Cita de: [Over]No comentas el mismo error que mucha gente y te pongas a programar tu lenguaje de script...
Eeeeeh. Eso me ha dolido. Mi tiempo libre lo despercio como me apetece :D
Ahora en serio, montarse un sistema de script un poco funcional es una comedura de coco y como tu dices probablemente una perdida de tiempo. Lo bueno es que aprendes un monton de cosas de como funcionan los lenguajes de programacion y los compiladores/interpretes y te das cuenta de que muchos de estos son autenticas maravillas. Y no te cuento si te metes a bajo nivel. Altamente recomendable como practica.
Yo en la universidad estudie todo esto e hice una practica en PASCAL. Es bastante interesante y la complejidad tampoco es tan elevada (tampoco es que sea trivial precisamente)
Citar
Mirate bien LUA y que veras que realmente es super sencillo y sino te gusta, mirate el AngelScript.
Si, me estuve mirando LUA. Utilizarlo con .NET es bastante sencillito, pero comente desde el script puedes ejecutar funciones del framework de .NET sin haberlas registrado y eso no me hace ninguna gracia.