Example #1
0
        public static void Main(string[] cmd_args_1938475092347027340582734) // random name doesn't interfere with my variables
        {
            // Create a global environment
            LuaInterface i = LuaRuntime.GetLua();

            // to add an item, simply use the LuaInterface like a table
            i["obj"] = "sample object";

            // we can set the MetaTable of item "obj", but first we must get it from
            // the global environment:
            var val = i["obj"];

            // We can then print "val"
            Console.WriteLine(val.ToString());   // --> sample object

            // to register methods, use the Register function (using Addresses or delegates)
            i.RegisterFunction("samplefunc", null, (new Func <object>(delegate()
            {
                return(100);
            })).Method);

            // To run Lua, use the Run function in LuaRuntime
            // we pass "t" as the specified environment, otherwise it will
            // create a new environment to run in.
            LuaRuntime.Run(@"print(""obj:"", obj, ""\nsamplefunc:"", samplefunc())");

            // we can also call .NET methods using Lua-created .NET object
            // such as:
            LuaRuntime.Run("obj2 = clr.create(\"CSharpExampleProject.TestClass\")");
            // Notice the ':' in the method invocation (call)...
            LuaRuntime.Run("print(\"testint:\", obj2.testint, \"TestFunc:\", obj2:TestFunc())");

            // the reason for this is because clr.create returns an advanced Userdata with
            // metatables that wrap the .net object
            //LuaRuntime.Run("obj2.ThisValueDoesntExistInDotNet = \"hey\"", t);
            // the same value was printed twice, with different functions each time, proving its not actually there:
            //Console.WriteLine(LuaRuntime.Run("return \"Sample attemption at creating an object: \" .. tostring(obj2.ThisValueDoesntExistInDotNet)", t));
            // Console.WriteLine was used to show that you can print the returned value of executed code
            //LuaRuntime.Run("print(obj2.ThisValueDoesntExistInDotNet)", t);

            // You can also call functions defined in #Lua
            LuaFunction f = LuaRuntime.Run("return function() print\"a function says hai\" end")[0] as LuaFunction;

            f.Call();

            // Another class example
            i["t2"] = new Test2();
            LuaRuntime.Run("t2.Values:Sort() print(t2[1])");

            // Let you see the output
            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }
Example #2
0
        public static void ConfigRead()
        {
            LuaInterface lua = LuaRuntime.GetLua();

            //lua.RegisterFunction("getSSHInfo", my, my.GetType().GetMethod("getSSHInfo"));
            lua.DoFile(Constant.Config);
            object[] objs = lua.GetFunction("getSSHInfo").Call();
            Constant.sshServer = objs[0].ToString();
            Constant.sshPort   = Int32.Parse(objs[1].ToString());
            Constant.sshUID    = objs[2].ToString();
            Constant.sshPWD    = objs[3].ToString();
        }
Example #3
0
        /// <summary>
        /// A REPL (Read, Eval, Print, Loop function) for #Lua
        /// </summary>
        /// <param name="args">Application startup args</param>
        public static void Main(string[] args)
        {
            bool GoInteractive = true;

            // Create global variables
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            LuaRuntime.PrintBanner();
            LuaRuntime.RegisterModule(typeof(TestModule));
            LuaRuntime.RegisterModule(typeof(TestModule2));

            // how to handle errors
#if DEBUG
            LuaRuntime.SetVariable("DEBUG", true);
#else
            LuaRuntime.SetVariable("DEBUG", false);
#endif

            Prompt = "> ";

            LuaRuntime.GetLua().NewTable("arg");
            LuaTable t = LuaRuntime.GetLua().GetTable("arg");
            for (int i = 0; i < args.Length; i++)
            {
                t[i] = args[i];
            }

            // check command line args
            if (args.Length > 0)
            {
                string file = args[0];
                if (File.Exists(file))
                {
                    try
                    {
                        LuaRuntime.SetVariable("_WORKDIR", Path.GetDirectoryName(file));
                        LuaRuntime.RunFile(file);
                        // it loaded successfully
                        if (args.Length > 1) // possibly interactive mode after
                        {
                            Console.WriteLine("Loaded file '" + Path.GetFileName(file) + "'");
                        }
                    }
                    catch (Exception error)
                    {
                        Console.WriteLine(error.Message);
                    }
                    //Console.ReadKey(true);
                    //return;
                    // instead, go to interactive
                }
                else
                {
                    Console.WriteLine(file + " not found.");
                }
            }

            // check for interactive mode
            foreach (string arg in args)
            {
                if (arg.ToUpper() == "-I")
                {
                    GoInteractive = true;
                }
            }

            if (args.Length == 0)
            {
                GoInteractive = true;
            }

            if (GoInteractive)
            {
                while (true)
                {
                    Console.Write(Prompt);
                    string line = Console.ReadLine();

                    if (line == "quit" || line == "exit" || line == "bye")
                    {
                        break;
                    }
                    else
                    {
                        try
                        {
                            object[] v = LuaRuntime.Run(line);
                            if (v == null || v.Length == 0)
                            {
                                Console.WriteLine("=> [no returned value]");
                            }
                            else
                            {
                                Console.Write("=> ");
                                for (int i = 0; i < v.Length; i++)
                                {
                                    if (v[i] == null)
                                    {
                                        Console.WriteLine("<nil>");
                                    }
                                    else
                                    {
                                        Console.Write(v[i].ToString() + (i != v.Length - 1 ? ", " : ""));
                                    }
                                }
                                Console.WriteLine();
                            }
                        }
                        catch (LuaSourceException ex)
                        {
                            for (int i = 0; i < ex.Column; i++)
                            {
                                Console.Write(" ");
                            }

                            // Offset for prompt
                            for (int i = 0; i < Prompt.Length - 1; i++)
                            {
                                Console.Write(" ");
                            }

                            Console.WriteLine("^");
                            Console.WriteLine(ex.GenerateMessage("<stdin>"));
                        }
                        catch (Exception error)
                        {
                            // TODO: show lua script traceback
                            // Possible fix... this isn't safe though.

                            //Console.WriteLine(error.Message);
                            // doesnt work :(
                            //LuaRuntime.Run("pcall(function() print(debug.traceback()) end)");
                            //Console.WriteLine();

                            object dbg = LuaRuntime.GetVariable("DEBUG");

                            if ((dbg is bool && (bool)dbg == true) || dbg is int == false)
                            {
                                Console.WriteLine(error.ToString());
                            }
                            else
                            {
                                Console.WriteLine("Error: " + error.Message);
                            }
                            LuaRuntime.SetVariable("LASTERROR", error);
                        }
                    }
                }
            }
        }
Example #4
0
        /// <summary>
        /// A REPL (Read, Eval, Print, Loop function) for #Lua
        /// </summary>
        /// <param name="args">Application startup args</param>
        public static void Main(string[] args)
        {
            // TODO: Better arg parsing/checking, make it more like the C lua

            bool GoInteractive = true;

            // Create global variables
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            //Stopwatch sw = new Stopwatch();
            //sw.Start();

            //sw.Stop();
            //Console.WriteLine(sw.ElapsedMilliseconds);

#if DEBUG
#if true
            LuaRuntime.RegisterModule(typeof(TestModule));
            LuaRuntime.RegisterModule(typeof(TestModule2));
#endif

            // how to handle errors
            //LuaRuntime.SetVariable("DEBUG", true);
            LuaRuntime.SetVariable("DEBUG", false);
            // We don't need the C# traceback.
            // All it is is [error]
            //     at LuaInterface.ThrowErrorFromException
            //     [...]
            // Which we don't need
#else
            LuaRuntime.SetVariable("DEBUG", false);
#endif

            Prompt = "> ";

            bool wasSetInteract = false;
            bool wasFileRun     = false;
            for (int i = 0; i < args.Length; i++)
            {
                string arg = args[i];
                if (arg.ToUpper() == "-I")
                {
                    GoInteractive  = true;
                    wasSetInteract = true;
                }
                else if (arg.ToUpper() == "-NOI")
                {
                    GoInteractive = false;
                }
                else if (arg.Substring(0, 2).ToLower() == "-l")
                {
                    if (arg.Length == 2)
                    {
                        string lib = args[++i];
                        LuaRuntime.Require(lib);
                    }
                    else
                    {
                        string lib = arg.Substring(2);
                        LuaRuntime.Require(lib);
                    }
                }
                else if (arg.ToLower() == "-e")
                {
                    if (wasSetInteract == false)
                    {
                        GoInteractive = true;
                    }

                    LuaRuntime.Run(args[++i]);

                    if (wasSetInteract == false)
                    {
                        GoInteractive = false;
                    }
                    wasFileRun = true;
                }
                else if (arg == "--")
                {
                    break;
                }
                else
                {
                    LuaTable t  = LuaRuntime.GetLua().NewTable("arg");
                    int      i3 = 1;
                    if (args.Length > i + 1)
                    {
                        for (int i2 = i + 1; i2 < args.Length; i2++)
                        {
                            t[i3++] = args[i2];
                        }
                    }

                    t[-1]  = System.Windows.Forms.Application.ExecutablePath;
                    t["n"] = t.Keys.Count;

                    if (File.Exists(args[i]))
                    {
                        LuaRuntime.SetVariable("_WORKDIR", Path.GetDirectoryName(args[i]));
                    }
                    else
                    {
                        LuaRuntime.SetVariable("_WORKDIR", Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath));
                    }
                    LuaRuntime.RunFile(args[i]);

                    if (wasSetInteract == false)
                    {
                        GoInteractive = false;
                    }

                    wasFileRun = true;
                    break;
                }
            }


            /*
             * // check command line args
             * if (args.Length > 0)
             * {
             *  string file = args[0];
             *  if (File.Exists(file))
             *  {
             *      try
             *      {
             *          LuaRuntime.SetVariable("_WORKDIR", Path.GetDirectoryName(file));
             *          LuaRuntime.RunFile(file);
             *          // it loaded successfully
             *          if (args.Length > 1 && args[1].ToUpper() != "-NOI") // possibly interactive mode after
             *              Console.WriteLine("Loaded file '" + Path.GetFileName(file) + "'");
             *      }
             *      catch (Exception error)
             *      {
             *          Console.WriteLine(error.Message);
             *      }
             *      //Console.ReadKey(true);
             *      //return;
             *      // instead, go to interactive
             *  }
             *  else
             *  {
             *      Console.WriteLine(file + " not found.");
             *  }
             * }
             */

            if (args.Length == 0)
            {
                GoInteractive = true;
            }

            if (GoInteractive)
            {
                if (args.Length == 0 || wasFileRun == false)
                {
                    LuaRuntime.PrintBanner();
                }
                LuaRuntime.SetVariable("_WORKDIR", Path.GetDirectoryName(typeof(Program).Assembly.Location));
                while (true)
                {
                    Console.Write(Prompt);
                    string line = Console.ReadLine();

                    if (line == "quit" || line == "exit" || line == "bye")
                    {
                        break;
                    }
                    else
                    {
                        try
                        {
                            object[] v = LuaRuntime.GetLua().DoString(line, "<stdin>");
                            if (v == null || v.Length == 0)
#if DEBUG
                            { Console.WriteLine("=> [no returned value]"); }
#else
                            {; }
#endif
                            else
                            {
                                Console.Write("=> ");
                                for (int i = 0; i < v.Length; i++)
                                {
                                    if (v[i] == null)
                                    {
                                        Console.WriteLine("<nil>");
                                    }
                                    else
                                    {
                                        Console.Write(v[i].ToString() + (i != v.Length - 1 ? ", " : ""));
                                    }
                                }
                                Console.WriteLine();
                            }
                        }