From 96bb39ec1c501e4c8d710e28263066b9f665c4df Mon Sep 17 00:00:00 2001 From: Yvon Date: Thu, 9 Jun 2022 18:15:29 +0300 Subject: [PATCH] SpecialForms.hx doc update --- kiss/src/kiss/SpecialForms.hx | 49 ++++++++++++++++------------------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/kiss/src/kiss/SpecialForms.hx b/kiss/src/kiss/SpecialForms.hx index 1865c48b..16ee0811 100644 --- a/kiss/src/kiss/SpecialForms.hx +++ b/kiss/src/kiss/SpecialForms.hx @@ -58,8 +58,8 @@ class SpecialForms { }; function makeQuickNth(idx:Int, name:String) { + k.doc(name, 1, 1, '($name )'); map[name] = (wholeExp:ReaderExp, args:Array, k:KissState) -> { - wholeExp.checkNumArgs(1, 1, '($name [list])'); EArray(k.convert(args[0]), macro $v{idx}).withMacroPosOf(wholeExp); }; } @@ -75,8 +75,8 @@ class SpecialForms { makeQuickNth(9, "tenth"); makeQuickNth(-1, "last"); + k.doc("rest", 1, 1, '(rest )'); map["rest"] = (wholeExp:ReaderExp, args:Array, k:KissState) -> { - wholeExp.checkNumArgs(1, 1, '(rest [list])'); macro ${k.convert(args[0])}.slice(1); }; @@ -100,8 +100,8 @@ class SpecialForms { ]).withMacroPosOf(wholeExp); }; + k.doc("new", 1, null, '(new )'); map["new"] = (wholeExp:ReaderExp, args:Array, k:KissState) -> { - wholeExp.checkNumArgs(1, null, '(new [type] [constructorArgs...])'); var classType = switch (args[0].def) { case Symbol(name): name; default: throw KissError.fromExp(args[0], 'first arg in (new [type] ...) should be a class to instantiate'); @@ -109,8 +109,8 @@ class SpecialForms { ENew(Helpers.parseTypePath(classType, args[0]), args.slice(1).map(k.convert)).withMacroPosOf(wholeExp); }; + k.doc("set", 2, 2, "(set )"); map["set"] = (wholeExp:ReaderExp, args:Array, k:KissState) -> { - wholeExp.checkNumArgs(2, 2, "(set [variable] [value])"); EBinop(OpAssign, k.convert(args[0]), k.convert(args[1])).withMacroPosOf(wholeExp); }; @@ -179,8 +179,8 @@ class SpecialForms { }; } + k.doc("deflocal", 2, 3, "(localVar )"); map["deflocal"] = (wholeExp:ReaderExp, args:Array, k:KissState) -> { - wholeExp.checkNumArgs(2, 3, "(localVar [optional :type] [variable] [optional: &mut] [value])"); EVars(toVars(args[0], args[1], k)).withMacroPosOf(wholeExp); }; renameAndDeprecate("deflocal", "localVar"); @@ -205,8 +205,8 @@ class SpecialForms { ]).withMacroPosOf(wholeExp); }; + k.doc("lambda", 2, null, "(lambda [] )"); map["lambda"] = (wholeExp:ReaderExp, args:Array, k:KissState) -> { - wholeExp.checkNumArgs(2, null, "(lambda [] )"); var returnsValue = switch (args[0].def) { case TypedExp("Void", argNames): args[0] = argNames; @@ -216,9 +216,8 @@ class SpecialForms { } EFunction(FAnonymous, Helpers.makeFunction(null, returnsValue, args[0], args.slice(1), k, "lambda")).withMacroPosOf(wholeExp); }; - + function forExpr(formName:String, wholeExp:ReaderExp, args:Array, k:KissState) { - wholeExp.checkNumArgs(3, null, '($formName [varName or [varNames...] or =>keyName valueName] [list] [body...])'); var uniqueVarName = "_" + Uuid.v4().toShort(); var namesExp = args[0]; var listExp = args[1]; @@ -244,14 +243,14 @@ class SpecialForms { EArrayDecl([forExpr("for", wholeExp, args, k)]).withMacroPosOf(wholeExp); }; + k.doc("loop", 1, null, '(loop )'); map["loop"] = (wholeExp:ReaderExp, args:Array, k:KissState) -> { - wholeExp.checkNumArgs(1, null, '(loop )'); EWhile(macro true, k.convert(wholeExp.expBuilder().begin(args)), true).withMacroPosOf(wholeExp); }; + function whileForm(invert:Bool, wholeExp:ReaderExp, args:Array, k:KissState) { var funcName = if (invert) "until" else "while"; - wholeExp.checkNumArgs(2, null, '($funcName )'); var b = wholeExp.expBuilder(); var cond = k.convert(b.callSymbol("Prelude.truthy", [args[0]])); if (invert) cond = macro !$cond; @@ -261,23 +260,24 @@ class SpecialForms { map["while"] = whileForm.bind(false); map["until"] = whileForm.bind(true); - map["return"] = (wholeExp:ReaderExp, args:Array, k:KissState) -> { - wholeExp.checkNumArgs(0, 1, '(return [?value])'); + k.doc("return", 0, 1, '(return )'); + map["return"] = (wholeExp:ReaderExp, args:Array, k:KissState) -> { var returnExpr = if (args.length == 1) k.convert(args[0]) else null; EReturn(returnExpr).withMacroPosOf(wholeExp); }; - - map["break"] = (wholeExp:ReaderExp, args:Array, k:KissState) -> { - wholeExp.checkNumArgs(0, 0, "(break)"); + + k.doc("break", 0, 0, "(break)"); + map["break"] = (wholeExp:ReaderExp, args:Array, k:KissState) -> { EBreak.withMacroPosOf(wholeExp); }; + k.doc("continue", 0, 0, "(continue)"); map["continue"] = (wholeExp:ReaderExp, args:Array, k:KissState) -> { - wholeExp.checkNumArgs(0, 0, "(continue)"); EContinue.withMacroPosOf(wholeExp); }; // (case... ) for switch + k.doc("case", 2, null, '(case )>)'); map["case"] = (wholeExp:ReaderExp, args:kiss.List, k:KissState) -> { // Most Lisps don't enforce covering all possible patterns with (case...), but Kiss does, // because pattern coverage is a useful feature of Haxe that Kiss can easily bring along. @@ -286,7 +286,6 @@ class SpecialForms { // Therefore only one case is required in a case statement, because one case could be enough // to cover all patterns. - wholeExp.checkNumArgs(2, null, '(case [expression] [cases...] [optional: (otherwise [default])])'); var args:kiss.List = args.copy(); var isTupleCase = switch (args[0].def) { @@ -350,8 +349,8 @@ class SpecialForms { }; // Type check syntax: + k.doc("the", 2, 3, '(the )'); map["the"] = (wholeExp:ReaderExp, args:Array, k:KissState) -> { - wholeExp.checkNumArgs(2, 3, '(the )'); var pkg = ""; var whichArg = "first"; if (args.length == 3) { @@ -370,10 +369,9 @@ class SpecialForms { ECheckType(k.convert(args[1]), Helpers.parseComplexType(type, args[0])).withMacroPosOf(wholeExp); }; + k.doc("try", 1, null, "(try )"); map["try"] = (wholeExp:ReaderExp, args:Array, k:KissState) -> { - wholeExp.checkNumArgs(1, null, "(try )"); var tryKissExp = args[0]; - var catchKissExps = args.slice(1); ETry(k.convert(tryKissExp), [ for (catchKissExp in catchKissExps) { @@ -411,9 +409,8 @@ class SpecialForms { EThrow(k.convert(args[0])).withMacroPosOf(wholeExp); }; + k.doc("if", 2, 3, '(if )'); map["if"] = (wholeExp:ReaderExp, args:Array, k:KissState) -> { - wholeExp.checkNumArgs(2, 3, '(if [cond] [then] [?else])'); - var condition = macro Prelude.truthy(${k.convert(args[0])}); var thenExp = k.convert(args[1]); var elseExp = if (args.length > 2) { @@ -430,15 +427,15 @@ class SpecialForms { $elseExp; }; + k.doc("not", 1, 1, '(not )'); map["not"] = (wholeExp:ReaderExp, args:Array, k:KissState) -> { - wholeExp.checkNumArgs(1, 1, '(not [value])'); var condition = k.convert(args[0]); var truthyExp = macro Prelude.truthy($condition); macro !$truthyExp; }; + k.doc("cast", 1, 2, '(cast )'); map["cast"] = (wholeExp:ReaderExp, args:Array, k:KissState) -> { - wholeExp.checkNumArgs(1, 2, '(cast )'); var e = k.convert(args[0]); var t = null; if (args.length > 1) { @@ -454,9 +451,9 @@ class SpecialForms { return map; } - + public static function caseOr(wholeExp:ReaderExp, args:Array, k:KissState):Expr { - wholeExp.checkNumArgs(2, null, "(or [v1] [v2] [values...])"); + wholeExp.checkNumArgs(2, null, "(or )"); return if (args.length == 2) { macro ${k.convert(args[0])} | ${k.convert(args[1])}; } else {