update to 0.5.0
leafo
released this
Windows binary: https://github.com/leafo/moonscript/releases/tag/win32-v0.5.0
Syntax updates
Function calls
Function calls with parentheses can now have free whitespace around the
arguments. Additionally, a line break may be used in place of a comma:
my_func(
"first arg"
=>
print "some func"
"third arg", "fourth arg"
)Function argument definitions
Just like the function all update, function argument definitions have no
whitespace restrictions between arguments, and line breaks can be used to
separate arguments:
some_func = (
name
type
action="print"
) =>
print name, type, actionAdditions
elseifcan be used part of anunlessblock (nymphium)unlessconditional expression can contain an assignment like anifstatement (#251)- Lua 5.3 bitwise operator support (nymphium) (Kawahara Satoru)
- Makefile is Lua version agnostic (nymphium)
- Lint flag can be used with
mooncwatch mode (ChickenNuggers) - Lint exits with status 1 if there was a problem detected (ChickenNuggers)
- Compiler can be used with lulpeg
Bug Fixes
- Slice boundaries can be full expressions (#233)
- Destructure works when used as loop variable in comprehension (#236)
- Proper name local hoisting works for classes again (#287)
- Quoted table key literals can now be parsed when table declaration is in single line (#286)
- Fix an issue where
elsecould get attached to wrongifstatement (#276) - Loop variables will no longer overwrite variables of the same name in the same scope (egonSchiele)
- A file being deleted will not crash polling watch mode (ChickenNuggers)
- The compiler will not try to compile a directory ending in
.moon(Gskartwii) - alt_getopt import works with modern version (Jon Allen)
- Code coverage not being able to find file from chunk name
Assets
2
add auth token for release
Assets
3
You can now find windows binaries through GithHub's releases. See win32-v0.4.0
Changes to super
super now looks up the parent method via the class reference, instead of a
(fixed) closure to the parent class.
Given the following code:
class MyThing extends OtherThing
the_method: =>
super!In the past super would compile to something like this:
_parent_0.the_method(self)Where _parent_0 was an internal local variable that contains a reference to
the parent class. Because the reference to parent is an internal local
variable, you could never swap out the parent unless resorting to the debug
library.
This version will compile to:
_class_0.__parent.__base.the_method(self)Where _class_0 is an internal local variable that contains the current class (MyThing).
Another difference is that the instance method is looked up on __base instead
of the class. The old variation would trigger the metamethod for looking up on
the instance, but a class method of the same name could conflict, take
precedence, and be retuned instead. By referencing __base directly we avoid
this issue.
Super on class methods
super can now be used on class methods. It works exactly as you would expect.
class MyThing extends OtherThing
@static_method: =>
print super!Calling super will compile to:
_class_0.__parent.static_method(self)Improved scoping for super
The scoping of super is more intelligent. You can warp your methods in other
code and super will still generate correctly. For example, syntax like this
will now work as expected:
class Sub extends Base
value: if debugging
=> super! + 100
else
=> super! + 10
other_value: some_decorator {
the_func: =>
super!
}super will refer to the lexically closest class declaration to find the name
of the method it should call on the parent.
Bug Fixes
- Nested
withblocks used incorrect ref (#214 by @geomaster) - Lua quote string literals had wrong precedence (#200 by @nonchip)
- Returning from
withblock would generate tworeturnstatements (#208) - Including
returnorbreakin acontinuewrapped block would generate invalid code (#215 #190 #183)
Other
- Refactor transformer out into multiple files
mooncommand line script rewritten in MoonScriptmoonscript.parse.build_grammarfunction for getting new instance of parser grammar- Chain AST updated to be simpler
Assets
2
leafo
released this
I'm happy to announce MoonScript version 0.2.4, the CoffeeScript inspired language that compiles to Lua. It's been about 5 months since the last release.
As always, if you've got any questions or want to tell me about how you are using MoonScript you can email me or contact me on twitter.
You can find the full release notes on my blog: http://leafo.net/posts/moonscript_v024.html
Changes
- The way the subtraction operator works has changed. There was always a little confusion as to the rules regarding whitespace around it and it was recommended to always add whitespace around the operator when doing subtraction. Not anymore. Hopefully it now works how you would expect. (
a-bcompiles toa - band nota(-b)anymore). - The
moonlibrary is no longer sets a global variable and instead returns the module. Your code should now be:
moon = require "moon"- Generated code will reuse local variables when appropriate. Local variables are guaranteed to not have side effects when being accessed as opposed to expressions and global variables. MoonScript will now take advantage of this and reuse those variable without creating and copying to a temporary name.
- Reduced the creation of anonymous functions that are called immediately.
MoonScript uses this technique to convert a series of statements into a single expression. It's inefficient because it allocates a new function object and has to do a function call. It also obfuscates stack traces. MoonScript will flatten these functions into the current scope in a lot of situations now. - Reduced the amount of code generated for classes. Parent class code it left out if there is no parent.
New Things
- You can now put line breaks inside of string literals. It will be replaced with
\nin the generated code.
x = "hello
world"- Added
moonscript.basemodule. It's a way of including themoonscriptmodule without automatically installing the moonloader. - You are free to use any whitespace around the name list in an import statement. It has the same rules as an array table, meaning you can delimit names with line breaks.
import a, b
c, d from z- Added significantly better tests. Previously the testing suite would only verify that code compiled to an expected string. Now there are unit tests that execute the code as well. This will make it easier to change the generated output while still guaranteeing the semantics are the same.
Bug Fixes
bis not longer treated as self assign in{ a : b }- load functions will return
nilinstead of throwing error, as described in documentation - fixed an issue with
moon.mixinwhere it did not work as described
Other Stuff
Libraries
Some updates for libraries written in MoonScript:
- Lapis, the MoonScript powered web framework has come out with version
0.0.2. magick, LuaJIT FFI bindings to ImageMagickweb_sanitize, HTML sanitization
Games
Ludum Dare happened again, and I wrote another game in MoonScript:
Thanks
Thanks to everyone who provided feedback for this release. See you next time.