diff --git a/README.md b/README.md index 8aef8df..4e83256 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,144 @@ Lune ==== -A simple Lua dialect +Lune is a simple [Lua](http://www.lua.org) dialect, which compile to normal Lua. It adds a preprocessor and some usefull syntax additions to the language, like += operators. + +Lune code example : + +````lua +#local language = args.lang or "en" +local a = 5 +a += 3 +#if language == "fr" then + print("Le resultat est "..a) +#elseif language == "en" then + print("The result is "..a) +#end +```` + +This code will compile diffrently depending on the "lang" argument you pass to the compiler. + +Syntax details +-------------- +### Preprocessor +Before compiling, a preprocessor is run; it search the lines which start with a # and execute the Lune code after it. +For example, + +````lua +#if args.lang == "fr" then + print("Ce programme a ete compile en francais") +#else + print("This program was compiled in english") +#end +```` + +Output ````print("Ce programme a ete compile en francais")```` or ````print("This program was compiled in english")```` depending of the "lang" argument. + +In the preprocessor, the following global variables are available : +* ````lune```` : the Lune library table +* ````output```` : the preprocessor output string +* ````include(filename)```` : a function which copy the contents of the file filename to the output and add some code so it is equivalent to : + + ````lua + filname = require("filename") or filename + ```` + + except that the required code is actually embedded in the file. +* ````rawInclude(filename)```` : a function which copy the contents of the file filename to the output, whithout modifications +* ````print(...)```` : instead of writing to stdout, write to the preprocessor output; for example, + + ````lua + local foo = "hello" + #print("foo ..= ' lune')") + print(foo) + ```` + + will output : + + ````lua + local foo = "hello" + foo = foo .. ' lune' + print(foo) + ```` + +* ````args```` : the arguments table passed to the compiler. Example use : + + ````lua + argumentValue = args["argumentName"] + ```` + +* And all the Lua standard libraries. + +### Compiler +After the preprocessor, the compiler is run; it translate Lune syntax to Lua syntax. What is translated to what : +* ````var += nb```` > ````var = var + nb```` +* ````var -= nb```` > ````var = var - nb```` +* ````var *= nb```` > ````var = var * nb```` +* ````var /= nb```` > ````var = var / nb```` +* ````var ^= nb```` > ````var = var ^ nb```` +* ````var %= nb```` > ````var = var % nb```` +* ````var ..= str```` > ````var = var .. str```` +* ````var++```` > ````var = var + 1```` +* ````var--```` > ````var = var - 1```` + +Command-line usage +------------------ +The library can be used standalone : + + lua lune.lua + +Display a simple information text (version & basic command-line usage). + + lua lune.lua [arguments] + +Output to stdout the Lune code compiled in Lua. +* arguments : + * input : input file name + * arguments : arguments to pass to the preprocessor (every argument is of type ````-- ````) +* example uses : + + lua lune.lua foo.lune > foo.lua + + compile foo.lune and write the result in foo.lua + + lua lune.lua foo.lune --verbose true | lua + + compile foo.lune with "verbose" set to true and execute it + +Library usage +------------- +Lune can also be used as a normal Lua library. For example, +````lua +local lune = require("lune") + +local f = io.open("foo.lune") +local contents = f:read("*a") +f:close() + +local compiled = lune.make(contents, { lang = "fr" }) + +load(compiled)() +```` +will load Lune, read the file foo.lune, compile its contents with the argument "lang" set to "fr", and then execute the result. + +Lune API : +* ````lune.VERSION```` : version string +* ````lune.syntax```` : syntax table used when compiling (TODO : need more explainations) +* ````lune.preprocess(code[, args])```` : return the Lune code preprocessed with args as argument table +* ````lune.compile(code)```` : return the Lune code compiled to Lua +* ````lune.make(code[, args])```` : return the Lune code preprocessed & compilled to Lua with args as argument table + +Compiling Lune +-------------- +Because the Lune compiler itself is written in Lune, you have to compile it with an already compiled version of Lune. This command will use the precompilled version in build/lune.lua to compile lune.lune and write the result in lune.lua : + +```` +lua build/lune.lua lune.lune > lune.lua +```` + +You can then test your build : + +```` +cd tests +lua test.lua ../lune.lua +```` \ No newline at end of file