Last active
May 3, 2019 19:30
-
-
Save dpeek/7476625 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-x Main |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import haxe.macro.Expr; | |
class FTW | |
{ | |
public static function build() | |
{ | |
return haxe.macro.Context.getBuildFields().map(transformField); | |
} | |
static function transformField(field:Field) | |
{ | |
switch (field.kind) | |
{ | |
case FFun(f): transformExpr(f.expr); | |
default: | |
} | |
return field; | |
} | |
static function transformExpr(expr:Expr) switch (expr) | |
{ | |
case macro @for($init, $cond, $incr) $block: | |
transformExpr(block); | |
expr.expr = makeLoop(init, cond, incr, block).expr; | |
default: | |
haxe.macro.ExprTools.iter(expr, transformExpr); | |
} | |
static function makeLoop(init:Expr, cond:Expr, incr:Expr, block:Expr) return macro | |
{ | |
$init; | |
while ($cond) | |
{ | |
$block; | |
$incr; | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@:build(FTW.build()) | |
class Main | |
{ | |
static function main() | |
{ | |
@for(var i = 0, i < 10, i++) | |
{ | |
trace('ftw: $i'); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
A year and a half later, I finally noticed your comment. Sorry for the late response!
Anyway, I figured out that you meant to include a
continue
statement in your example, because that's what causes duplicate code. (Or maybe you did include one and try.haxe.org didn't save it. Or maybe Haxe improved over the past 1.5 years, and now it optimizes your example better.)Whichever it was, I've fixed the issue. My code checks for the existence of
continue
andbreak
statements, and uses the simplest possible loop. Even in the most complicated case, the only code that gets duplicated is "shouldBreak = false
," not any anonymous functions or classes.