diff --git a/kiss/src/kiss/Prelude.hx b/kiss/src/kiss/Prelude.hx index 7ccdc4ae..0d188753 100644 --- a/kiss/src/kiss/Prelude.hx +++ b/kiss/src/kiss/Prelude.hx @@ -398,12 +398,17 @@ class Prelude { public static var printStr:(String) -> Void = _printStr; - public static function print(v:T, label = ""):T { + public static function withLabel(v:Any, label = "") { var toPrint = label; if (label.length > 0) { toPrint += ": "; } toPrint += Std.string(v); + return toPrint; + } + + public static function print(v:T, label = ""):T { + var toPrint = withLabel(v, label); printStr(toPrint); return v; } diff --git a/kiss/src/kiss/SpecialForms.hx b/kiss/src/kiss/SpecialForms.hx index 16ee0811..e1ab8f25 100644 --- a/kiss/src/kiss/SpecialForms.hx +++ b/kiss/src/kiss/SpecialForms.hx @@ -449,6 +449,22 @@ class SpecialForms { ECast(e, t).withMacroPosOf(wholeExp); } + k.doc("trace", 1, 2, "(trace )"); + map["trace"] = (wholeExp:ReaderExp, exps:Array, k:KissState) -> { + var b = wholeExp.expBuilder(); + var label = if (exps.length > 1) exps[1] else b.str(""); + var label = k.convert(label); + EBlock([ + EVars([ + toVar(b.symbol("v"), exps[0], k) + ]).withMacroPosOf(wholeExp), + ECall(EConst(CIdent("trace")).withMacroPosOf(wholeExp), [ + macro kiss.Prelude.withLabel(v, $label) + ]).withMacroPosOf(wholeExp), + k.convert(exps[0]) + ]).withMacroPosOf(wholeExp); + }; + return map; } diff --git a/kiss/src/test/cases/BasicTestCase.hx b/kiss/src/test/cases/BasicTestCase.hx index abd2ad3c..6ef1cfd4 100644 --- a/kiss/src/test/cases/BasicTestCase.hx +++ b/kiss/src/test/cases/BasicTestCase.hx @@ -346,6 +346,10 @@ class BasicTestCase extends Test { function testWhileLet() { _testWhileLet(); } + + function testTrace() { + _testTrace(); + } } class BasicObject { diff --git a/kiss/src/test/cases/BasicTestCase.kiss b/kiss/src/test/cases/BasicTestCase.kiss index b7c8c785..23b9e30b 100644 --- a/kiss/src/test/cases/BasicTestCase.kiss +++ b/kiss/src/test/cases/BasicTestCase.kiss @@ -637,4 +637,7 @@ From:[(assert false (+ \"false \" \"should \" \"have \" \"been \" \"true\"))]" m stream (Stream.fromString "a\nb\nc")] (whileLet [(Some line) (stream.takeLine)] (Assert.equals (nth lines idx) line) - (+= idx 1)))) \ No newline at end of file + (+= idx 1)))) + +(function _testTrace [] + (Assert.equals 5 (trace 5 "num"))) \ No newline at end of file