A Lua interpreter written in C#
moonsharp.org
moonsharp.org
It's questionable whether labels/goto are needed at all (Lua didn't have them until 5.2), in my opinion the language could do very well without.
Coroutines would be nice though.
I don't think everybody agrees that the whole point of Lua is to play host to MetaLua.
But let's talk about content instead: what are, in your opinion, the essential uses of goto in a language that has strong functional features and coroutines?
As for the goto being essential: first, FSMs. They cannot be implemented more naturally and efficiently with anything else. Huge switch can be costly. Secondly, higher level DSLs may need goto to represent features not directly available in the host language structural elements. For example, translating a PEG parser efficiently is very easy if you can goto to the current block exit without going through a long 'if' ladder, and since blocks are nested, it cannot be substituted with a return.
It depends a bit on what your motivation for using a Lua interpreter embedded into the .NET environment is. Instinctively, it wouldn't be my choice for things that need to be exceedingly fast. But let's say you do want to implement an FSM in this context where performance isn't critical. States and state transitions could very well be expressed by functions instead of code blocks, and there are implementations in the wild that do this.
> Huge switch can be costly.
Goto doesn't really help alleviate the cost of chaining if statements either (which is what Lua forces you to do in the absence of a switch statement). But if it's critical, you could build dispatch tables with pure Lua tables to mirror a static switch statement.
If you're concerned about processor cache though, I don't think interpreted Lua on top of .NET is the right choice to base an FSM of to begin with.
> DSLs may need goto to represent features not directly available in the host language structural elements
True, but it depends a bit on the paradigms chosen to implement the necessary transformations. It's correct though that goto statements provide you with a very intuitive way to shape control flow in the absence of corresponding features in the host language. If that facility is missing, you lose the option of translating your canonical C-based algorithms faithfully into Lua code. Whether that's a bad thing is a matter of debate.
For me it comes down to the consideration of using the right tool for the appropriate job, which was the context of my original comment. If you're building a language that needs to satisfy every possible use case efficiently (both in respect to execution and programmer effort), you're just screwed. This is especially true for interpreted languages, and extraordinarily so if they're supposed to host higher level interpreted languages on top.
I am on mobile, so cannot check easily the current implementation.
However it can be translated into MSIL, make use of the dynamic language runtime or eventually use the upcoming .NET Native infrastructure when it becomes available.
And Lua is not that bad at all for an interpreted language, it's fairly fast (especially the LuaJIT implementation), and it is possible to implement a nice compiled or semi-compiled Lua backend on top of .net. So it is reasonable to expect that it can serve as a backend for compiling higher level languages, as well as for the usual simple scripting.
Lua has proper tail calls, which are the natural way to express FSMs there. Programming in Lua actually uses an FSM as an example when explaining the motivation behind tail calls:
For now, I actually use CSharpCodeProvider and compile C# as "scripts" during game start (and cache it for future use), searching across attributes to find the right item. When deploying to platforms that don't have CSharpCodeProvider (Xamarin.iOS, for example), I can precompile the scripts, pack the assemblies, and the fallback is trivial.
https://github.com/NLua/KopiLua
However, other projects came up.
My interest was in a c# implementation of Lua where scripts would run in a cross-platform manner. I'm not sure the "addititions"/"modifications" in Moon# will meet those needs. If I return to said project, I will definitely take a look.