From ce9abc4eddc7a71ac1fcd8cfc4eb92bb5330fddf Mon Sep 17 00:00:00 2001 From: Flandia Yingman Date: Wed, 19 Feb 2025 13:08:45 +0800 Subject: [PATCH 01/14] Improve module method checks --- .../scala/hkmc2/semantics/Elaborator.scala | 22 +++++++--- .../hkmc2/semantics/ImplicitResolver.scala | 43 ++++++++++++++++--- .../src/main/scala/hkmc2/semantics/Term.scala | 6 +-- .../src/main/scala/hkmc2/utils/utils.scala | 10 ++++- .../test/mlscript/basics/ModuleMethods.mls | 6 ++- .../test/mlscript/codegen/FieldSymbols.mls | 4 +- .../src/test/mlscript/codegen/Hygiene.mls | 4 +- .../test/mlscript/codegen/SelfReferences.mls | 4 +- .../mlscript/ucs/papers/OperatorSplit.mls | 2 +- .../mlscript/ucs/syntax/NestedOpSplits.mls | 2 +- 10 files changed, 77 insertions(+), 26 deletions(-) diff --git a/hkmc2/shared/src/main/scala/hkmc2/semantics/Elaborator.scala b/hkmc2/shared/src/main/scala/hkmc2/semantics/Elaborator.scala index b1173793ac..2ea2d07d3c 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/semantics/Elaborator.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/semantics/Elaborator.scala @@ -1092,13 +1092,14 @@ extends Importer: N case N => N - def fieldOrVarSym(k: TermDefKind, id: Ident)(using Ctx): LocalSymbol & NamedSymbol = + def fieldOrVarSym(k: TermDefKind, id: Ident)(using Ctx): TermSymbol | VarSymbol = if ctx.outer.isDefined then TermSymbol(k, ctx.outer, id) else VarSymbol(id) - def param(t: Tree, inUsing: Bool): Ctxl[Opt[Opt[Bool] -> Param]] = t match + def param(t: Tree, inUsing: Bool): Ctxl[Opt[Opt[Bool] -> Param]] = + def go(t: Tree, inUsing: Bool, flags: FldFlags): Ctxl[Opt[Opt[Bool] -> Param]] = t match case TypeDef(Mod, inner, N, N) => - val ps = param(inner, inUsing).map(_.mapSecond(p => p.copy(flags = p.flags.copy(mod = true)))) + val ps = go(inner, inUsing, flags.copy(mod = true)) for p <- ps if p._2.flags.mod do p._2.sign match case N => raise(ErrorReport(msg"Module parameters must have explicit types." -> t.toLoc :: Nil)) @@ -1107,10 +1108,21 @@ extends Importer: case _ => () ps case TypeDef(Pat, inner, N, N) => - param(inner, inUsing).map(_.mapSecond(p => p.copy(flags = p.flags.copy(pat = true)))) + go(inner, inUsing, flags.copy(pat = true)) case _ => t.asParam(inUsing).map: (isSpd, p, t) => - isSpd -> Param(FldFlags.empty, fieldOrVarSym(ParamBind, p), t.map(term(_))) + val sym = fieldOrVarSym(ParamBind, p) + val sign = t.map(term(_)) + val param = Param(flags, sym, sign) + sym match + case sym: TermSymbol => + // TODO: How can a TermSymbol accept a Declaration + // sym.defn = S(TermDefinition(ctx.outer, Fun, sym, Nil, Nil, sign, N, FlowSymbol(s"‹result of ${sym}›"), TermDefFlags.empty, Nil)) + case sym: VarSymbol => + sym.decl = S(param) + isSpd -> param + go(t, inUsing, FldFlags.empty) + def params(t: Tree): Ctxl[(ParamList, Ctx)] = t match case Tup(ps) => diff --git a/hkmc2/shared/src/main/scala/hkmc2/semantics/ImplicitResolver.scala b/hkmc2/shared/src/main/scala/hkmc2/semantics/ImplicitResolver.scala index 235497c498..7576bf042a 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/semantics/ImplicitResolver.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/semantics/ImplicitResolver.scala @@ -282,21 +282,50 @@ object ModuleChecker: .exists(_.isInstanceOf[TyParam]) /** Checks if a term evaluates to a module value. */ - def evalsToModule(t: Term): Bool = - def isModule(t: Tree): Bool = t match - case Tree.TypeDef(Mod, _, _, _) => true - case _ => false + def evalsToModule(t: Term): Bool = def returnsModule(t: Tree.TermDef): Bool = t.annotatedResultType match case S(Tree.TypeDef(Mod, _, N, N)) => true case _ => false + def checkDecl(decl: Declaration): Bool = decl match + // All TypeLikeDef are not modules, except for modules themselves. + // Objects use ModuleDef but is not a module. + case ModuleDef(kind = Mod) => + true + case _: TypeLikeDef => + false + // Check Member/Local symbols + case defn: TermDefinition => + defn.flags.isModTyped + case defn: Param => + defn.flags.mod + case defn: TyParam => + defn.flags.mod + def checkSym(sym: Symbol): Bool = sym match + case sym if sym.asMod.nonEmpty => true + case sym if sym.asBlkMember.flatMap(_.trmTree).exists(returnsModule) => true + case _: (BuiltinSymbol | TopLevelSymbol) => false + case sym: BlockLocalSymbol => sym.decl match + case S(decl) => checkDecl(decl) + case N => + // Most local symbols are let-bindings + // which do not have a definition at this point. + false + case sym: MemberSymbol[?] => sym.defn match + case S(defn) => checkDecl(defn) + case N => + // At this point all member symbols should have definition, + // except for the class(-like) that are currently being elaborated. + // TODO: We will fix this by deferring the checks to the resolution stage. + false + case sym => + lastWords(s"Unsupported symbol kind ${sym}") t match case Term.Blk(_, res) => evalsToModule(res) case Term.App(lhs, rhs) => lhs.symbol match case S(sym: BlockMemberSymbol) => sym.trmTree.exists(returnsModule) case _ => false - case t => t.symbol match - case S(sym: BlockMemberSymbol) => sym.modTree.exists(isModule) - case _ => false + case t: Term.Ref => checkSym(t.sym) + case t => t.symbol.exists(checkSym) /** * An extractor that extracts the (tree) definition of a module method. diff --git a/hkmc2/shared/src/main/scala/hkmc2/semantics/Term.scala b/hkmc2/shared/src/main/scala/hkmc2/semantics/Term.scala index f5eab0ab0e..e2d1fb3c04 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/semantics/Term.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/semantics/Term.scala @@ -263,14 +263,14 @@ final case class LetDecl(sym: LocalSymbol, annotations: Ls[Annot]) extends State final case class DefineVar(sym: LocalSymbol, rhs: Term) extends Statement -final case class TermDefFlags(isModMember: Bool): +final case class TermDefFlags(isModMember: Bool, isModTyped: Bool): def showDbg: Str = val flags = Buffer.empty[String] if isModMember then flags += "module" flags.mkString(" ") override def toString: String = "‹" + showDbg + "›" -object TermDefFlags { val empty: TermDefFlags = TermDefFlags(false) } +object TermDefFlags { val empty: TermDefFlags = TermDefFlags(false, false) } final case class TermDefinition( owner: Opt[InnerSymbol], @@ -494,7 +494,7 @@ final case class TyParam(flags: FldFlags, vce: Opt[Bool], sym: VarSymbol) extend final case class Param(flags: FldFlags, sym: LocalSymbol & NamedSymbol, sign: Opt[Term]) -extends AutoLocated: +extends Declaration with AutoLocated: def subTerms: Ls[Term] = sign.toList override protected def children: List[Located] = subTerms // def children: Ls[Located] = self.value :: self.asc.toList ::: Nil diff --git a/hkmc2/shared/src/main/scala/hkmc2/utils/utils.scala b/hkmc2/shared/src/main/scala/hkmc2/utils/utils.scala index 146e3efd12..c72db3db4a 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/utils/utils.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/utils/utils.scala @@ -22,6 +22,7 @@ extension (s: String) import hkmc2.semantics.TermDefFlags import hkmc2.semantics.FldFlags +import hkmc2.semantics.ParamListFlags import scala.collection.mutable.Buffer import mlscript.utils.StringOps import hkmc2.semantics.CtxArg @@ -42,9 +43,10 @@ extension (t: Product) case xs: List[_] => "Ls of \n" + xs.iterator.map(aux(_)).mkString("\n").indent(" ") case xs: Vector[_] => "Vector of \n" + xs.iterator.map(aux(_)).mkString("\n").indent(" ") case s: String => s.escaped - case TermDefFlags(mod) => + case TermDefFlags(isModMember, isModTyped) => val flags = Buffer.empty[String] - if mod then flags += "module" + if isModMember then flags += "modMember" + if isModMember then flags += "modTyped" flags.mkString("(", ", ", ")") case FldFlags(mut, spec, genGetter, mod, pat) => val flags = Buffer.empty[String] @@ -54,6 +56,10 @@ extension (t: Product) if mod then flags += "module" if pat then flags += "pat" flags.mkString("(", ", ", ")") + case ParamListFlags(ctx) => + val flags = Buffer.empty[String] + if ctx then flags += "ctx" + flags.mkString("(", ", ", ")") case Loc(start, end, origin) => val (sl, _, sc) = origin.fph.getLineColAt(start) val (el, _, ec) = origin.fph.getLineColAt(end) diff --git a/hkmc2/shared/src/test/mlscript/basics/ModuleMethods.mls b/hkmc2/shared/src/test/mlscript/basics/ModuleMethods.mls index 5a7200e03e..fa217324ed 100644 --- a/hkmc2/shared/src/test/mlscript/basics/ModuleMethods.mls +++ b/hkmc2/shared/src/test/mlscript/basics/ModuleMethods.mls @@ -68,14 +68,16 @@ fun f7(): module M //│ ╙── ^^^^^^^^^^^^^^ -:todo // should be an error :e fun f8(module m: M) = m +//│ ╔══[ERROR] Functions returning module values must have explicit return types. +//│ ║ l.72: fun f8(module m: M) = m +//│ ╙── ^^^^^^^^^^^^^^^ :e fun f9(module m: M): module M = m //│ ╔══[ERROR] Only module methods may return module values. -//│ ║ l.76: fun f9(module m: M): module M = m +//│ ║ l.78: fun f9(module m: M): module M = m //│ ╙── ^^^^^^^^^^^^^^^^^^^^^^^^^ module Test with diff --git a/hkmc2/shared/src/test/mlscript/codegen/FieldSymbols.mls b/hkmc2/shared/src/test/mlscript/codegen/FieldSymbols.mls index 6adcd0a2b4..1fd760fb74 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/FieldSymbols.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/FieldSymbols.mls @@ -60,7 +60,7 @@ case //│ stats = Nil //│ res = Lam: //│ params = ParamList: -//│ flags = ParamListFlags of false +//│ flags = () //│ params = Ls of //│ Param: //│ flags = () @@ -92,7 +92,7 @@ case //│ lhs = $block$res //│ rhs = Lam: //│ params = ParamList: -//│ flags = ParamListFlags of false +//│ flags = () //│ params = Ls of //│ Param: //│ flags = () diff --git a/hkmc2/shared/src/test/mlscript/codegen/Hygiene.mls b/hkmc2/shared/src/test/mlscript/codegen/Hygiene.mls index e72b346f63..f58634e80d 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/Hygiene.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/Hygiene.mls @@ -156,10 +156,10 @@ foo() :sjs module Whoops with - val v = this + val v: module Whoops = this fun f() = "Hello" module Whoops with - val w = this + val w: module Whoops = this fun g() = f() //│ JS (unsanitized): //│ let Whoops2; diff --git a/hkmc2/shared/src/test/mlscript/codegen/SelfReferences.mls b/hkmc2/shared/src/test/mlscript/codegen/SelfReferences.mls index 34c2f3b75d..8948d15a24 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/SelfReferences.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/SelfReferences.mls @@ -20,10 +20,12 @@ Foo.self //│ = Foo -:todo :e module Foo with val self = this +//│ ╔══[ERROR] Functions returning module values must have explicit return types. +//│ ║ l.25: val self = this +//│ ╙── ^^^^ Foo.self //│ = Foo diff --git a/hkmc2/shared/src/test/mlscript/ucs/papers/OperatorSplit.mls b/hkmc2/shared/src/test/mlscript/ucs/papers/OperatorSplit.mls index 9ad5b6e27a..41b483c547 100644 --- a/hkmc2/shared/src/test/mlscript/ucs/papers/OperatorSplit.mls +++ b/hkmc2/shared/src/test/mlscript/ucs/papers/OperatorSplit.mls @@ -75,7 +75,7 @@ fun example(args) = //│ sym = member:example //│ params = Ls of //│ ParamList: -//│ flags = ParamListFlags of false +//│ flags = () //│ params = Ls of //│ Param: //│ flags = () diff --git a/hkmc2/shared/src/test/mlscript/ucs/syntax/NestedOpSplits.mls b/hkmc2/shared/src/test/mlscript/ucs/syntax/NestedOpSplits.mls index 66acb6e250..8cae62c902 100644 --- a/hkmc2/shared/src/test/mlscript/ucs/syntax/NestedOpSplits.mls +++ b/hkmc2/shared/src/test/mlscript/ucs/syntax/NestedOpSplits.mls @@ -16,7 +16,7 @@ fun f(x) = //│ sym = member:f //│ params = Ls of //│ ParamList: -//│ flags = ParamListFlags of false +//│ flags = () //│ params = Ls of //│ Param: //│ flags = () From a37af71f44a5f5833ededa1f7f5a36174cabcd23 Mon Sep 17 00:00:00 2001 From: Flandia Yingman Date: Sun, 23 Feb 2025 21:27:39 +0800 Subject: [PATCH 02/14] Refactor symbols of class-like parameters --- .../scala/hkmc2/codegen/HandlerLowering.scala | 7 ++- .../scala/hkmc2/codegen/js/JSBuilder.scala | 4 +- .../scala/hkmc2/semantics/Elaborator.scala | 44 +++++++++++++++---- .../main/scala/hkmc2/semantics/Symbol.scala | 1 + .../test/mlscript-compile/apps/Accounting.mjs | 2 +- .../src/test/mlscript-compile/apps/CSV.mjs | 2 +- .../test/mlscript/basics/GenericClasses.mls | 12 ++++- .../src/test/mlscript/basics/Inheritance.mls | 10 ++--- .../test/mlscript/codegen/ClassInClass.mls | 4 +- .../src/test/mlscript/codegen/FunInClass.mls | 4 +- .../src/test/mlscript/codegen/Hygiene.mls | 2 +- .../mlscript/handlers/EffectsInClasses.mls | 2 +- .../src/test/mlscript/llir/Playground.mls | 8 ++-- 13 files changed, 69 insertions(+), 33 deletions(-) diff --git a/hkmc2/shared/src/main/scala/hkmc2/codegen/HandlerLowering.scala b/hkmc2/shared/src/main/scala/hkmc2/codegen/HandlerLowering.scala index 45312120d3..494fa4efe5 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/codegen/HandlerLowering.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/codegen/HandlerLowering.scala @@ -530,7 +530,12 @@ class HandlerLowering(using TL, Raise, Elaborator.State, Elaborator.Ctx): Assign(freshTmp(), PureCall( Value.Ref(State.builtinOpsMap("super")), // refers to Predef.__Cont which is pure Value.Lit(Tree.UnitLit(true)) :: Value.Lit(Tree.UnitLit(true)) :: Nil), End()), - End())) + AssignField( + clsSym.asPath, + pcVar.id, + Value.Ref(pcVar), + End() + )(S(pcSymbol)))) private def genNormalBody(b: Block, clsSym: BlockMemberSymbol)(using HandlerCtx): Block = val transform = new BlockTransformerShallow(SymbolSubst()): diff --git a/hkmc2/shared/src/main/scala/hkmc2/codegen/js/JSBuilder.scala b/hkmc2/shared/src/main/scala/hkmc2/codegen/js/JSBuilder.scala index 46c47d1bce..26c6e0b5dd 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/codegen/js/JSBuilder.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/codegen/js/JSBuilder.scala @@ -196,9 +196,7 @@ class JSBuilder(using TL, State, Ctx) extends CodeBuilder: val nme = scp.allocateName(fld) doc" # $mtdPrefix#$nme;" .mkDocument(doc"") - val preCtorCode = ctorParams.foldLeft(body(preCtor, endSemi = true)): - case (acc, (sym, nme)) => - doc"$acc # this.${sym.name} = $nme;" + val preCtorCode = body(preCtor, endSemi = true) val ctorCode = doc"$preCtorCode${body(ctor, endSemi = false)}" val ctorOrStatic = if isModule then doc"static" diff --git a/hkmc2/shared/src/main/scala/hkmc2/semantics/Elaborator.scala b/hkmc2/shared/src/main/scala/hkmc2/semantics/Elaborator.scala index 2ea2d07d3c..9849e6acee 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/semantics/Elaborator.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/semantics/Elaborator.scala @@ -988,6 +988,35 @@ extends Importer: params(ps) newCtx = newCtx2 res + def withFields(using Ctx)(fn: (Ctx) ?=> (Term.Blk, Ctx)): (Term.Blk, Ctx) = + val fields = ps.map: ps => + ps.params.map: p => + // For class-like types, "desugar" the parameters into additional class fields. + val owner = td.symbol match + // Any MemberSymbol should be an InnerSymbol, except for TypeAliasSymbol, + // but type aliases should not call this function. + case s: InnerSymbol => S(s) + case _: TypeAliasSymbol => die + val fsym = BlockMemberSymbol(p.sym.nme, Nil) + val fdef = TermDefinition( + owner, + ImmutVal, + fsym, + Nil, N, p.sign, + S(Term.Ref(p.sym)(p.sym.id, 666)), // FIXME: 666 is a dummy value + FlowSymbol("‹class-param-res›"), + TermDefFlags.empty.copy(isModMember = k is Mod), + Nil + ) + sym.defn = S(fdef) + fdef + val ctxWithFields = ctx.withMembers( + fields.fold(Nil)(_.map(f => f.sym.nme -> f.sym)), + ctx.outer + ) + val (blk, c) = fn(using ctxWithFields) + val blkWithFields = fields.fold[Term.Blk](blk)(fs => blk.copy(stats = fs ::: blk.stats)) + (blkWithFields, c) val defn = k match case Als => val alsSym = td.symbol.asInstanceOf[TypeAliasSymbol] // TODO improve `asInstanceOf` @@ -1039,7 +1068,8 @@ extends Importer: newCtx.nest(S(clsSym)).givenIn: log(s"Processing type definition $nme") val cd = - val (bod, c) = body match + val (bod, c) = withFields: + body match case S(b: Tree.Block) => block(b, hasResult = false) // case S(t) => block(t :: Nil) case S(t) => ??? @@ -1053,7 +1083,8 @@ extends Importer: newCtx.nest(S(clsSym)).givenIn: log(s"Processing type definition $nme") val cd = - val (bod, c) = body match + val (bod, c) = withFields: + body match case S(b: Tree.Block) => block(b, hasResult = false) // case S(t) => block(t :: Nil) case S(t) => ??? @@ -1111,15 +1142,10 @@ extends Importer: go(inner, inUsing, flags.copy(pat = true)) case _ => t.asParam(inUsing).map: (isSpd, p, t) => - val sym = fieldOrVarSym(ParamBind, p) + val sym = VarSymbol(p) val sign = t.map(term(_)) val param = Param(flags, sym, sign) - sym match - case sym: TermSymbol => - // TODO: How can a TermSymbol accept a Declaration - // sym.defn = S(TermDefinition(ctx.outer, Fun, sym, Nil, Nil, sign, N, FlowSymbol(s"‹result of ${sym}›"), TermDefFlags.empty, Nil)) - case sym: VarSymbol => - sym.decl = S(param) + sym.decl = S(param) isSpd -> param go(t, inUsing, FldFlags.empty) diff --git a/hkmc2/shared/src/main/scala/hkmc2/semantics/Symbol.scala b/hkmc2/shared/src/main/scala/hkmc2/semantics/Symbol.scala index 7ba794f366..d646ada4f0 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/semantics/Symbol.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/semantics/Symbol.scala @@ -117,6 +117,7 @@ class InstSymbol(val origin: Symbol)(using State) extends LocalSymbol: class VarSymbol(val id: Ident)(using State) extends BlockLocalSymbol(id.name) with NamedSymbol with LocalSymbol: val name: Str = id.name + override def toLoc: Option[Loc] = id.toLoc // override def toString: Str = s"$name@$uid" override def subst(using s: SymbolSubst): VarSymbol = s.mapVarSym(this) diff --git a/hkmc2/shared/src/test/mlscript-compile/apps/Accounting.mjs b/hkmc2/shared/src/test/mlscript-compile/apps/Accounting.mjs index 4480fcd3aa..1792ffb983 100644 --- a/hkmc2/shared/src/test/mlscript-compile/apps/Accounting.mjs +++ b/hkmc2/shared/src/test/mlscript-compile/apps/Accounting.mjs @@ -49,8 +49,8 @@ Accounting1 = class Accounting { this.Report = function Report(fileName1) { return new Report.class(fileName1); }; this.Report.class = class Report { constructor(fileName) { - this.fileName = fileName; let tmp; + this.fileName = fileName; tmp = fs.writeFileSync(this.fileName, "# Accounting\n"); } w(txt) { diff --git a/hkmc2/shared/src/test/mlscript-compile/apps/CSV.mjs b/hkmc2/shared/src/test/mlscript-compile/apps/CSV.mjs index 883add7ba3..d1a6515b62 100644 --- a/hkmc2/shared/src/test/mlscript-compile/apps/CSV.mjs +++ b/hkmc2/shared/src/test/mlscript-compile/apps/CSV.mjs @@ -5,8 +5,8 @@ let CSV1; CSV1 = function CSV(strDelimiter1) { return new CSV.class(strDelimiter1); }; CSV1.class = class CSV { constructor(strDelimiter) { - this.strDelimiter = strDelimiter; let tmp, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + this.strDelimiter = strDelimiter; tmp = this.strDelimiter || ","; this.strDelimiter = tmp; tmp1 = "(\\" + this.strDelimiter; diff --git a/hkmc2/shared/src/test/mlscript/basics/GenericClasses.mls b/hkmc2/shared/src/test/mlscript/basics/GenericClasses.mls index 2b989aa2c3..ac9f14f113 100644 --- a/hkmc2/shared/src/test/mlscript/basics/GenericClasses.mls +++ b/hkmc2/shared/src/test/mlscript/basics/GenericClasses.mls @@ -25,12 +25,17 @@ class Foo[A] with +// Note: the elaborator elaborates class parameters into additional field definitions; +// this is why the following code yields two same errors. :fixme :e class Foo[A](x: Foo[A, A]) //│ ╔══[ERROR] Wrong number of type arguments -//│ ║ l.31: class Foo[A](x: Foo[A, A]) +//│ ║ l.33: class Foo[A](x: Foo[A, A]) +//│ ╙── ^^^^^^^^ +//│ ╔══[ERROR] Wrong number of type arguments +//│ ║ l.33: class Foo[A](x: Foo[A, A]) //│ ╙── ^^^^^^^^ :fixme @@ -38,6 +43,9 @@ class Foo[A](x: Foo[A, A]) class Foo[A](x: Bar[A]) class Bar(x: Foo[Int]) //│ ╔══[ERROR] Wrong number of type arguments -//│ ║ l.38: class Foo[A](x: Bar[A]) +//│ ║ l.43: class Foo[A](x: Bar[A]) +//│ ╙── ^^^^^ +//│ ╔══[ERROR] Wrong number of type arguments +//│ ║ l.43: class Foo[A](x: Bar[A]) //│ ╙── ^^^^^ diff --git a/hkmc2/shared/src/test/mlscript/basics/Inheritance.mls b/hkmc2/shared/src/test/mlscript/basics/Inheritance.mls index d413c1083d..ab7051f3af 100644 --- a/hkmc2/shared/src/test/mlscript/basics/Inheritance.mls +++ b/hkmc2/shared/src/test/mlscript/basics/Inheritance.mls @@ -57,7 +57,7 @@ class Baz(z) extends Bar(z * 1) with //│ Baz1.class = class Baz extends Bar3.class { //│ constructor(z) { //│ let tmp2; -//│ tmp2 = this.z * 1; +//│ tmp2 = z * 1; //│ super(tmp2); //│ this.z = z; //│ } @@ -67,19 +67,17 @@ class Baz(z) extends Bar(z * 1) with //│ toString() { return "Baz(" + globalThis.Predef.render(this.z) + ")"; } //│ }; -:fixme let b = Baz(42) -//│ ═══[RUNTIME ERROR] ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor +//│ b = Baz(42) b is Foo -//│ = false +//│ = true b is String //│ = false -:fixme [b.x, b.foo] -//│ ═══[RUNTIME ERROR] TypeError: Cannot read properties of undefined (reading 'x') +//│ = [10, 11] diff --git a/hkmc2/shared/src/test/mlscript/codegen/ClassInClass.mls b/hkmc2/shared/src/test/mlscript/codegen/ClassInClass.mls index 7b1d79fcf8..634885afad 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/ClassInClass.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/ClassInClass.mls @@ -18,15 +18,15 @@ class Outer(a, b) with //│ Outer1 = function Outer(a1, b1) { return new Outer.class(a1, b1); }; //│ Outer1.class = class Outer { //│ constructor(a, b) { +//│ let tmp, tmp1, tmp2; //│ this.a = a; //│ this.b = b; -//│ let tmp, tmp1, tmp2; //│ const this$Outer = this; //│ this.Inner = function Inner(c1) { return new Inner.class(c1); }; //│ this.Inner.class = class Inner { //│ constructor(c) { -//│ this.c = c; //│ let tmp3, tmp4, tmp5; +//│ this.c = c; //│ tmp3 = Predef.print(this$Outer.a); //│ tmp4 = Predef.print(this.c); //│ tmp5 = this.i1(this$Outer.a); diff --git a/hkmc2/shared/src/test/mlscript/codegen/FunInClass.mls b/hkmc2/shared/src/test/mlscript/codegen/FunInClass.mls index 5a9e420637..6a1c87d6ac 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/FunInClass.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/FunInClass.mls @@ -25,8 +25,8 @@ fun test(a) = //│ Inner1 = function Inner(b1) { return new Inner.class(b1); }; //│ Inner1.class = class Inner { //│ constructor(b) { -//│ this.b = b; //│ let tmp; +//│ this.b = b; //│ tmp = Predef.print(a); //│ } //│ f(c) { @@ -159,8 +159,8 @@ Bar(1) //│ Bar1 = function Bar(x1) { return new Bar.class(x1); }; //│ Bar1.class = class Bar { //│ constructor(x) { -//│ this.x = x; //│ let tmp1; +//│ this.x = x; //│ tmp1 = this.foo(); //│ runtime.safeCall(tmp1()) //│ } diff --git a/hkmc2/shared/src/test/mlscript/codegen/Hygiene.mls b/hkmc2/shared/src/test/mlscript/codegen/Hygiene.mls index f58634e80d..6f377ac6d1 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/Hygiene.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/Hygiene.mls @@ -108,8 +108,8 @@ class Cls(x) with //│ #x; //│ #x1; //│ constructor(x2) { -//│ this.x = x2; //│ let tmp, tmp1; +//│ this.x = x2; //│ tmp = this.x + 1; //│ this.#x = tmp; //│ tmp1 = this.#x * 2; diff --git a/hkmc2/shared/src/test/mlscript/handlers/EffectsInClasses.mls b/hkmc2/shared/src/test/mlscript/handlers/EffectsInClasses.mls index c96265a2ed..c1a8f04e52 100644 --- a/hkmc2/shared/src/test/mlscript/handlers/EffectsInClasses.mls +++ b/hkmc2/shared/src/test/mlscript/handlers/EffectsInClasses.mls @@ -14,7 +14,6 @@ class Lol(h) with //│ Lol1 = function Lol(h1) { return new Lol.class(h1); }; //│ Lol1.class = class Lol { //│ constructor(h) { -//│ this.h = h; //│ let tmp, res, Cont$1; //│ const this$Lol = this; //│ Cont$1 = function Cont$(pc1) { return new Cont$.class(pc1); }; @@ -50,6 +49,7 @@ class Lol(h) with //│ } //│ toString() { return "Cont$(" + globalThis.Predef.render(this.pc) + ")"; } //│ }; +//│ this.h = h; //│ tmp = runtime.safeCall(this.h.perform("k")); //│ if (tmp instanceof globalThis.Predef.__EffectSig.class) { //│ tmp.tail.next = new Cont$1.class(0); diff --git a/hkmc2/shared/src/test/mlscript/llir/Playground.mls b/hkmc2/shared/src/test/mlscript/llir/Playground.mls index 31dcf5dfd6..b222ec1419 100644 --- a/hkmc2/shared/src/test/mlscript/llir/Playground.mls +++ b/hkmc2/shared/src/test/mlscript/llir/Playground.mls @@ -12,9 +12,9 @@ class Lazy[out A](init: () -> A) with fun lazy(x) = Lazy(x) //│ LLIR: //│ class Option() -//│ class Some(x) +//│ class Some(x,x) //│ class None() -//│ class Lazy(init,cache) +//│ class Lazy(init,init,cache) //│ def fromSome(s) = //│ case s of //│ Some => @@ -74,10 +74,10 @@ main() //│ = 404 //│ LLIR: //│ class Option() -//│ class Some(x) +//│ class Some(x,x) //│ class None() //│ class Nat() -//│ class S(s) +//│ class S(s,s) //│ class O() //│ def fromSome(s) = //│ case s of From 35e3839658c83232852f9d9b16f39f009073ffae Mon Sep 17 00:00:00 2001 From: Flandia Yingman Date: Sun, 23 Feb 2025 21:44:55 +0800 Subject: [PATCH 03/14] Replace the cursed `LocalSymbol & NamedSymbol` --- hkmc2/shared/src/main/scala/hkmc2/codegen/Block.scala | 2 +- .../main/scala/hkmc2/semantics/ImplicitResolver.scala | 9 +++------ hkmc2/shared/src/main/scala/hkmc2/semantics/Term.scala | 4 ++-- .../main/scala/hkmc2/semantics/ucs/DeBrujinSplit.scala | 2 +- .../main/scala/hkmc2/semantics/ucs/Normalization.scala | 2 +- .../src/main/scala/hkmc2/semantics/ucs/PatternStub.scala | 2 +- .../src/main/scala/hkmc2/semantics/ucs/Translator.scala | 6 +++--- 7 files changed, 12 insertions(+), 15 deletions(-) diff --git a/hkmc2/shared/src/main/scala/hkmc2/codegen/Block.scala b/hkmc2/shared/src/main/scala/hkmc2/codegen/Block.scala index 66f861d94e..de172044d8 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/codegen/Block.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/codegen/Block.scala @@ -321,7 +321,7 @@ final case class ClsLikeDefn( final case class Handler( sym: BlockMemberSymbol, - resumeSym: LocalSymbol & NamedSymbol, + resumeSym: VarSymbol, params: Ls[ParamList], body: Block, ): diff --git a/hkmc2/shared/src/main/scala/hkmc2/semantics/ImplicitResolver.scala b/hkmc2/shared/src/main/scala/hkmc2/semantics/ImplicitResolver.scala index 7576bf042a..e6612731d9 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/semantics/ImplicitResolver.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/semantics/ImplicitResolver.scala @@ -9,7 +9,6 @@ import syntax.{Fun, Ins, Mod} import semantics.Term import semantics.Elaborator.State import ImplicitResolver.ICtx.Type -import ImplicitResolver.TyParamSymbol import Message.MessageContext @@ -25,15 +24,13 @@ class CtxArgImpl extends CtxArg: object ImplicitResolver: - type TyParamSymbol = LocalSymbol & NamedSymbol - /* * An "implicit" or "instance" context, as opposed to the one in Elaborator. */ case class ICtx( parent: Opt[ICtx], iEnv: Map[Type.Sym, Ls[(Type, ICtx.Instance)]], - tEnv: Map[TyParamSymbol, Type] + tEnv: Map[VarSymbol, Type] ): def +(typ: Type.Concrete, sym: Symbol): ICtx = @@ -41,7 +38,7 @@ object ImplicitResolver: val newEnv = iEnv + (typ.toSym -> newLs) copy(iEnv = newEnv) - def withTypeArg(param: TyParamSymbol, arg: Type): ICtx = + def withTypeArg(param: VarSymbol, arg: Type): ICtx = copy(tEnv = tEnv + (param -> arg)) def get(query: Type.Concrete): Opt[ICtx.Instance] = @@ -131,7 +128,7 @@ class ImplicitResolver(tl: TraceLogger) msg"got ${targs.length.toString()}" -> base.toLoc :: Nil)) (tparams zip targs).foldLeft(ictx): case (ictx, (tparam, targ)) => (tparam.sym, resolveType(targ)) match - case (sym: TyParamSymbol, S(typ)) => + case (sym: VarSymbol, S(typ)) => log(s"Resolving App with type arg ${sym} = $typ") ictx.withTypeArg(sym, typ) case _ => ictx diff --git a/hkmc2/shared/src/main/scala/hkmc2/semantics/Term.scala b/hkmc2/shared/src/main/scala/hkmc2/semantics/Term.scala index e2d1fb3c04..9ae8ffbc58 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/semantics/Term.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/semantics/Term.scala @@ -289,7 +289,7 @@ final case class TermDefinition( case _ => true final case class HandlerTermDefinition( - resumeSym: LocalSymbol & NamedSymbol, + resumeSym: VarSymbol, td: TermDefinition ) @@ -493,7 +493,7 @@ final case class TyParam(flags: FldFlags, vce: Opt[Bool], sym: VarSymbol) extend flags.showDbg + sym -final case class Param(flags: FldFlags, sym: LocalSymbol & NamedSymbol, sign: Opt[Term]) +final case class Param(flags: FldFlags, sym: VarSymbol, sign: Opt[Term]) extends Declaration with AutoLocated: def subTerms: Ls[Term] = sign.toList override protected def children: List[Located] = subTerms diff --git a/hkmc2/shared/src/main/scala/hkmc2/semantics/ucs/DeBrujinSplit.scala b/hkmc2/shared/src/main/scala/hkmc2/semantics/ucs/DeBrujinSplit.scala index 710f2524e3..a251950b12 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/semantics/ucs/DeBrujinSplit.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/semantics/ucs/DeBrujinSplit.scala @@ -372,7 +372,7 @@ extension (split: DeBrujinSplit) Split.End // TODO: report mismatched arity /** To instantiate the body of a pattern synonym. */ - def instantiate(context: Map[LocalSymbol & NamedSymbol, DeBrujinSplit])(using tl: TraceLogger): DeBrujinSplit = + def instantiate(context: Map[VarSymbol, DeBrujinSplit])(using tl: TraceLogger): DeBrujinSplit = import DeBrujinSplit.*, PatternStub.*, ConstructorLike.*, tl.* def go(split: DeBrujinSplit): DeBrujinSplit = split.traceChange("instantiate"): split match diff --git a/hkmc2/shared/src/main/scala/hkmc2/semantics/ucs/Normalization.scala b/hkmc2/shared/src/main/scala/hkmc2/semantics/ucs/Normalization.scala index 2bdc995e65..f06aae13c1 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/semantics/ucs/Normalization.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/semantics/ucs/Normalization.scala @@ -120,7 +120,7 @@ class Normalization(elaborator: Elaborator)(using raise: Raise, ctx: Ctx): // the number of free variables, bind them, and substitute them // with the new indices. val paramSymbols = (1 to split.arity).map: i => - TermSymbol(ParamBind, N, Ident(s"param$i")) + VarSymbol(Ident(s"param$i")) .toVector val paramList = PlainParamList: paramSymbols.iterator.map(Param(FldFlags.empty, _, N)).toList diff --git a/hkmc2/shared/src/main/scala/hkmc2/semantics/ucs/PatternStub.scala b/hkmc2/shared/src/main/scala/hkmc2/semantics/ucs/PatternStub.scala index 6913e9de19..5fffb2b1f1 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/semantics/ucs/PatternStub.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/semantics/ucs/PatternStub.scala @@ -19,7 +19,7 @@ enum ConstructorLike: /** This case represents pattern parameters, which only make sense within the * body of the pattern declaration. */ - case Parameter(symbol: LocalSymbol & NamedSymbol) + case Parameter(symbol: VarSymbol) /** * This case represents a nested split, where the arity of the split must be 1 * (there is exactly one `Binder` at the top level). The split must not have diff --git a/hkmc2/shared/src/main/scala/hkmc2/semantics/ucs/Translator.scala b/hkmc2/shared/src/main/scala/hkmc2/semantics/ucs/Translator.scala index e0832872fc..d00f128d2e 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/semantics/ucs/Translator.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/semantics/ucs/Translator.scala @@ -198,7 +198,7 @@ class Translator(val elaborator: Elaborator) private def errorSplit: Split = Split.Else(Term.Error) /** Create a function definition from the given UCS splits. */ - private def makeMatcher(name: Str, scrut: TermSymbol, topmost: Split)(using Raise): TermDefinition = + private def makeMatcher(name: Str, scrut: VarSymbol, topmost: Split)(using Raise): TermDefinition = val normalize = new Normalization(elaborator) val sym = BlockMemberSymbol(name, Nil) val ps = PlainParamList(Param(FldFlags.empty, scrut, N) :: Nil) @@ -221,7 +221,7 @@ class Translator(val elaborator: Elaborator) post = (blk: Ls[TermDefinition]) => s"Translator >>> $blk" ): val unapply = scoped("ucs:cp"): - val scrutSym = TermSymbol(ParamBind, N, Ident("scrut")) + val scrutSym = VarSymbol(Ident("scrut")) val topmost = full(() => scrutSym.ref(), body, success(params))(using patternParams, raise) ~~: failure log(s"Translated `unapply`: ${display(topmost)}") makeMatcher("unapply", scrutSym, topmost) @@ -229,7 +229,7 @@ class Translator(val elaborator: Elaborator) // We don't report errors here because they are already reported in the // translation of `unapply` function. given Raise = Function.const(()) - val scrutSym = TermSymbol(ParamBind, N, Ident("topic")) + val scrutSym = VarSymbol(Ident("topic")) stringPrefix(() => scrutSym.ref(), body, prefixSuccess(params)) match case Split.Else(Term.Error) => makeMatcher("unapplyStringPrefix", scrutSym, failure) From 79ca0e33e5f9b8502e18df1868884407f32f9d1d Mon Sep 17 00:00:00 2001 From: Lionel Parreaux Date: Mon, 24 Feb 2025 17:39:39 +0800 Subject: [PATCH 04/14] Add `data` modifier to classes --- .../scala/hkmc2/semantics/Elaborator.scala | 2 +- .../src/main/scala/hkmc2/semantics/Term.scala | 5 +++++ .../src/main/scala/hkmc2/syntax/Keyword.scala | 1 + .../main/scala/hkmc2/syntax/ParseRule.scala | 1 + .../src/main/scala/hkmc2/syntax/Tree.scala | 2 ++ .../src/test/mlscript/basics/DataClass.mls | 22 +++++++++++++++++++ .../test/mlscript/basics/GenericClasses.mls | 11 +++++----- 7 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 hkmc2/shared/src/test/mlscript/basics/DataClass.mls diff --git a/hkmc2/shared/src/main/scala/hkmc2/semantics/Elaborator.scala b/hkmc2/shared/src/main/scala/hkmc2/semantics/Elaborator.scala index 9849e6acee..969f60bd85 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/semantics/Elaborator.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/semantics/Elaborator.scala @@ -210,7 +210,7 @@ extends Importer: case _ => trm def annot(tree: Tree): Ctxl[Opt[Annot]] = tree match - case Keywrd(kw @ (Keyword.`abstract` | Keyword.`declare`)) => S(Annot.Modifier(kw)) + case Keywrd(kw @ (Keyword.`abstract` | Keyword.`declare` | Keyword.`data`)) => S(Annot.Modifier(kw)) case _ => term(tree) match case Term.Error => N case trm => diff --git a/hkmc2/shared/src/main/scala/hkmc2/semantics/Term.scala b/hkmc2/shared/src/main/scala/hkmc2/semantics/Term.scala index 9ae8ffbc58..b5a2786413 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/semantics/Term.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/semantics/Term.scala @@ -372,6 +372,11 @@ sealed abstract class ClassDef extends ClassLikeDef: val body: ObjBody val companion: Opt[CompanionValue] val annotations: Ls[Annot] + def isData: Opt[Annot.Modifier] = annotations.collectFirst: + case mod @ Annot.Modifier(Keyword.`data`) => mod + override def extraAnnotations: Ls[Annot] = super.extraAnnotations.filter: + case Annot.Modifier(Keyword.`data`) => false + case _ => true object ClassDef: def apply( diff --git a/hkmc2/shared/src/main/scala/hkmc2/syntax/Keyword.scala b/hkmc2/shared/src/main/scala/hkmc2/syntax/Keyword.scala index 5d2cc56280..40a6685976 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/syntax/Keyword.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/syntax/Keyword.scala @@ -86,6 +86,7 @@ object Keyword: val `out` = Keyword("out", N, curPrec) val `set` = Keyword("set", N, curPrec) val `declare` = Keyword("declare", N, N) + val `data` = Keyword("data", N, N) val `trait` = Keyword("trait", N, N) val `mixin` = Keyword("mixin", N, N) val `interface` = Keyword("interface", N, N) diff --git a/hkmc2/shared/src/main/scala/hkmc2/syntax/ParseRule.scala b/hkmc2/shared/src/main/scala/hkmc2/syntax/ParseRule.scala index 867ebd2b37..2736a1e75e 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/syntax/ParseRule.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/syntax/ParseRule.scala @@ -319,6 +319,7 @@ class ParseRules(using State): modified(`virtual`), modified(`override`), modified(`declare`), + modified(`data`), modified(`public`), modified(`private`), modified(`out`), diff --git a/hkmc2/shared/src/main/scala/hkmc2/syntax/Tree.scala b/hkmc2/shared/src/main/scala/hkmc2/syntax/Tree.scala index 066bcd8d6e..6bb4f10aeb 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/syntax/Tree.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/syntax/Tree.scala @@ -186,6 +186,8 @@ enum Tree extends AutoLocated: m match case Modified(Keyword.`declare`, modLoc, s) => Annotated(Keywrd(Keyword.`declare`), s.desugared) // TODO properly attach location + case Modified(Keyword.`data`, modLoc, s) => + Annotated(Keywrd(Keyword.`data`), s.desugared) // TODO properly attach location case Modified(Keyword.`abstract`, modLoc, s) => Annotated(Keywrd(Keyword.`abstract`), s.desugared) // TODO properly attach location case Modified(Keyword.`mut`, modLoc, TermDef(ImmutVal, anme, rhs)) => diff --git a/hkmc2/shared/src/test/mlscript/basics/DataClass.mls b/hkmc2/shared/src/test/mlscript/basics/DataClass.mls new file mode 100644 index 0000000000..ba2c1fe1aa --- /dev/null +++ b/hkmc2/shared/src/test/mlscript/basics/DataClass.mls @@ -0,0 +1,22 @@ +:js + + +data class Foo(x: Int) + +Foo(1).x +//│ = 1 + + +// TODO: support? +:todo +data Foo(x: Int) +//│ ╔══[ERROR] Name not found: x +//│ ║ l.12: data Foo(x: Int) +//│ ╙── ^ +//│ ╔══[WARNING] This annotation has no effect. +//│ ╟── Such annotations are not supported on application terms. +//│ ║ l.12: data Foo(x: Int) +//│ ╙── ^^^^^^^^^^^ +//│ /!!!\ Uncaught error: scala.NotImplementedError: Other argument forms (of class String) + + diff --git a/hkmc2/shared/src/test/mlscript/basics/GenericClasses.mls b/hkmc2/shared/src/test/mlscript/basics/GenericClasses.mls index ac9f14f113..110ae029b5 100644 --- a/hkmc2/shared/src/test/mlscript/basics/GenericClasses.mls +++ b/hkmc2/shared/src/test/mlscript/basics/GenericClasses.mls @@ -28,24 +28,23 @@ class Foo[A] with // Note: the elaborator elaborates class parameters into additional field definitions; // this is why the following code yields two same errors. -:fixme :e class Foo[A](x: Foo[A, A]) //│ ╔══[ERROR] Wrong number of type arguments -//│ ║ l.33: class Foo[A](x: Foo[A, A]) +//│ ║ l.32: class Foo[A](x: Foo[A, A]) //│ ╙── ^^^^^^^^ //│ ╔══[ERROR] Wrong number of type arguments -//│ ║ l.33: class Foo[A](x: Foo[A, A]) +//│ ║ l.32: class Foo[A](x: Foo[A, A]) //│ ╙── ^^^^^^^^ -:fixme :e class Foo[A](x: Bar[A]) class Bar(x: Foo[Int]) //│ ╔══[ERROR] Wrong number of type arguments -//│ ║ l.43: class Foo[A](x: Bar[A]) +//│ ║ l.41: class Foo[A](x: Bar[A]) //│ ╙── ^^^^^ //│ ╔══[ERROR] Wrong number of type arguments -//│ ║ l.43: class Foo[A](x: Bar[A]) +//│ ║ l.41: class Foo[A](x: Bar[A]) //│ ╙── ^^^^^ + From d2e894dbac48aa0f1e0c377b7307b7d78fb427fb Mon Sep 17 00:00:00 2001 From: Flandia Yingman Date: Fri, 7 Mar 2025 20:07:43 +0800 Subject: [PATCH 05/14] Support data classes --- .../scala/hkmc2/codegen/js/JSBuilder.scala | 8 +- .../scala/hkmc2/semantics/Elaborator.scala | 75 ++++++++++++------- .../src/main/scala/hkmc2/semantics/Term.scala | 7 +- .../src/main/scala/hkmc2/utils/utils.scala | 3 +- .../src/test/mlscript-compile/Option.mls | 4 +- .../src/test/mlscript-compile/Predef.mjs | 37 ++++----- .../src/test/mlscript-compile/Predef.mls | 19 ++--- .../src/test/mlscript-compile/Stack.mls | 2 +- .../test/mlscript-compile/apps/Accounting.mls | 8 +- .../src/test/mlscript-compile/apps/CSV.mls | 2 +- .../src/test/mlscript/backlog/ToTriage.mls | 2 +- .../shared/src/test/mlscript/basics/ADTs.mls | 4 +- .../src/test/mlscript/basics/CyclicValues.mls | 2 +- .../test/mlscript/basics/GenericClasses.mls | 12 +-- .../src/test/mlscript/basics/Inheritance.mls | 7 +- .../mlscript/basics/MemberProjections.mls | 2 +- .../src/test/mlscript/bbml/bbBasics.mls | 14 ++-- .../src/test/mlscript/bbml/bbCodeGen.mls | 4 +- .../src/test/mlscript/bbml/bbDisjoint.mls | 2 +- .../src/test/mlscript/bbml/bbErrors.mls | 2 +- .../src/test/mlscript/bbml/bbExtrude.mls | 2 +- .../shared/src/test/mlscript/bbml/bbList.mls | 2 +- .../src/test/mlscript/bbml/bbOption.mls | 2 +- .../shared/src/test/mlscript/bbml/bbPoly.mls | 8 +- .../src/test/mlscript/bbml/bbPrelude.mls | 9 ++- hkmc2/shared/src/test/mlscript/bbml/bbRec.mls | 2 +- hkmc2/shared/src/test/mlscript/bbml/bbSeq.mls | 2 +- .../src/test/mlscript/bbml/bbSyntax.mls | 20 ++--- .../src/test/mlscript/codegen/CaseOfCase.mls | 2 +- .../test/mlscript/codegen/CaseShorthand.mls | 2 +- .../test/mlscript/codegen/ClassInClass.mls | 4 +- .../src/test/mlscript/codegen/ClassInFun.mls | 4 +- .../test/mlscript/codegen/ClassMatching.mls | 8 +- .../src/test/mlscript/codegen/Classes.mls | 12 +-- .../src/test/mlscript/codegen/ElseLess.mls | 2 +- .../test/mlscript/codegen/FieldSymbols.mls | 2 +- .../src/test/mlscript/codegen/FunInClass.mls | 12 +-- .../src/test/mlscript/codegen/Getters.mls | 4 +- .../src/test/mlscript/codegen/Hygiene.mls | 2 +- .../shared/src/test/mlscript/codegen/Lazy.mls | 2 +- .../src/test/mlscript/codegen/LetPatterns.mls | 4 +- .../test/mlscript/codegen/NestedClasses.mls | 2 +- .../src/test/mlscript/codegen/OptMatch.mls | 4 +- .../test/mlscript/codegen/ParamClasses.mls | 8 +- .../src/test/mlscript/codegen/PartialApps.mls | 2 +- .../test/mlscript/codegen/PlainClasses.mls | 4 +- .../src/test/mlscript/codegen/RandomStuff.mls | 2 +- .../test/mlscript/codegen/SanityChecks.mls | 8 +- .../test/mlscript/codegen/SimplePatMat.mls | 2 +- .../mlscript/codegen/ThisCallVariations.mls | 2 +- .../src/test/mlscript/codegen/TraceLog.mls | 4 +- .../src/test/mlscript/codegen/UnitValue.mls | 2 +- .../src/test/mlscript/codegen/While.mls | 2 +- .../src/test/mlscript/decls/Prelude.mls | 8 +- .../src/test/mlscript/handlers/Effects.mls | 4 +- .../mlscript/handlers/EffectsInClasses.mls | 4 +- .../mlscript/handlers/HandlersInClasses.mls | 2 +- .../mlscript/handlers/ManualStackSafety.mls | 2 - .../test/mlscript/handlers/NestedHandlers.mls | 2 +- .../mlscript/handlers/RecursiveHandlers.mls | 8 +- .../test/mlscript/handlers/StackSafety.mls | 12 +-- .../src/test/mlscript/llir/Playground.mls | 8 +- .../src/test/mlscript/nofib/NofibPrelude.mls | 8 +- hkmc2/shared/src/test/mlscript/nofib/atom.mls | 2 +- .../shared/src/test/mlscript/nofib/boyer.mls | 7 +- .../shared/src/test/mlscript/nofib/boyer2.mls | 59 +++++++++++++-- .../src/test/mlscript/nofib/cichelli.mls | 11 +-- .../src/test/mlscript/nofib/circsim.mls | 9 ++- .../src/test/mlscript/nofib/clausify.mls | 22 +++--- .../src/test/mlscript/nofib/constraints.mls | 8 +- .../src/test/mlscript/nofib/cryptarithm2.mls | 4 +- hkmc2/shared/src/test/mlscript/nofib/cse.mls | 2 +- .../src/test/mlscript/nofib/knights.mls | 2 +- .../shared/src/test/mlscript/nofib/lambda.mls | 19 ++--- .../src/test/mlscript/nofib/last-piece.mls | 39 +++++----- .../shared/src/test/mlscript/nofib/mandel.mls | 4 +- .../src/test/mlscript/nofib/mandel2.mls | 9 ++- hkmc2/shared/src/test/mlscript/nofib/mate.mls | 42 +++++------ .../src/test/mlscript/nofib/minimax.mls | 4 +- .../shared/src/test/mlscript/nofib/power.mls | 2 +- .../shared/src/test/mlscript/nofib/pretty.mls | 13 ++-- .../shared/src/test/mlscript/nofib/puzzle.mls | 2 +- .../src/test/mlscript/nofib/sorting.mls | 23 ++++-- .../shared/src/test/mlscript/nofib/sphere.mls | 28 +++---- .../src/test/mlscript/nofib/treejoin.mls | 9 ++- .../src/test/mlscript/parser/Extends.mls | 10 +-- .../src/test/mlscript/rp/MatchResult.mls | 2 +- .../rp/nondeterminism/BitArithmetic.mls | 9 ++- .../rp/nondeterminism/EvenOddTree.mls | 2 +- .../mlscript/rp/nondeterminism/LaRbTree.mls | 2 +- .../rp/parametric/HigherOrderPattern.mls | 2 +- .../src/test/mlscript/rp/recursion/BitSeq.mls | 2 +- .../test/mlscript/rp/recursion/BitTree.mls | 2 +- .../mlscript/rp/recursion/LeafEvenOddTree.mls | 2 +- .../src/test/mlscript/rp/recursion/NatBox.mls | 2 +- .../test/mlscript/rp/recursion/NullTree.mls | 2 +- .../test/mlscript/rp/recursion/SignBox.mls | 2 +- .../mlscript/rp/specialization/SimpleList.mls | 10 +-- .../test/mlscript/rp/syntax/WrongArity.mls | 10 +-- .../src/test/mlscript/std/Rendering.mls | 2 +- .../syntax/annotations/Declarations.mls | 6 +- .../syntax/annotations/Unsupported.mls | 2 +- .../ucs/examples/BinarySearchTree.mls | 8 +- .../mlscript/ucs/examples/EitherOrBoth.mls | 6 +- .../mlscript/ucs/examples/LeftistTree.mls | 6 +- .../test/mlscript/ucs/examples/SimpleTree.mls | 4 +- .../src/test/mlscript/ucs/future/Or.mls | 2 +- .../mlscript/ucs/future/SymbolicClass.mls | 2 +- .../test/mlscript/ucs/general/CardSuits.mls | 2 +- .../test/mlscript/ucs/general/DualOptions.mls | 4 +- .../mlscript/ucs/general/InterleavedLet.mls | 4 +- .../src/test/mlscript/ucs/general/List.mls | 4 +- .../src/test/mlscript/ucs/general/Simple.mls | 4 +- .../ucs/hygiene/CrossBranchCapture.mls | 6 +- .../src/test/mlscript/ucs/hygiene/Hygiene.mls | 6 +- .../mlscript/ucs/hygiene/HygienicBindings.mls | 8 +- .../ucs/normalization/SimplePairMatches.mls | 2 +- .../ucs/normalization/UnifySubScrutinees.mls | 2 +- .../test/mlscript/ucs/patterns/Literals.mls | 2 +- .../mlscript/ucs/patterns/SimpleTuple.mls | 2 +- .../mlscript/ucs/syntax/PlainConditionals.mls | 4 +- .../test/mlscript/ucs/syntax/SimpleUCS.mls | 20 ++--- 122 files changed, 497 insertions(+), 413 deletions(-) diff --git a/hkmc2/shared/src/main/scala/hkmc2/codegen/js/JSBuilder.scala b/hkmc2/shared/src/main/scala/hkmc2/codegen/js/JSBuilder.scala index 26c6e0b5dd..42829ea73c 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/codegen/js/JSBuilder.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/codegen/js/JSBuilder.scala @@ -188,6 +188,10 @@ class JSBuilder(using TL, State, Ctx) extends CodeBuilder: // * Note: `_pubFlds` is not used because in JS, fields are not declared val clsParams = paramsOpt.fold(Nil)(_.paramSyms) val ctorParams = clsParams.map(p => p -> scope.allocateName(p)) + val ctorFields = ctorParams.filter: p => + p._1.decl match + case S(Param(flags = FldFlags(value = true))) => true + case _ => false val isModule = kind is syntax.Mod val mtdPrefix = if isModule then "static " else "" val privs = @@ -237,9 +241,9 @@ class JSBuilder(using TL, State, Ctx) extends CodeBuilder: else doc""" # ${mtdPrefix}toString() { return "${sym.nme}${ if paramsOpt.isEmpty then doc""""""" else doc"""(" + ${ - ctorParams.headOption.fold("\"\"")("globalThis.Predef.render(this." + _._1.name + ")") + ctorFields.headOption.fold("\"\"")("globalThis.Predef.render(this." + _._1.name + ")") }${ - ctorParams.tailOption.fold("")(_.map( + ctorFields.tailOption.fold("")(_.map( """ + ", " + globalThis.Predef.render(this.""" + _._1.name + ")").mkString) } + ")"""" }; }""" diff --git a/hkmc2/shared/src/main/scala/hkmc2/semantics/Elaborator.scala b/hkmc2/shared/src/main/scala/hkmc2/semantics/Elaborator.scala index 969f60bd85..a0accdfab7 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/semantics/Elaborator.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/semantics/Elaborator.scala @@ -375,7 +375,7 @@ extends Importer: Term.FunTy(term(lhs), term(rhs), N) case InfixApp(lhs, Keyword.`=>`, rhs) => ctx.nest(N).givenIn: - val (syms, nestCtx) = params(lhs) + val (syms, nestCtx) = params(lhs, false) Term.Lam(syms, term(rhs)(using nestCtx)) case InfixApp(lhs, Keyword.`:`, rhs) => Term.Asc(term(lhs), term(rhs)) @@ -894,7 +894,7 @@ extends Importer: // * Add parameters to context var newCtx = newCtx1 val pss = td.paramLists.map: ps => - val (res, newCtx2) = params(ps)(using newCtx) + val (res, newCtx2) = params(ps, false)(using newCtx) newCtx = newCtx2 res // * Elaborate signature @@ -972,6 +972,9 @@ extends Importer: res :: Nil case N => Nil newCtx ++= tps.map(tp => tp.sym.name -> tp.sym) // TODO: correct ++? + val isDataClass = annotations.exists: + case Annot.Modifier(Keyword.`data`) => true + case _ => false val ps = td.paramLists.match case Nil => N @@ -985,35 +988,49 @@ extends Importer: .map: ps => val (res, newCtx2) = given Ctx = newCtx - params(ps) + params(ps, isDataClass) newCtx = newCtx2 res def withFields(using Ctx)(fn: (Ctx) ?=> (Term.Blk, Ctx)): (Term.Blk, Ctx) = - val fields = ps.map: ps => - ps.params.map: p => + val fields: Opt[List[TermDefinition | LetDecl | DefineVar]] = ps.map: ps => + ps.params.flatMap: p => // For class-like types, "desugar" the parameters into additional class fields. val owner = td.symbol match // Any MemberSymbol should be an InnerSymbol, except for TypeAliasSymbol, // but type aliases should not call this function. case s: InnerSymbol => S(s) case _: TypeAliasSymbol => die - val fsym = BlockMemberSymbol(p.sym.nme, Nil) - val fdef = TermDefinition( - owner, - ImmutVal, - fsym, - Nil, N, p.sign, - S(Term.Ref(p.sym)(p.sym.id, 666)), // FIXME: 666 is a dummy value - FlowSymbol("‹class-param-res›"), - TermDefFlags.empty.copy(isModMember = k is Mod), - Nil - ) - sym.defn = S(fdef) - fdef - val ctxWithFields = ctx.withMembers( - fields.fold(Nil)(_.map(f => f.sym.nme -> f.sym)), - ctx.outer - ) + + if p.flags.value || isDataClass then + val fsym = BlockMemberSymbol(p.sym.nme, Nil) + val fdef = TermDefinition( + owner, + ImmutVal, + fsym, + Nil, N, N, + S(Term.Ref(p.sym)(p.sym.id, 666)), // FIXME: 666 is a dummy value + FlowSymbol("‹class-param-res›"), + TermDefFlags.empty.copy(isModMember = k is Mod), + Nil + ) + sym.defn = S(fdef) + fdef :: Nil + else + val psym = TermSymbol(LetBind, owner, p.sym.id) + val decl = LetDecl(psym, Nil) + val defn = DefineVar(psym, Term.Ref(p.sym)(p.sym.id, 666)) // FIXME: 666 is a dummy value + decl :: defn :: Nil + + val ctxWithFields = ctx + .withMembers( + fields.fold(Nil)(_.collect: + case f: TermDefinition => f.sym.nme -> f.sym // class fields + ), + ctx.outer + ) ++ fields.fold(Nil)(_.collect: + case d: LetDecl => d.sym.nme -> d.sym // class params + ) + val ctxWithLets = ctx val (blk, c) = fn(using ctxWithFields) val blkWithFields = fields.fold[Term.Blk](blk)(fs => blk.copy(stats = fs ::: blk.stats)) (blkWithFields, c) @@ -1039,8 +1056,8 @@ extends Importer: case S(tree) => val (patternParams, extractionParams) = ps match // Filter out pattern parameters. case S(ParamList(_, params, _)) => params.partition: - case param @ Param(FldFlags(false, false, false, false, true), _, _) => true - case param @ Param(FldFlags(_, _, _, _, false), _, _) => false + case param @ Param(FldFlags(false, false, false, false, true, false), _, _) => true + case param @ Param(FldFlags(_, _, _, _, false, _), _, _) => false case N => (Nil, Nil) // TODO: Implement extraction parameters. if extractionParams.nonEmpty then @@ -1127,7 +1144,7 @@ extends Importer: if ctx.outer.isDefined then TermSymbol(k, ctx.outer, id) else VarSymbol(id) - def param(t: Tree, inUsing: Bool): Ctxl[Opt[Opt[Bool] -> Param]] = + def param(t: Tree, inUsing: Bool, inDataClass: Bool): Ctxl[Opt[Opt[Bool] -> Param]] = def go(t: Tree, inUsing: Bool, flags: FldFlags): Ctxl[Opt[Opt[Bool] -> Param]] = t match case TypeDef(Mod, inner, N, N) => val ps = go(inner, inUsing, flags.copy(mod = true)) @@ -1140,6 +1157,8 @@ extends Importer: ps case TypeDef(Pat, inner, N, N) => go(inner, inUsing, flags.copy(pat = true)) + case TermDef(ImmutVal, inner, _) => + go(inner, inUsing, flags.copy(value = true)) case _ => t.asParam(inUsing).map: (isSpd, p, t) => val sym = VarSymbol(p) @@ -1147,16 +1166,16 @@ extends Importer: val param = Param(flags, sym, sign) sym.decl = S(param) isSpd -> param - go(t, inUsing, FldFlags.empty) + go(t, inUsing, if inDataClass then FldFlags.empty.copy(value = true) else FldFlags.empty) - def params(t: Tree): Ctxl[(ParamList, Ctx)] = t match + def params(t: Tree, inDataClass: Bool): Ctxl[(ParamList, Ctx)] = t match case Tup(ps) => def go(ps: Ls[Tree], acc: Ls[Param], ctx: Ctx, flags: ParamListFlags): (ParamList, Ctx) = ps match case Nil => (ParamList(flags, acc.reverse, N), ctx) case hd :: tl => - param(hd, flags.ctx)(using ctx) match + param(hd, flags.ctx, inDataClass)(using ctx) match case S((isSpd, p)) => val isCtx = hd match case Modified(Keyword.`using`, _, _) => true diff --git a/hkmc2/shared/src/main/scala/hkmc2/semantics/Term.scala b/hkmc2/shared/src/main/scala/hkmc2/semantics/Term.scala index b5a2786413..6864d0314d 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/semantics/Term.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/semantics/Term.scala @@ -334,7 +334,7 @@ sealed abstract class ClassLikeDef extends TypeLikeDef: val body: ObjBody val annotations: Ls[Annot] def extraAnnotations: Ls[Annot] = annotations.filter: - case Annot.Modifier(Keyword.`declare` | Keyword.`abstract`) => false + case Annot.Modifier(Keyword.`declare` | Keyword.`abstract` | Keyword.`data`) => false case _ => true @@ -439,7 +439,7 @@ case class TypeDef( // TODO Store optional source locations for the flags instead of booleans -final case class FldFlags(mut: Bool, spec: Bool, genGetter: Bool, mod: Bool, pat: Bool): +final case class FldFlags(mut: Bool, spec: Bool, genGetter: Bool, mod: Bool, pat: Bool, value: Bool): def showDbg: Str = val flags = Buffer.empty[String] if mut then flags += "mut" @@ -447,11 +447,12 @@ final case class FldFlags(mut: Bool, spec: Bool, genGetter: Bool, mod: Bool, pat if genGetter then flags += "gen" if mod then flags += "module" if pat then flags += "pattern" + if value then flags += "val" flags.mkString(" ") override def toString: String = "‹" + showDbg + "›" object FldFlags: - val empty: FldFlags = FldFlags(false, false, false, false, false) + val empty: FldFlags = FldFlags(false, false, false, false, false, false) object benign: // * Some flags like `mut` and `module` are "benign" in the sense that they don't affect code-gen def unapply(flags: FldFlags): Bool = diff --git a/hkmc2/shared/src/main/scala/hkmc2/utils/utils.scala b/hkmc2/shared/src/main/scala/hkmc2/utils/utils.scala index c72db3db4a..9703aba4d1 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/utils/utils.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/utils/utils.scala @@ -48,13 +48,14 @@ extension (t: Product) if isModMember then flags += "modMember" if isModMember then flags += "modTyped" flags.mkString("(", ", ", ")") - case FldFlags(mut, spec, genGetter, mod, pat) => + case FldFlags(mut, spec, genGetter, mod, pat, value) => val flags = Buffer.empty[String] if mut then flags += "mut" if spec then flags += "spec" if genGetter then flags += "gen" if mod then flags += "module" if pat then flags += "pat" + if value then flags += "val" flags.mkString("(", ", ", ")") case ParamListFlags(ctx) => val flags = Buffer.empty[String] diff --git a/hkmc2/shared/src/test/mlscript-compile/Option.mls b/hkmc2/shared/src/test/mlscript-compile/Option.mls index 59edab71fd..a46f2e6fa5 100644 --- a/hkmc2/shared/src/test/mlscript-compile/Option.mls +++ b/hkmc2/shared/src/test/mlscript-compile/Option.mls @@ -8,7 +8,7 @@ open Predef module Option with ... -class Some(value) +data class Some(value) object None fun isDefined(x) = if x is @@ -17,6 +17,6 @@ fun isDefined(x) = if x is fun test() = 2134 |> print -class Both(fst, snd) +data class Both(fst, snd) diff --git a/hkmc2/shared/src/test/mlscript-compile/Predef.mjs b/hkmc2/shared/src/test/mlscript-compile/Predef.mjs index fa8546ea59..5e78b2f9ea 100644 --- a/hkmc2/shared/src/test/mlscript-compile/Predef.mjs +++ b/hkmc2/shared/src/test/mlscript-compile/Predef.mjs @@ -578,7 +578,7 @@ Predef1 = class Predef { } static __resume(cur2, tail) { return (value) => { - let scrut, cont1, scrut1, scrut2, scrut3, scrut4, scrut5, scrut6, tmp, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9; + let scrut, cont1, scrut1, scrut2, scrut3, scrut4, scrut5, scrut6, tmp, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9, tmp10; scrut = cur2.resumed; if (scrut === true) { throw globalThis.Error("Multiple resumption"); @@ -587,7 +587,7 @@ Predef1 = class Predef { } cur2.resumed = true; cont1 = cur2.next; - tmp10: while (true) { + tmp11: while (true) { if (cont1 instanceof Predef.__Cont.class) { tmp1 = runtime.safeCall(cont1.resume(value)); value = tmp1; @@ -598,42 +598,43 @@ Predef1 = class Predef { if (scrut2 === true) { scrut3 = value.tail.next !== null; if (scrut3 === true) { + tmp2 = runtime.safeCall(globalThis.console.log(value.tail)); throw globalThis.Error("Internal Error: unexpected continuation"); } else { - tmp2 = runtime.Unit; + tmp3 = runtime.Unit; } } else { - tmp2 = runtime.Unit; + tmp3 = runtime.Unit; } - tmp3 = tmp2; + tmp4 = tmp3; } else { - tmp3 = runtime.Unit; + tmp4 = runtime.Unit; } scrut4 = value.tail.next === null; if (scrut4 === true) { value.tail.next = cont1.next; - tmp4 = runtime.Unit; + tmp5 = runtime.Unit; } else { - tmp4 = runtime.Unit; + tmp5 = runtime.Unit; } value.tail = tail; scrut5 = cur2.handleBlockList.next !== null; if (scrut5 === true) { value.handleBlockList.tail.next = cur2.handleBlockList.next; value.handleBlockList.tail = cur2.handleBlockList.tail; - tmp5 = runtime.Unit; + tmp6 = runtime.Unit; } else { - tmp5 = runtime.Unit; + tmp6 = runtime.Unit; } return value } else { cont1 = cont1.next; - tmp6 = runtime.Unit; + tmp7 = runtime.Unit; } - tmp7 = tmp6; - continue tmp10; + tmp8 = tmp7; + continue tmp11; } else { - tmp7 = runtime.Unit; + tmp8 = runtime.Unit; } break; } @@ -641,13 +642,13 @@ Predef1 = class Predef { if (scrut6 === true) { return value } else { - tmp8 = Predef.__resumeHandleBlocks(cur2.handleBlockList.next, cur2.handleBlockList.tail, value); - cur2 = tmp8; + tmp9 = Predef.__resumeHandleBlocks(cur2.handleBlockList.next, cur2.handleBlockList.tail, value); + cur2 = tmp9; if (cur2 instanceof Predef.__EffectSig.class) { cur2.tail = tail; - tmp9 = runtime.Unit; + tmp10 = runtime.Unit; } else { - tmp9 = runtime.Unit; + tmp10 = runtime.Unit; } return cur2 } diff --git a/hkmc2/shared/src/test/mlscript-compile/Predef.mls b/hkmc2/shared/src/test/mlscript-compile/Predef.mls index dfb9e1790d..e09abf7265 100644 --- a/hkmc2/shared/src/test/mlscript-compile/Predef.mls +++ b/hkmc2/shared/src/test/mlscript-compile/Predef.mls @@ -116,8 +116,8 @@ fun stringGet(string, i) = string.at(i) fun stringDrop(string, n) = string.slice(n) -class MatchResult(captures) -class MatchFailure(errors) +data class MatchResult(captures) +data class MatchFailure(errors) fun unreachable = throw Error("unreachable") @@ -155,18 +155,18 @@ module TraceLogger with else () -class Test with +data class Test with print("Test") val y = 1 // Private definitions for algebraic effects -abstract class __Cont(next) with +abstract class __Cont(val next) with fun resume(value) -class __TailList(next) +data class __TailList(next) -class __ListWithTail(next, tail) with +data class __ListWithTail(next, tail) with fun append(elem) = set tail.next = elem set tail = elem @@ -175,10 +175,10 @@ fun __mkListWithTail() = set res.tail = res res -class __HandleBlock(contHead, lastHandlerCont, next, handler) +data class __HandleBlock(contHead, lastHandlerCont, next, handler) -class __EffectSig(next, tail, handleBlockList, resumed, handler, handlerFun) -class __Return(value) +data class __EffectSig(next, tail, handleBlockList, resumed, handler, handlerFun) +data class __Return(value) fun __appendInCont(eff, cont) = if eff.tail is __TailList then @@ -267,6 +267,7 @@ fun __resume(cur, tail)(value) = if value is __EffectSig then if value.tail.next !== cont do if cont.next !== null and value.tail.next !== null do + console.log(value.tail) throw Error("Internal Error: unexpected continuation") // in tail call optimization, the continuation is not appended, we append it here if value.tail.next === null do diff --git a/hkmc2/shared/src/test/mlscript-compile/Stack.mls b/hkmc2/shared/src/test/mlscript-compile/Stack.mls index f0652490f1..38435b77e4 100644 --- a/hkmc2/shared/src/test/mlscript-compile/Stack.mls +++ b/hkmc2/shared/src/test/mlscript-compile/Stack.mls @@ -8,7 +8,7 @@ open Predef module Stack[T] with ... -class (::) Cons[A](head: A, tail: Stack[A]) +data class (::) Cons[A](head: A, tail: Stack[A]) object Nil fun isEmpty(xs) = xs is Nil diff --git a/hkmc2/shared/src/test/mlscript-compile/apps/Accounting.mls b/hkmc2/shared/src/test/mlscript-compile/apps/Accounting.mls index 3e7aaeea34..4f9cfaa3da 100644 --- a/hkmc2/shared/src/test/mlscript-compile/apps/Accounting.mls +++ b/hkmc2/shared/src/test/mlscript-compile/apps/Accounting.mls @@ -14,7 +14,7 @@ declare class Bool declare val String -class Accounting with ... +data class Accounting with ... fun display(amt): Str = (amt / 1000).toFixed(1) @@ -22,10 +22,10 @@ fun display(amt): Str = (amt / 1000).toFixed(1) val warnings = [] -class Project(val num: Str) +data class Project(val num: Str) -class Line(val name: Str, val proj: Project, val starting_balance: Num, val isMatchable: Bool) with +data class Line(val name: Str, val proj: Project, val starting_balance: Num, val isMatchable: Bool) with mut val balance = starting_balance fun expense(amt) = set balance = balance -. amt @@ -41,7 +41,7 @@ fun mkLine(nme, proj, starting_balance, matchable) = line -class Report(fileName) with +data class Report(fileName) with fs.writeFileSync(fileName, "# Accounting\n") diff --git a/hkmc2/shared/src/test/mlscript-compile/apps/CSV.mls b/hkmc2/shared/src/test/mlscript-compile/apps/CSV.mls index b8b1250cc7..02e91a656b 100644 --- a/hkmc2/shared/src/test/mlscript-compile/apps/CSV.mls +++ b/hkmc2/shared/src/test/mlscript-compile/apps/CSV.mls @@ -10,7 +10,7 @@ open Predef // The default delimiter is the comma, but this can be overriden here. -class CSV(strDelimiter) with ... +data class CSV(strDelimiter) with ... // Check to see if the delimiter is defined. If not, then default to comma. diff --git a/hkmc2/shared/src/test/mlscript/backlog/ToTriage.mls b/hkmc2/shared/src/test/mlscript/backlog/ToTriage.mls index eb6abf8df5..761c845abf 100644 --- a/hkmc2/shared/src/test/mlscript/backlog/ToTriage.mls +++ b/hkmc2/shared/src/test/mlscript/backlog/ToTriage.mls @@ -231,7 +231,7 @@ fun main() = // * Or these parameters should have default values. :sjs -object Cls(x) with +data object Cls(x) with fun huh = x //│ JS (unsanitized): //│ let Cls1; diff --git a/hkmc2/shared/src/test/mlscript/basics/ADTs.mls b/hkmc2/shared/src/test/mlscript/basics/ADTs.mls index 7531250777..15612dbc5b 100644 --- a/hkmc2/shared/src/test/mlscript/basics/ADTs.mls +++ b/hkmc2/shared/src/test/mlscript/basics/ADTs.mls @@ -20,8 +20,8 @@ class Expr[A] with // * one can also go the TypeScript way -class Lit(n: Int) -class Add(lhs: Expr, rhs: Expr) +data class Lit(n: Int) +data class Add(lhs: Expr, rhs: Expr) type Expr = Lit | Add diff --git a/hkmc2/shared/src/test/mlscript/basics/CyclicValues.mls b/hkmc2/shared/src/test/mlscript/basics/CyclicValues.mls index 4bad38fe31..07e0aab479 100644 --- a/hkmc2/shared/src/test/mlscript/basics/CyclicValues.mls +++ b/hkmc2/shared/src/test/mlscript/basics/CyclicValues.mls @@ -1,7 +1,7 @@ :js -class Foo(x) +data class Foo(x) let foo = Foo(null) //│ foo = Foo(null) diff --git a/hkmc2/shared/src/test/mlscript/basics/GenericClasses.mls b/hkmc2/shared/src/test/mlscript/basics/GenericClasses.mls index 110ae029b5..5e0e12ad57 100644 --- a/hkmc2/shared/src/test/mlscript/basics/GenericClasses.mls +++ b/hkmc2/shared/src/test/mlscript/basics/GenericClasses.mls @@ -25,26 +25,18 @@ class Foo[A] with -// Note: the elaborator elaborates class parameters into additional field definitions; -// this is why the following code yields two same errors. :e class Foo[A](x: Foo[A, A]) //│ ╔══[ERROR] Wrong number of type arguments -//│ ║ l.32: class Foo[A](x: Foo[A, A]) -//│ ╙── ^^^^^^^^ -//│ ╔══[ERROR] Wrong number of type arguments -//│ ║ l.32: class Foo[A](x: Foo[A, A]) +//│ ║ l.30: class Foo[A](x: Foo[A, A]) //│ ╙── ^^^^^^^^ :e class Foo[A](x: Bar[A]) class Bar(x: Foo[Int]) //│ ╔══[ERROR] Wrong number of type arguments -//│ ║ l.41: class Foo[A](x: Bar[A]) -//│ ╙── ^^^^^ -//│ ╔══[ERROR] Wrong number of type arguments -//│ ║ l.41: class Foo[A](x: Bar[A]) +//│ ║ l.36: class Foo[A](x: Bar[A]) //│ ╙── ^^^^^ diff --git a/hkmc2/shared/src/test/mlscript/basics/Inheritance.mls b/hkmc2/shared/src/test/mlscript/basics/Inheritance.mls index ab7051f3af..93905ba6b1 100644 --- a/hkmc2/shared/src/test/mlscript/basics/Inheritance.mls +++ b/hkmc2/shared/src/test/mlscript/basics/Inheritance.mls @@ -31,7 +31,7 @@ Bar is String // :pt // :elt // :de -class Bar(y) extends Foo with +data class Bar(y) extends Foo with fun bar = y + 1 let b = Bar(42) @@ -47,9 +47,8 @@ b is String //│ = [10, 11] -// FIXME: in super calls, class params should actually be viewed as a `VarSymbol`, not a `TermSymbol` wit owner :sjs -class Baz(z) extends Bar(z * 1) with +data class Baz(z) extends Bar(z * 1) with fun baz = this.bar * 2 //│ JS (unsanitized): //│ let Baz1; @@ -83,7 +82,7 @@ b is String abstract class Option[out T]: Some[T] | None object None extends Option[Nothing] -class Some[out T](x: T) extends Option[T] +data class Some[out T](x: T) extends Option[T] [Some(123) is Option, None is Option, Some(123) is String, None is String] //│ = [true, true, false, false] diff --git a/hkmc2/shared/src/test/mlscript/basics/MemberProjections.mls b/hkmc2/shared/src/test/mlscript/basics/MemberProjections.mls index 928a2ded43..6ba9072915 100644 --- a/hkmc2/shared/src/test/mlscript/basics/MemberProjections.mls +++ b/hkmc2/shared/src/test/mlscript/basics/MemberProjections.mls @@ -2,7 +2,7 @@ module M with - class Foo(x) with + data class Foo(x) with fun m() = this.x + 1 fun n(y) = this.x + y diff --git a/hkmc2/shared/src/test/mlscript/bbml/bbBasics.mls b/hkmc2/shared/src/test/mlscript/bbml/bbBasics.mls index eae45c3181..7e27f05e08 100644 --- a/hkmc2/shared/src/test/mlscript/bbml/bbBasics.mls +++ b/hkmc2/shared/src/test/mlscript/bbml/bbBasics.mls @@ -66,7 +66,7 @@ let x = 0 in x + "1" //│ ╙── because: cannot constrain Str <: Int //│ Type: Int -class Foo(x: Int) +data class Foo(x: Int) //│ Type: ⊤ :e @@ -89,7 +89,7 @@ new Foo(42) //│ Type: Foo -class Point(x: Num, y: Num, z: Num) +data class Point(x: Num, y: Num, z: Num) //│ Type: ⊤ @@ -105,7 +105,7 @@ new Foo("1!5!") //│ Type: Foo -class Some[A](value: A) +data class Some[A](value: A) //│ Type: ⊤ new Some(true) @@ -142,7 +142,7 @@ let t = new Some(true) in t.Some#value //│ Type: ⊥ -class Printer[T](f: T -> Str) +data class Printer[T](f: T -> Str) //│ Type: ⊤ fun foofoo(x) = @@ -169,7 +169,7 @@ let ip = new Printer(foofoo) in ip.Printer#f("42") //│ ╙── because: cannot constrain Str <: ¬(¬{Int}) //│ Type: Str -class TFun[T](f: T -> T) +data class TFun[T](f: T -> T) //│ Type: ⊤ fun inc(x) = x + 1 @@ -196,7 +196,7 @@ let tf = new TFun(inc) in tf.TFun#f("1") //│ ╙── because: cannot constrain Str <: ¬(¬{Int}) //│ Type: Str ∨ Int -class Pair[A, B](fst: A, snd: B) +data class Pair[A, B](fst: A, snd: B) //│ Type: ⊤ (new Pair(42, true)).Pair#fst @@ -284,7 +284,7 @@ fact2(0) //│ Type: Int -class Foo[A](x: A -> A) +data class Foo[A](x: A -> A) //│ Type: ⊤ new Foo(x => x) diff --git a/hkmc2/shared/src/test/mlscript/bbml/bbCodeGen.mls b/hkmc2/shared/src/test/mlscript/bbml/bbCodeGen.mls index 0f0ce93bcf..d51edf155a 100644 --- a/hkmc2/shared/src/test/mlscript/bbml/bbCodeGen.mls +++ b/hkmc2/shared/src/test/mlscript/bbml/bbCodeGen.mls @@ -59,7 +59,7 @@ false :sjs -class Foo(x: Int) +data class Foo(x: Int) //│ JS (unsanitized): //│ let Foo1; //│ Foo1 = function Foo(x2) { return new Foo.class(x2); }; @@ -119,7 +119,7 @@ if 1 is Int then 1 else 0 //│ Type: Int -class Foo() +data class Foo() //│ Type: ⊤ diff --git a/hkmc2/shared/src/test/mlscript/bbml/bbDisjoint.mls b/hkmc2/shared/src/test/mlscript/bbml/bbDisjoint.mls index 660e6c78e1..7ee3c2aab1 100644 --- a/hkmc2/shared/src/test/mlscript/bbml/bbDisjoint.mls +++ b/hkmc2/shared/src/test/mlscript/bbml/bbDisjoint.mls @@ -4,7 +4,7 @@ //│ Type: ⊤ -class Pair[P, Q](fst: P, snd: Q) +data class Pair[P, Q](fst: P, snd: Q) //│ Type: ⊤ fun fork: [A, B extends ~A, T1, T2] -> (Any ->{A} T1, Any ->{B} T2) ->{A | B} Pair[out T1, out T2] diff --git a/hkmc2/shared/src/test/mlscript/bbml/bbErrors.mls b/hkmc2/shared/src/test/mlscript/bbml/bbErrors.mls index 5ea6f59bd7..8092960c04 100644 --- a/hkmc2/shared/src/test/mlscript/bbml/bbErrors.mls +++ b/hkmc2/shared/src/test/mlscript/bbml/bbErrors.mls @@ -41,7 +41,7 @@ Oops().Oops#a() //│ ╙── ^^^^^ //│ Type: ⊥ -class Oops2() +data class Oops2() (new Oops2()).Oops2#a() //│ ╔══[ERROR] Class 'Oops2' does not contain member 'a'. //│ ║ l.45: (new Oops2()).Oops2#a() diff --git a/hkmc2/shared/src/test/mlscript/bbml/bbExtrude.mls b/hkmc2/shared/src/test/mlscript/bbml/bbExtrude.mls index cc18c0b9e9..dc4f7388d7 100644 --- a/hkmc2/shared/src/test/mlscript/bbml/bbExtrude.mls +++ b/hkmc2/shared/src/test/mlscript/bbml/bbExtrude.mls @@ -48,7 +48,7 @@ y `=> (let t = run(x `=> x `+ y) in y) //│ Where: //│ 'y <: Int -class C[A](m: A, n: A -> Int) +data class C[A](m: A, n: A -> Int) //│ Type: ⊤ diff --git a/hkmc2/shared/src/test/mlscript/bbml/bbList.mls b/hkmc2/shared/src/test/mlscript/bbml/bbList.mls index 3b32072f6e..d88a66cf24 100644 --- a/hkmc2/shared/src/test/mlscript/bbml/bbList.mls +++ b/hkmc2/shared/src/test/mlscript/bbml/bbList.mls @@ -4,7 +4,7 @@ //│ Type: ⊤ -class List[A](inspect: [E, Res] -> (() ->{E} Res, (A, List[A]) ->{E} Res) ->{E} Res) +data class List[A](inspect: [E, Res] -> (() ->{E} Res, (A, List[A]) ->{E} Res) ->{E} Res) //│ Type: ⊤ fun map: [A, B, E] -> List[out A] -> (A ->{E} B) ->{E} List[out B] diff --git a/hkmc2/shared/src/test/mlscript/bbml/bbOption.mls b/hkmc2/shared/src/test/mlscript/bbml/bbOption.mls index 1f14dd5831..4725d98ff9 100644 --- a/hkmc2/shared/src/test/mlscript/bbml/bbOption.mls +++ b/hkmc2/shared/src/test/mlscript/bbml/bbOption.mls @@ -3,7 +3,7 @@ //│ Type: ⊤ -class Option[out A](inspect: [E, Res] -> (() ->{E} Res, A ->{E} Res) ->{E} Res) +data class Option[out A](inspect: [E, Res] -> (() ->{E} Res, A ->{E} Res) ->{E} Res) //│ Type: ⊤ opt => opt.Option#inspect diff --git a/hkmc2/shared/src/test/mlscript/bbml/bbPoly.mls b/hkmc2/shared/src/test/mlscript/bbml/bbPoly.mls index b7937e7c64..f0db91de17 100644 --- a/hkmc2/shared/src/test/mlscript/bbml/bbPoly.mls +++ b/hkmc2/shared/src/test/mlscript/bbml/bbPoly.mls @@ -60,7 +60,7 @@ id("abc") //│ Type: Str -class Pair[A, B](a: A, b: B) +data class Pair[A, B](a: A, b: B) //│ Type: ⊤ new Pair(42, true) @@ -102,7 +102,7 @@ foo(id) foo(x => x) //│ Type: Int -class Foo(foo: [A] -> A -> A) +data class Foo(foo: [A] -> A -> A) //│ Type: ⊤ new Foo(id) @@ -115,7 +115,7 @@ new Foo(x => x) let foo = new Foo(id) in foo.Foo#foo(42) //│ Type: Int -class Bar[A](x: A, f: [B] -> B -> B) +data class Bar[A](x: A, f: [B] -> B -> B) //│ Type: ⊤ @@ -127,7 +127,7 @@ new Bar(0, id) let bar = new Bar(0, id) in bar.Bar#f(bar.Bar#x) //│ Type: Int -class Some[A](value: A) +data class Some[A](value: A) //│ Type: ⊤ new Some((x => x): [A] -> A -> A) diff --git a/hkmc2/shared/src/test/mlscript/bbml/bbPrelude.mls b/hkmc2/shared/src/test/mlscript/bbml/bbPrelude.mls index fa31413c4f..8f91548bfb 100644 --- a/hkmc2/shared/src/test/mlscript/bbml/bbPrelude.mls +++ b/hkmc2/shared/src/test/mlscript/bbml/bbPrelude.mls @@ -12,10 +12,11 @@ declare class Bool declare class Int declare class Num -class - CodeBase[T, C, S] - Region[T] - Ref[T, S](reg: Region[T], value: S) +data + class + CodeBase[T, C, S] + Region[T] + Ref[T, S](reg: Region[T], value: S) @untyped set diff --git a/hkmc2/shared/src/test/mlscript/bbml/bbRec.mls b/hkmc2/shared/src/test/mlscript/bbml/bbRec.mls index 846ca5bebc..f4e3c9c8cc 100644 --- a/hkmc2/shared/src/test/mlscript/bbml/bbRec.mls +++ b/hkmc2/shared/src/test/mlscript/bbml/bbRec.mls @@ -45,7 +45,7 @@ fun f(x) = f(x.a) //│ Type: ⊤ -class Foo[A](a: A) +data class Foo[A](a: A) //│ Type: ⊤ :todo proper error diff --git a/hkmc2/shared/src/test/mlscript/bbml/bbSeq.mls b/hkmc2/shared/src/test/mlscript/bbml/bbSeq.mls index a6c3bca815..b0cb998168 100644 --- a/hkmc2/shared/src/test/mlscript/bbml/bbSeq.mls +++ b/hkmc2/shared/src/test/mlscript/bbml/bbSeq.mls @@ -4,7 +4,7 @@ //│ Type: ⊤ -class Seq[A, E](next: () ->{E} A) +data class Seq[A, E](next: () ->{E} A) //│ Type: ⊤ fun map: [A, B, E] -> Seq[out A, out E] -> (A ->{E} B) -> Seq[out B, out E] diff --git a/hkmc2/shared/src/test/mlscript/bbml/bbSyntax.mls b/hkmc2/shared/src/test/mlscript/bbml/bbSyntax.mls index 9986e5aa61..e80ac7b06b 100644 --- a/hkmc2/shared/src/test/mlscript/bbml/bbSyntax.mls +++ b/hkmc2/shared/src/test/mlscript/bbml/bbSyntax.mls @@ -3,25 +3,25 @@ :parseOnly //│ Type: ⊤ -class Foo +data class Foo //│ Parsed: -//│ TypeDef(Cls,Ident(Foo),None,None) +//│ Modified(keyword 'data',None,TypeDef(Cls,Ident(Foo),None,None)) -class Bar(x: Int) +data class Bar(x: Int) //│ Parsed: -//│ TypeDef(Cls,App(Ident(Bar),Tup(List(InfixApp(Ident(x),keyword ':',Ident(Int))))),None,None) +//│ Modified(keyword 'data',None,TypeDef(Cls,App(Ident(Bar),Tup(List(InfixApp(Ident(x),keyword ':',Ident(Int))))),None,None)) -class Bar2(x: Int, y: Int) +data class Bar2(x: Int, y: Int) //│ Parsed: -//│ TypeDef(Cls,App(Ident(Bar2),Tup(List(InfixApp(Ident(x),keyword ':',Ident(Int)), InfixApp(Ident(y),keyword ':',Ident(Int))))),None,None) +//│ Modified(keyword 'data',None,TypeDef(Cls,App(Ident(Bar2),Tup(List(InfixApp(Ident(x),keyword ':',Ident(Int)), InfixApp(Ident(y),keyword ':',Ident(Int))))),None,None)) -class Baz[A] +data class Baz[A] //│ Parsed: -//│ TypeDef(Cls,App(Ident(Baz),TyTup(List(Ident(A)))),None,None) +//│ Modified(keyword 'data',None,TypeDef(Cls,App(Ident(Baz),TyTup(List(Ident(A)))),None,None)) -class BazBaz[A](f: A -> A) +data class BazBaz[A](f: A -> A) //│ Parsed: -//│ TypeDef(Cls,App(App(Ident(BazBaz),TyTup(List(Ident(A)))),Tup(List(InfixApp(Ident(f),keyword ':',InfixApp(Tup(List(Ident(A))),keyword '->',Ident(A)))))),None,None) +//│ Modified(keyword 'data',None,TypeDef(Cls,App(App(Ident(BazBaz),TyTup(List(Ident(A)))),Tup(List(InfixApp(Ident(f),keyword ':',InfixApp(Tup(List(Ident(A))),keyword '->',Ident(A)))))),None,None)) Baz[Int] //│ Parsed: diff --git a/hkmc2/shared/src/test/mlscript/codegen/CaseOfCase.mls b/hkmc2/shared/src/test/mlscript/codegen/CaseOfCase.mls index d5d2841254..170fabe387 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/CaseOfCase.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/CaseOfCase.mls @@ -1,7 +1,7 @@ :js -class Some[out A](value: A) +data class Some[out A](value: A) module None diff --git a/hkmc2/shared/src/test/mlscript/codegen/CaseShorthand.mls b/hkmc2/shared/src/test/mlscript/codegen/CaseShorthand.mls index ef9f5554af..5166acc941 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/CaseShorthand.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/CaseShorthand.mls @@ -56,7 +56,7 @@ case //│ (caseScrut) => { if (caseScrut === 0) { return true } else { return false } } //│ = [function block$res10] -class Some(value) +data class Some(value) module None :sjs diff --git a/hkmc2/shared/src/test/mlscript/codegen/ClassInClass.mls b/hkmc2/shared/src/test/mlscript/codegen/ClassInClass.mls index 634885afad..c73ea0f305 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/ClassInClass.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/ClassInClass.mls @@ -2,8 +2,8 @@ :sjs -class Outer(a, b) with - class Inner(c) with +data class Outer(a, b) with + data class Inner(c) with fun i1(d) = [b, c, d] print(a) print(c) diff --git a/hkmc2/shared/src/test/mlscript/codegen/ClassInFun.mls b/hkmc2/shared/src/test/mlscript/codegen/ClassInFun.mls index 6f7dce663f..e4757bb97e 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/ClassInFun.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/ClassInFun.mls @@ -22,7 +22,7 @@ test(12) //│ = C fun test(x) = - class Foo(x) + data class Foo(x) Foo(x).toString() test(3) @@ -30,7 +30,7 @@ test(3) :sjs fun test(x) = - class Foo(a, b) + data class Foo(a, b) Foo(x, x + 1) //│ JS (unsanitized): //│ let test2; diff --git a/hkmc2/shared/src/test/mlscript/codegen/ClassMatching.mls b/hkmc2/shared/src/test/mlscript/codegen/ClassMatching.mls index 34c493439d..bdc7a5b9cc 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/ClassMatching.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/ClassMatching.mls @@ -1,7 +1,7 @@ :js -class Some[out A](value: A) +data class Some[out A](value: A) object None @@ -70,7 +70,7 @@ x => if x is Some(x) then x //│ = [function block$res9] -class C(a) +data class C(a) fun f(x) = if x is C(a) then a else 0 @@ -85,7 +85,7 @@ f(C(27)) module M with - class D(a) + data class D(a) val d = D(27) M.d @@ -154,7 +154,7 @@ f(0) //│ > oops -class Pair[out A, out B](fst: A, snd: B) +data class Pair[out A, out B](fst: A, snd: B) :sjs diff --git a/hkmc2/shared/src/test/mlscript/codegen/Classes.mls b/hkmc2/shared/src/test/mlscript/codegen/Classes.mls index df121e2865..e1fad45e1e 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/Classes.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/Classes.mls @@ -4,7 +4,7 @@ :sjs -class Foo(arguments) +data class Foo(arguments) //│ JS (unsanitized): //│ let Foo1; //│ Foo1 = function Foo(arguments2) { return new Foo.class(arguments2); }; @@ -16,7 +16,7 @@ class Foo(arguments) //│ }; -class Foo(eval) +data class Foo(eval) //│ JS (unsanitized): //│ let Foo3; //│ Foo3 = function Foo(eval2) { return new Foo.class(eval2); }; @@ -28,7 +28,7 @@ class Foo(eval) //│ }; -class Foo(implements) +data class Foo(implements) //│ JS (unsanitized): //│ let Foo5; //│ Foo5 = function Foo(implements2) { return new Foo.class(implements2); }; @@ -40,7 +40,7 @@ class Foo(implements) //│ }; -class Foo(package) +data class Foo(package) //│ JS (unsanitized): //│ let Foo7; //│ Foo7 = function Foo(package2) { return new Foo.class(package2); }; @@ -52,7 +52,7 @@ class Foo(package) //│ }; -class Foo(protected) +data class Foo(protected) //│ JS (unsanitized): //│ let Foo9; //│ Foo9 = function Foo(protected2) { return new Foo.class(protected2); }; @@ -64,7 +64,7 @@ class Foo(protected) //│ }; -class Foo(static) +data class Foo(static) //│ JS (unsanitized): //│ let Foo11; //│ Foo11 = function Foo(static2) { return new Foo.class(static2); }; diff --git a/hkmc2/shared/src/test/mlscript/codegen/ElseLess.mls b/hkmc2/shared/src/test/mlscript/codegen/ElseLess.mls index 44a93ca0e2..47e6789d3a 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/ElseLess.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/ElseLess.mls @@ -1,7 +1,7 @@ :js -class Foo(a) +data class Foo(a) :todo // Treat else-less single-branch UCS as implicitly returning () in default case diff --git a/hkmc2/shared/src/test/mlscript/codegen/FieldSymbols.mls b/hkmc2/shared/src/test/mlscript/codegen/FieldSymbols.mls index 1fd760fb74..fea8f22920 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/FieldSymbols.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/FieldSymbols.mls @@ -1,7 +1,7 @@ :js -class Foo(val x) with +data class Foo(val x) with val y = x diff --git a/hkmc2/shared/src/test/mlscript/codegen/FunInClass.mls b/hkmc2/shared/src/test/mlscript/codegen/FunInClass.mls index 6a1c87d6ac..124804ae7e 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/FunInClass.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/FunInClass.mls @@ -2,7 +2,7 @@ fun test() = - class C(a) with { fun f() = a } + data class C(a) with { fun f() = a } C(0).f() test() @@ -11,7 +11,7 @@ test() :sjs fun test(a) = - class Inner(b) with + data class Inner(b) with print(a) fun f(c) = [a, b, c] fun g(d) = @@ -67,9 +67,9 @@ i.g(200) :sjs fun test(a) = - class C1(b) with + data class C1(b) with print of [a, b] - class C2(b) with + data class C2(b) with print of [a, b] [C1(1), C2(2)] //│ JS (unsanitized): @@ -113,7 +113,7 @@ test(123) :sjs -class Foo(a) with +data class Foo(a) with fun foo() = fun bar() = a fun baz() = a @@ -147,7 +147,7 @@ Foo(123) //│ = Foo(123) :sjs -class Bar(x) with +data class Bar(x) with fun foo()() = fun bar() = x diff --git a/hkmc2/shared/src/test/mlscript/codegen/Getters.mls b/hkmc2/shared/src/test/mlscript/codegen/Getters.mls index 08dd86a0ad..84018826e8 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/Getters.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/Getters.mls @@ -272,7 +272,7 @@ c() :sjs -class Foo(x) with +data class Foo(x) with fun oops = x //│ JS (unsanitized): //│ let Foo1; @@ -299,7 +299,7 @@ foo(Foo(42)) fun foo(f) = f.oops -class Foo(x) with +data class Foo(x) with fun oops = x foo(Foo(42)) diff --git a/hkmc2/shared/src/test/mlscript/codegen/Hygiene.mls b/hkmc2/shared/src/test/mlscript/codegen/Hygiene.mls index 6f377ac6d1..724854335f 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/Hygiene.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/Hygiene.mls @@ -95,7 +95,7 @@ module Test with :sjs -class Cls(x) with +data class Cls(x) with let x += 1 fun foo = x let x *= 2 diff --git a/hkmc2/shared/src/test/mlscript/codegen/Lazy.mls b/hkmc2/shared/src/test/mlscript/codegen/Lazy.mls index d8b9c52608..265ac12db1 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/Lazy.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/Lazy.mls @@ -1,7 +1,7 @@ :js -class Lazy[out A](init: () -> A) with +data class Lazy[out A](init: () -> A) with mut val cached: A | () = () fun get: A // fun eq(that: Lazy[A]) = this.cached == that.cached // TODO `this` diff --git a/hkmc2/shared/src/test/mlscript/codegen/LetPatterns.mls b/hkmc2/shared/src/test/mlscript/codegen/LetPatterns.mls index f5661ddd68..007465c024 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/LetPatterns.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/LetPatterns.mls @@ -1,7 +1,7 @@ :js -class Some[out A](value: A) +data class Some[out A](value: A) :todo let Some(x) = Some(42) @@ -22,7 +22,7 @@ let (None) = N //│ ╙── ^^^^^^^^^^ -class Foo(a) +data class Foo(a) :todo let Foo(x) = Foo(1) in print(x) diff --git a/hkmc2/shared/src/test/mlscript/codegen/NestedClasses.mls b/hkmc2/shared/src/test/mlscript/codegen/NestedClasses.mls index 6539e5885d..9c2cac2dc1 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/NestedClasses.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/NestedClasses.mls @@ -2,7 +2,7 @@ module Foo with - class C(x) + data class C(x) Foo.C(123).x //│ = 123 diff --git a/hkmc2/shared/src/test/mlscript/codegen/OptMatch.mls b/hkmc2/shared/src/test/mlscript/codegen/OptMatch.mls index 02a48e7b43..2e0a9bd2a9 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/OptMatch.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/OptMatch.mls @@ -1,7 +1,7 @@ :js -class Some(value) +data class Some(value) object None @@ -68,7 +68,7 @@ isDefined(None) module Foo with - class Other(v) + data class Other(v) val isOther = x => if x is Foo.Other(_) then true diff --git a/hkmc2/shared/src/test/mlscript/codegen/ParamClasses.mls b/hkmc2/shared/src/test/mlscript/codegen/ParamClasses.mls index a779fc2124..463ce84c6a 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/ParamClasses.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/ParamClasses.mls @@ -4,7 +4,7 @@ :sjs -class Foo() +data class Foo() //│ JS (unsanitized): //│ let Foo1; //│ Foo1 = function Foo() { return new Foo.class(); }; @@ -29,7 +29,7 @@ Foo.class //│ = class Foo { constructor() {} toString() { return "Foo(" + "" + ")"; } } -class Foo(a) +data class Foo(a) //│ JS (unsanitized): //│ let Foo3; //│ Foo3 = function Foo(a1) { return new Foo.class(a1); }; @@ -62,7 +62,7 @@ foo(27) //│ = Foo(27) -class Foo(a, b) +data class Foo(a, b) //│ JS (unsanitized): //│ let Foo5; //│ Foo5 = function Foo(a1, b1) { return new Foo.class(a1, b1); }; @@ -122,7 +122,7 @@ Foo(print(1), print(2)) //│ = Foo((), ()) -class Inner(c) with +data class Inner(c) with fun i1(d) = c + d print(c) //│ JS (unsanitized): diff --git a/hkmc2/shared/src/test/mlscript/codegen/PartialApps.mls b/hkmc2/shared/src/test/mlscript/codegen/PartialApps.mls index 95e50c4010..e44dcfc556 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/PartialApps.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/PartialApps.mls @@ -105,7 +105,7 @@ let j = _.x.y(1, _) //│ j = [function j1] -class C(a, b, c) +data class C(a, b, c) 2 |> C(1, _, 3) |> print //│ > C(1, 2, 3) diff --git a/hkmc2/shared/src/test/mlscript/codegen/PlainClasses.mls b/hkmc2/shared/src/test/mlscript/codegen/PlainClasses.mls index 95be5721d1..adabceaf24 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/PlainClasses.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/PlainClasses.mls @@ -40,7 +40,7 @@ Foo() //│ ═══[RUNTIME ERROR] TypeError: Class constructor Foo cannot be invoked without 'new' -class Foo with { print("hi") } +data class Foo with { print("hi") } print("ok") //│ JS (unsanitized): //│ let Foo3; @@ -54,7 +54,7 @@ print("ok") //│ > ok fun test() = - class Foo with { print("hi") } + data class Foo with { print("hi") } print("ok") Foo //│ JS (unsanitized): diff --git a/hkmc2/shared/src/test/mlscript/codegen/RandomStuff.mls b/hkmc2/shared/src/test/mlscript/codegen/RandomStuff.mls index de5e63ab21..b58735a758 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/RandomStuff.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/RandomStuff.mls @@ -22,7 +22,7 @@ fun foo() = foo() :sjs -class Foo(x) with +data class Foo(x) with class Bar with val y = x //│ JS (unsanitized): diff --git a/hkmc2/shared/src/test/mlscript/codegen/SanityChecks.mls b/hkmc2/shared/src/test/mlscript/codegen/SanityChecks.mls index d0073e3d91..dc0928ad00 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/SanityChecks.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/SanityChecks.mls @@ -85,7 +85,7 @@ f(2) :expect NaN :ssjs :noSanityCheck -class Cls(x, y) with +data class Cls(x, y) with fun f(z, p) = x + y + z + p Cls(1, 2).f(3) //│ JS: @@ -110,7 +110,7 @@ Cls(1, 2).f(3) :ssjs :re -class Cls(x, y) with +data class Cls(x, y) with fun f(z, p) = x + y + z + p Cls(1, 2).f(3) //│ JS: @@ -140,7 +140,7 @@ Cls(1, 2).f(3) :ssjs :re -class Cls(x, y) with +data class Cls(x, y) with fun f(z, p)(q, s) = x + y + z + p + q + s Cls(1, 2).f(3, 4)(5) //│ JS: @@ -214,7 +214,7 @@ globalThis.x() :re :ssjs module M with - class A(x) with + data class A(x) with fun f(y) = x + y if M.A(1).y is x and x == 1 then x diff --git a/hkmc2/shared/src/test/mlscript/codegen/SimplePatMat.mls b/hkmc2/shared/src/test/mlscript/codegen/SimplePatMat.mls index c8ca1ec2dc..df6cbaec8e 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/SimplePatMat.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/SimplePatMat.mls @@ -1,7 +1,7 @@ :js -class Some[out A](value: A) +data class Some[out A](value: A) :todo diff --git a/hkmc2/shared/src/test/mlscript/codegen/ThisCallVariations.mls b/hkmc2/shared/src/test/mlscript/codegen/ThisCallVariations.mls index 4f26d7d8b6..887a26735b 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/ThisCallVariations.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/ThisCallVariations.mls @@ -60,7 +60,7 @@ id(Example) . oops(2) //│ = [2, 1] -class Example2(val a) with +data class Example2(val a) with val a = 1 fun f(inc) = Example2(a + inc) diff --git a/hkmc2/shared/src/test/mlscript/codegen/TraceLog.mls b/hkmc2/shared/src/test/mlscript/codegen/TraceLog.mls index 933238ee41..fd602efc25 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/TraceLog.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/TraceLog.mls @@ -66,7 +66,7 @@ f(5) abstract class E: S | N -class S(x) with +data class S(x) with fun toString() = "S(" + x + "): " + toInt(succ(x)) class N() with fun toString() = "N: 0" @@ -100,7 +100,7 @@ fun toInt(x) = if x is //│ = "S(S(N: 0): 1): 2" -class Cls(a, b, c, d, e, f) +data class Cls(a, b, c, d, e, f) fun id(y) = if y == 0 then Cls("aaaa", "bbbb", "cccc", "dddd", "eeee", "ffff") diff --git a/hkmc2/shared/src/test/mlscript/codegen/UnitValue.mls b/hkmc2/shared/src/test/mlscript/codegen/UnitValue.mls index 5345d4862f..66aee0c0f0 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/UnitValue.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/UnitValue.mls @@ -40,7 +40,7 @@ print of globalThis.console.log("Hello, world!") //│ > () -class Box(value) +data class Box(value) fun foo() = if false do 0 diff --git a/hkmc2/shared/src/test/mlscript/codegen/While.mls b/hkmc2/shared/src/test/mlscript/codegen/While.mls index fb06225458..9f4bf8f306 100644 --- a/hkmc2/shared/src/test/mlscript/codegen/While.mls +++ b/hkmc2/shared/src/test/mlscript/codegen/While.mls @@ -185,7 +185,7 @@ if x // TODO use // import "../../mlscript-compile/Stack.mls" -class Cons(hd, tl) +data class Cons(hd, tl) :sjs fun f(ls) = diff --git a/hkmc2/shared/src/test/mlscript/decls/Prelude.mls b/hkmc2/shared/src/test/mlscript/decls/Prelude.mls index 9fb7c18235..a4abe30c3b 100644 --- a/hkmc2/shared/src/test/mlscript/decls/Prelude.mls +++ b/hkmc2/shared/src/test/mlscript/decls/Prelude.mls @@ -40,10 +40,10 @@ declare val Infinity declare module Predef with class Test with val x = 0 - class MatchResult(captures) - class MatchFailure(errors) - class __EffectSig(next, tail, handleBlockList, resumed, handler, handlerFun) - class __Return(value) + data class MatchResult(captures) + data class MatchFailure(errors) + data class __EffectSig(next, tail, handleBlockList, resumed, handler, handlerFun) + data class __Return(value) // This declaration is not used currently except for experimentation abstract class __StackDelay with fun perform() diff --git a/hkmc2/shared/src/test/mlscript/handlers/Effects.mls b/hkmc2/shared/src/test/mlscript/handlers/Effects.mls index 92cb8625cf..52cf8fb2e9 100644 --- a/hkmc2/shared/src/test/mlscript/handlers/Effects.mls +++ b/hkmc2/shared/src/test/mlscript/handlers/Effects.mls @@ -196,7 +196,7 @@ if true do //│ break; //│ } //│ } -//│ toString() { return "Cont$(" + globalThis.Predef.render(this.pc) + ")"; } +//│ toString() { return "Cont$(" + "" + ")"; } //│ }; //│ f = function f() { //│ return 3 @@ -224,7 +224,7 @@ if true do //│ = 3 module A with - class Effect(x) with + data class Effect(x) with fun test() = x fun perform(arg) handle h = A.Effect(3) with diff --git a/hkmc2/shared/src/test/mlscript/handlers/EffectsInClasses.mls b/hkmc2/shared/src/test/mlscript/handlers/EffectsInClasses.mls index c1a8f04e52..8c22c2693e 100644 --- a/hkmc2/shared/src/test/mlscript/handlers/EffectsInClasses.mls +++ b/hkmc2/shared/src/test/mlscript/handlers/EffectsInClasses.mls @@ -7,7 +7,7 @@ abstract class Effect with :sjs -class Lol(h) with +data class Lol(h) with print(h.perform("k")) //│ JS (unsanitized): //│ let Lol1; @@ -47,7 +47,7 @@ class Lol(h) with //│ break; //│ } //│ } -//│ toString() { return "Cont$(" + globalThis.Predef.render(this.pc) + ")"; } +//│ toString() { return "Cont$(" + "" + ")"; } //│ }; //│ this.h = h; //│ tmp = runtime.safeCall(this.h.perform("k")); diff --git a/hkmc2/shared/src/test/mlscript/handlers/HandlersInClasses.mls b/hkmc2/shared/src/test/mlscript/handlers/HandlersInClasses.mls index 921737f321..891f751b41 100644 --- a/hkmc2/shared/src/test/mlscript/handlers/HandlersInClasses.mls +++ b/hkmc2/shared/src/test/mlscript/handlers/HandlersInClasses.mls @@ -47,7 +47,7 @@ Lol.x //│ ═══[RUNTIME ERROR] Error: Access to required field 'x' yielded 'undefined' -class Lol() with +data class Lol() with handle h = Effect with fun perform(arg)(k) = print(arg) diff --git a/hkmc2/shared/src/test/mlscript/handlers/ManualStackSafety.mls b/hkmc2/shared/src/test/mlscript/handlers/ManualStackSafety.mls index 9e25477d90..f2b01e8562 100644 --- a/hkmc2/shared/src/test/mlscript/handlers/ManualStackSafety.mls +++ b/hkmc2/shared/src/test/mlscript/handlers/ManualStackSafety.mls @@ -117,5 +117,3 @@ test(10, 5) //│ > finished at offset: 5 //│ > finished at offset: 0 //│ = 3628800 - - diff --git a/hkmc2/shared/src/test/mlscript/handlers/NestedHandlers.mls b/hkmc2/shared/src/test/mlscript/handlers/NestedHandlers.mls index 3f21cf79a3..6182e21a83 100644 --- a/hkmc2/shared/src/test/mlscript/handlers/NestedHandlers.mls +++ b/hkmc2/shared/src/test/mlscript/handlers/NestedHandlers.mls @@ -89,7 +89,7 @@ handleEffects(f) class Eff with fun perform(): () -class Box(n) +data class Box(n) let box = Box(0) //│ box = Box(0) diff --git a/hkmc2/shared/src/test/mlscript/handlers/RecursiveHandlers.mls b/hkmc2/shared/src/test/mlscript/handlers/RecursiveHandlers.mls index 77658a6145..3a2075da39 100644 --- a/hkmc2/shared/src/test/mlscript/handlers/RecursiveHandlers.mls +++ b/hkmc2/shared/src/test/mlscript/handlers/RecursiveHandlers.mls @@ -161,7 +161,7 @@ str //│ break; //│ } //│ } -//│ toString() { return "Cont$(" + globalThis.Predef.render(this.pc) + ")"; } +//│ toString() { return "Cont$(" + "" + ")"; } //│ }; //│ tmp9 = str + "A"; //│ str = tmp9; @@ -206,7 +206,7 @@ str //│ break; //│ } //│ } -//│ toString() { return "Cont$(" + globalThis.Predef.render(this.pc) + ")"; } +//│ toString() { return "Cont$(" + "" + ")"; } //│ }; //│ handleBlock$5 = function handleBlock$() { //│ let h2, tmp9, res4, Cont$17, Handler$h2$2; @@ -245,7 +245,7 @@ str //│ break; //│ } //│ } -//│ toString() { return "Cont$(" + globalThis.Predef.render(this.pc) + ")"; } +//│ toString() { return "Cont$(" + "" + ")"; } //│ }; //│ tmp10 = str + "B"; //│ tmp11 = str + tmp10; @@ -308,7 +308,7 @@ str //│ break; //│ } //│ } -//│ toString() { return "Cont$(" + globalThis.Predef.render(this.pc) + ")"; } +//│ toString() { return "Cont$(" + "" + ")"; } //│ }; //│ tmp9 = runtime.safeCall(h2.perform(runtime.Unit)); //│ if (tmp9 instanceof globalThis.Predef.__EffectSig.class) { diff --git a/hkmc2/shared/src/test/mlscript/handlers/StackSafety.mls b/hkmc2/shared/src/test/mlscript/handlers/StackSafety.mls index cd8304fb0a..8d0347a750 100644 --- a/hkmc2/shared/src/test/mlscript/handlers/StackSafety.mls +++ b/hkmc2/shared/src/test/mlscript/handlers/StackSafety.mls @@ -52,7 +52,7 @@ hi(0) //│ break; //│ } //│ } -//│ toString() { return "Cont$(" + globalThis.Predef.render(this.pc) + ")"; } +//│ toString() { return "Cont$(" + "" + ")"; } //│ }; //│ stackDelayRes = globalThis.Predef.checkDepth(); //│ if (stackDelayRes instanceof globalThis.Predef.__EffectSig.class) { @@ -103,7 +103,7 @@ hi(0) //│ break; //│ } //│ } -//│ toString() { return "Cont$(" + globalThis.Predef.render(this.pc) + ")"; } +//│ toString() { return "Cont$(" + "" + ")"; } //│ }; //│ globalThis.Predef.__stackOffset = globalThis.Predef.__stackDepth; //│ res2 = resume(); @@ -145,7 +145,7 @@ hi(0) //│ break; //│ } //│ } -//│ toString() { return "Cont$(" + globalThis.Predef.render(this.pc) + ")"; } +//│ toString() { return "Cont$(" + "" + ")"; } //│ }; //│ globalThis.Predef.__stackLimit = 5; //│ globalThis.Predef.__stackOffset = 0; @@ -223,7 +223,7 @@ sum(10000) //│ break; //│ } //│ } -//│ toString() { return "Cont$(" + globalThis.Predef.render(this.pc) + ")"; } +//│ toString() { return "Cont$(" + "" + ")"; } //│ }; //│ curDepth = globalThis.Predef.__stackDepth; //│ stackDelayRes = globalThis.Predef.checkDepth(); @@ -282,7 +282,7 @@ sum(10000) //│ break; //│ } //│ } -//│ toString() { return "Cont$(" + globalThis.Predef.render(this.pc) + ")"; } +//│ toString() { return "Cont$(" + "" + ")"; } //│ }; //│ globalThis.Predef.__stackOffset = globalThis.Predef.__stackDepth; //│ res3 = resume(); @@ -324,7 +324,7 @@ sum(10000) //│ break; //│ } //│ } -//│ toString() { return "Cont$(" + globalThis.Predef.render(this.pc) + ")"; } +//│ toString() { return "Cont$(" + "" + ")"; } //│ }; //│ globalThis.Predef.__stackLimit = 1000; //│ globalThis.Predef.__stackOffset = 0; diff --git a/hkmc2/shared/src/test/mlscript/llir/Playground.mls b/hkmc2/shared/src/test/mlscript/llir/Playground.mls index b222ec1419..c8d06317dd 100644 --- a/hkmc2/shared/src/test/mlscript/llir/Playground.mls +++ b/hkmc2/shared/src/test/mlscript/llir/Playground.mls @@ -4,10 +4,10 @@ :sllir abstract class Option[out T]: Some[T] | None -class Some[out T](x: T) extends Option[T] +data class Some[out T](x: T) extends Option[T] object None extends Option fun fromSome(s) = if s is Some(x) then x -class Lazy[out A](init: () -> A) with +data class Lazy[out A](init: () -> A) with mut val cache: Option[A] = None fun lazy(x) = Lazy(x) //│ LLIR: @@ -45,11 +45,11 @@ fun testCtor2() = new None :sllir :intl abstract class Option[out T]: Some[T] | None -class Some[out T](x: T) extends Option[T] +data class Some[out T](x: T) extends Option[T] object None extends Option fun fromSome(s) = if s is Some(x) then x abstract class Nat: S[Nat] | O -class S(s: Nat) extends Nat +data class S(s: Nat) extends Nat object O extends Nat fun aaa() = let m = 1 diff --git a/hkmc2/shared/src/test/mlscript/nofib/NofibPrelude.mls b/hkmc2/shared/src/test/mlscript/nofib/NofibPrelude.mls index 1649a55132..76b2ea6a2d 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/NofibPrelude.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/NofibPrelude.mls @@ -2,12 +2,12 @@ type Char = String abstract class Option[out T]: Some[T] | None -class Some[out T](x: T) extends Option[T] +data class Some[out T](x: T) extends Option[T] object None extends Option fun fromSome(s) = if s is Some(x) then x -class Lazy[out A](init: () -> A) with +data class Lazy[out A](init: () -> A) with mut val cached: Option[A] = None fun get() = if cached is @@ -20,7 +20,7 @@ fun lazy(x) = Lazy(x) fun force(x) = if x is Lazy then x.Lazy#get() abstract class List[out T]: Cons[T] | Nil -class (::) Cons[out T](head: T, tail: List[T]) extends List[T] with +data class (::) Cons[out T](head: T, tail: List[T]) extends List[T] with fun toString() = "[" + _internal_cons_to_str(Cons(head, tail)) + "]" object Nil extends List with @@ -45,7 +45,7 @@ fun list(...args) = if args is type LazyList[out T] = Lazy[LzList[T]] abstract class LzList[out T]: LzCons[T] | LzNil -class LzCons[out T](head: T, tail: LazyList[T]) extends LzList[T] +data class LzCons[out T](head: T, tail: LazyList[T]) extends LzList[T] object LzNil extends LzList fun ltTup2(t1, t2, lt1, gt1, lt2) = if t1 is [a, b] and t2 is [c, d] and diff --git a/hkmc2/shared/src/test/mlscript/nofib/atom.mls b/hkmc2/shared/src/test/mlscript/nofib/atom.mls index 36ba960186..8a2aab776b 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/atom.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/atom.mls @@ -4,7 +4,7 @@ :import NofibPrelude.mls -class State(position: List[Num], velocity: List[Num]) +data class State(position: List[Num], velocity: List[Num]) fun dotPlus(fs, gs) = if fs is Nil then gs diff --git a/hkmc2/shared/src/test/mlscript/nofib/boyer.mls b/hkmc2/shared/src/test/mlscript/nofib/boyer.mls index 74173cf954..22eacc995f 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/boyer.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/boyer.mls @@ -60,9 +60,10 @@ object abstract class Term: Var | Fun | ERROR -class - Var(i: Id) extends Term - Fun(i: Id, t: List[Term], l: [Term, Term]) extends Term +data + class + Var(i: Id) extends Term + Fun(i: Id, t: List[Term], l: [Term, Term]) extends Term object ERROR extends Term diff --git a/hkmc2/shared/src/test/mlscript/nofib/boyer2.mls b/hkmc2/shared/src/test/mlscript/nofib/boyer2.mls index 2b73197022..e61c7b9fcb 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/boyer2.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/boyer2.mls @@ -8,9 +8,10 @@ abstract class Lisplist: Nill | Atom | Conss object Nill extends Lisplist -class - Atom(a: List[Char]) extends Lisplist - Conss(a: [Lisplist, Lisplist]) extends Lisplist +data + class + Atom(a: List[Char]) extends Lisplist + Conss(a: [Lisplist, Lisplist]) extends Lisplist fun lispListEq(x, y) = if x is Nill and y is Nill then true @@ -107,7 +108,7 @@ abstract class LUT: Empty | Node object Empty extends LUT -class Node(x: [LUT, LUTentry, LUT]) extends LUT +data class Node(x: [LUT, LUTentry, LUT]) extends LUT fun addtoLUT(k_l_lut) = if k_l_lut is [k, l, Empty] then Node([Empty, [k, l :: Nil], Empty]) @@ -321,12 +322,41 @@ let rules = nofibStringToList("(equal (flatten (cdr (gopher x) ) )(if (listp x)(cdr (flatten x) )(Conss (zero)(Nill) ) ) )") :: nofibStringToList("(equal (quotient (times y x)y)(if (zerop y)(zero)(fix x) ) )") :: nofibStringToList("(equal (get j (set i val mem) )(if (eqp j i)val(get j mem) ) )") :: Nil -//│ rules = [["(","e","q","u","a","l"," ","(","c","o","m","p","i","l","e"," ","f","o","r","m",")","(","r","e","v","e","r","s","e"," ","(","c","o","d","e","g","e","n"," ","(","o","p","t","i","m","i","z","e"," ","f","o","r","m",")"," ","(","N","i","l","l",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","p"," ","x"," ","y",")","(","e","q","u","a","l"," ","(","f","i","x"," ","x",")","(","f","i","x"," ","y",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","g","r","e","a","t","e","r","p"," ","x"," ","y",")","(","l","e","s","s","p"," ","y"," ","x",")"," ",")"],["(","e","q","u","a","l"," ","(","l","e","s","s","e","q","p"," ","x"," ","y",")","(","n","o","t"," ","(","l","e","s","s","p"," ","y"," ","x",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","g","r","e","a","t","e","r","e","q","p"," ","x"," ","y",")","(","n","o","t"," ","(","l","e","s","s","p"," ","y"," ","x",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","b","o","o","l","e","a","n"," ","x",")","(","o","r"," ","(","e","q","u","a","l"," ","x"," ","(","t",")"," ",")","(","e","q","u","a","l"," ","x"," ","(","f",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","i","f","f"," ","x"," ","y",")","(","a","n","d"," ","(","i","m","p","l","i","e","s"," ","x"," ","y",")","(","i","m","p","l","i","e","s"," ","y"," ","x",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","v","e","n","1"," ","x",")","(","i","f"," ","(","z","e","r","o","p"," ","x",")","(","t",")","(","o","d","d"," ","(","1","-"," ","x",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","c","o","u","n","t","p","s","-"," ","l"," ","p","r","e","d",")","(","c","o","u","n","t","p","s","-","l","o","o","p"," ","l"," ","p","r","e","d"," ","(","z","e","r","o",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","f","a","c","t","-"," ","i",")","(","f","a","c","t","-","l","o","o","p"," ","i"," ","1",")"," ",")"],["(","e","q","u","a","l"," ","(","r","e","v","e","r","s","e","-"," ","x",")","(","r","e","v","e","r","s","e","-","l","o","o","p"," ","x"," ","(","N","i","l","l",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","d","i","v","i","d","e","s"," ","x"," ","y",")","(","z","e","r","o","p"," ","(","r","e","m","a","i","n","d","e","r"," ","y"," ","x",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","a","s","s","u","m","e","-","t","r","u","e"," ","v","a","r"," ","a","l","i","s","t",")","(","C","o","n","s","s"," ","(","C","o","n","s","s"," ","v","a","r"," ","(","t",")"," ",")","a","l","i","s","t",")"," ",")"],["(","e","q","u","a","l"," ","(","a","s","s","u","m","e","-","f","a","l","s","e"," ","v","a","r"," ","a","l","i","s","t",")","(","C","o","n","s","s"," ","(","C","o","n","s","s"," ","v","a","r"," ","(","f",")"," ",")","a","l","i","s","t",")"," ",")"],["(","e","q","u","a","l"," ","(","t","a","u","t","o","l","o","g","y","-","c","h","e","c","k","e","r"," ","x",")","(","t","a","u","t","o","l","o","g","y","p"," ","(","n","o","r","m","a","l","i","z","e"," ","x",")","(","N","i","l","l",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","f","a","l","s","i","f","y"," ","x",")","(","f","a","l","s","i","f","y","1"," ","(","n","o","r","m","a","l","i","z","e"," ","x",")","(","N","i","l","l",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","p","r","i","m","e"," ","x",")","(","a","n","d"," ","(","n","o","t"," ","(","z","e","r","o","p"," ","x",")",")","(","n","o","t"," ","(","e","q","u","a","l"," ","x"," ","(","a","d","d","1"," ","(","z","e","r","o",")"," ",")"," ",")"," ",")","(","p","r","i","m","e","1"," ","x"," ","(","1","-"," ","x",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","a","n","d"," ","p"," ","q",")","(","i","f"," ","p"," ","(","i","f"," ","q"," ","(","t",")"," ","(","f",")"," ",")"," ","(","f",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","o","r"," ","p"," ","q",")","(","i","f"," ","p"," ","(","t",")"," ","(","i","f"," ","q"," ","(","t",")"," ","(","f",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","n","o","t"," ","p",")","(","i","f"," ","p"," ","(","f",")"," ","(","t",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","i","m","p","l","i","e","s"," ","p"," ","q",")","(","i","f"," ","p"," ","(","i","f"," ","q"," ","(","t",")"," ","(","f",")"," ",")"," ","(","t",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","f","i","x"," ","x",")","(","i","f"," ","(","n","u","m","b","e","r","p"," ","x",")"," ","x"," ","(","z","e","r","o",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","i","f"," ","(","i","f"," ","a"," ","b"," ","c",")"," ","d"," ","e",")","(","i","f"," ","a"," ","(","i","f"," ","b"," ","d"," ","e",")"," ","(","i","f"," ","c"," ","d"," ","e",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","z","e","r","o","p"," ","x",")","(","o","r"," ","(","e","q","u","a","l"," ","x"," ","(","z","e","r","o",")"," ",")","(","n","o","t"," ","(","n","u","m","b","e","r","p"," ","x",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","p","l","u","s"," ","(","p","l","u","s"," ","x"," ","y",")"," ","z"," ",")","(","p","l","u","s"," ","x"," ","(","p","l","u","s"," ","y"," ","z",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","(","p","l","u","s"," ","a"," ","b",")"," ","(","z","e","r","o"," ",")"," ",")","(","a","n","d"," ","(","z","e","r","o","p"," ","a",")"," ","(","z","e","r","o","p"," ","b",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","d","i","f","f","e","r","e","n","c","e"," ","x"," ","x",")","(","z","e","r","o",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","(","p","l","u","s"," ","a"," ","b",")"," ","(","p","l","u","s"," ","a"," ","c",")"," ",")","(","e","q","u","a","l"," ","(","f","i","x"," ","b",")"," ","(","f","i","x"," ","c",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","(","z","e","r","o",")"," ","(","d","i","f","f","e","r","e","n","c","e"," ","x"," ","y",")"," ",")","(","n","o","t"," ","(","l","e","s","s","p"," ","y"," ","x",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","x"," ","(","d","i","f","f","e","r","e","n","c","e"," ","x"," ","y",")"," ",")","(","a","n","d"," ","(","n","u","m","b","e","r","p"," ","x",")","(","o","r"," ","(","e","q","u","a","l"," ","x"," ","(","z","e","r","o",")"," ",")","(","z","e","r","o","p"," ","y",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","m","e","a","n","i","n","g"," ","(","p","l","u","s","-","t","r","e","e"," ","(","a","p","p","e","n","d"," ","x"," ","y",")"," ",")"," ","a",")","(","p","l","u","s"," ","(","m","e","a","n","i","n","g"," ","(","p","l","u","s","-","t","r","e","e"," ","x",")"," ","a",")","(","m","e","a","n","i","n","g"," ","(","p","l","u","s","-","t","r","e","e"," ","y",")"," ","a",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","m","e","a","n","i","n","g"," ","(","p","l","u","s","-","t","r","e","e"," ","(","p","l","u","s","-","f","r","i","n","g","e"," ","x",")"," ",")"," ","a",")","(","f","i","x"," ","(","m","e","a","n","i","n","g"," ","x"," ","a",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","a","p","p","e","n","d"," ","(","a","p","p","e","n","d"," ","x"," ","y",")"," ","z",")","(","a","p","p","e","n","d"," ","x"," ","(","a","p","p","e","n","d"," ","y"," ","z",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","r","e","v","e","r","s","e"," ","(","a","p","p","e","n","d"," ","a"," ","b",")"," ",")","(","a","p","p","e","n","d"," ","(","r","e","v","e","r","s","e"," ","b",")"," ","(","r","e","v","e","r","s","e"," ","a",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","t","i","m","e","s"," ","x"," ","(","p","l","u","s"," ","y"," ","z",")"," ",")","(","p","l","u","s"," ","(","t","i","m","e","s"," ","x"," ","y",")","(","t","i","m","e","s"," ","x"," ","z",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","t","i","m","e","s"," ","(","t","i","m","e","s"," ","x"," ","y",")"," ","z",")","(","t","i","m","e","s"," ","x"," ","(","t","i","m","e","s"," ","y"," ","z",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","(","t","i","m","e","s"," ","x"," ","y",")"," ","(","z","e","r","o",")"," ",")","(","o","r"," ","(","z","e","r","o","p"," ","x",")","(","z","e","r","o","p"," ","y",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","x","e","c"," ","(","a","p","p","e","n","d"," ","x"," ","y",")","p","d","s"," ","e","n","v","r","n",")","(","e","x","e","c"," ","y"," ","(","e","x","e","c"," ","x"," ","p","d","s"," ","e","n","v","r","n",")","e","n","v","r","n",")"," ",")"],["(","e","q","u","a","l"," ","(","m","c","-","f","l","a","t","t","e","n"," ","x"," ","y",")","(","a","p","p","e","n","d"," ","(","f","l","a","t","t","e","n"," ","x",")","y",")"," ",")"],["(","e","q","u","a","l"," ","(","m","e","m","b","e","r"," ","x"," ","(","a","p","p","e","n","d"," ","a"," ","b",")"," ",")","(","o","r"," ","(","m","e","m","b","e","r"," ","x"," ","a",")","(","m","e","m","b","e","r"," ","x"," ","b",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","m","e","m","b","e","r"," ","x"," ","(","r","e","v","e","r","s","e"," ","y",")"," ",")","(","m","e","m","b","e","r"," ","x"," ","y",")"," ",")"],["(","e","q","u","a","l"," ","(","l","e","n","g","t","h"," ","(","r","e","v","e","r","s","e"," ","x",")"," ",")","(","l","e","n","g","t","h"," ","x",")"," ",")"],["(","e","q","u","a","l"," ","(","m","e","m","b","e","r"," ","a"," ","(","i","n","t","e","r","s","e","c","t"," ","b"," ","c",")"," ",")","(","a","n","d"," ","(","m","e","m","b","e","r"," ","a"," ","b",")","(","m","e","m","b","e","r"," ","a"," ","c",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","n","t","h"," ","(","z","e","r","o",")","i",")","(","z","e","r","o",")"," ",")"],["(","e","q","u","a","l"," ","(","e","x","p"," ","i"," ","(","p","l","u","s"," ","j"," ","k",")"," ",")","(","t","i","m","e","s"," ","(","e","x","p"," ","i"," ","j",")","(","e","x","p"," ","i"," ","k",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","x","p"," ","i"," ","(","t","i","m","e","s"," ","j"," ","k",")"," ",")","(","e","x","p"," ","(","e","x","p"," ","i"," ","j",")","k",")"," ",")"],["(","e","q","u","a","l"," ","(","r","e","v","e","r","s","e","-","l","o","o","p"," ","x"," ","y",")","(","a","p","p","e","n","d"," ","(","r","e","v","e","r","s","e"," ","x",")","y",")"," ",")"],["(","e","q","u","a","l"," ","(","r","e","v","e","r","s","e","-","l","o","o","p"," ","x"," ","(","N","i","l","l",")"," ",")","(","r","e","v","e","r","s","e"," ","x",")"," ",")"],["(","e","q","u","a","l"," ","(","c","o","u","n","t","-","l","i","s","t"," ","z"," ","(","s","o","r","t","-","l","p"," ","x"," ","y",")"," ",")","(","p","l","u","s"," ","(","c","o","u","n","t","-","l","i","s","t"," ","z"," ","x",")","(","c","o","u","n","t","-","l","i","s","t"," ","z"," ","y",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","(","a","p","p","e","n","d"," ","a"," ","b",")","(","a","p","p","e","n","d"," ","a"," ","c",")"," ",")","(","e","q","u","a","l"," ","b"," ","c",")"," ",")"],["(","e","q","u","a","l"," ","(","p","l","u","s"," ","(","r","e","m","a","i","n","d","e","r"," ","x"," ","y",")","(","t","i","m","e","s"," ","y"," ","(","q","u","o","t","i","e","n","t"," ","x"," ","y",")"," ",")"," ",")","(","f","i","x"," ","x",")"," ",")"],["(","e","q","u","a","l"," ","(","p","o","w","e","r","-","e","v","a","l"," ","(","b","i","g","-","p","l","u","s","1"," ","l"," ","i"," ","b","a","s","e",")","b","a","s","e",")","(","p","l","u","s"," ","(","p","o","w","e","r","-","e","v","a","l"," ","l"," ","b","a","s","e",")","i",")"," ",")"],["(","e","q","u","a","l"," ","(","p","o","w","e","r","-","e","v","a","l"," ","(","b","i","g","-","p","l","u","s"," ","x"," ","y"," ","i"," ","b","a","s","e",")","b","a","s","e",")","(","p","l","u","s"," ","i"," ","(","p","l","u","s"," ","(","p","o","w","e","r","-","e","v","a","l"," ","x"," ","b","a","s","e",")","(","p","o","w","e","r","-","e","v","a","l"," ","y"," ","b","a","s","e",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","r","e","m","a","i","n","d","e","r"," ","y"," ","1",")","(","z","e","r","o",")"," ",")"],["(","e","q","u","a","l"," ","(","l","e","s","s","p"," ","(","r","e","m","a","i","n","d","e","r"," ","x"," ","y",")","y",")","(","n","o","t"," ","(","z","e","r","o","p"," ","y",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","r","e","m","a","i","n","d","e","r"," ","x"," ","x",")","(","z","e","r","o",")"," ",")"],["(","e","q","u","a","l"," ","(","l","e","s","s","p"," ","(","q","u","o","t","i","e","n","t"," ","i"," ","j",")","i",")","(","a","n","d"," ","(","n","o","t"," ","(","z","e","r","o","p"," ","i",")"," ",")","(","o","r"," ","(","z","e","r","o","p"," ","j",")","(","n","o","t"," ","(","e","q","u","a","l"," ","j"," ","1",")"," ",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","l","e","s","s","p"," ","(","r","e","m","a","i","n","d","e","r"," ","x"," ","y",")","x",")","(","a","n","d"," ","(","n","o","t"," ","(","z","e","r","o","p"," ","y",")"," ",")","(","n","o","t"," ","(","z","e","r","o","p"," ","x",")"," ",")","(","n","o","t"," ","(","l","e","s","s","p"," ","x"," ","y",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","p","o","w","e","r","-","e","v","a","l"," ","(","p","o","w","e","r","-","r","e","p"," ","i"," ","b","a","s","e",")","b","a","s","e",")","(","f","i","x"," ","i",")"," ",")"],["(","e","q","u","a","l"," ","(","p","o","w","e","r","-","e","v","a","l"," ","(","b","i","g","-","p","l","u","s"," ","(","p","o","w","e","r","-","r","e","p"," ","i"," ","b","a","s","e",")","(","p","o","w","e","r","-","r","e","p"," ","j"," ","b","a","s","e",")","(","z","e","r","o",")","b","a","s","e",")","b","a","s","e",")","(","p","l","u","s"," ","i"," ","j",")"," ",")"],["(","e","q","u","a","l"," ","(","g","c","d"," ","x"," ","y",")","(","g","c","d"," ","y"," ","x",")"," ",")"],["(","e","q","u","a","l"," ","(","n","t","h"," ","(","a","p","p","e","n","d"," ","a"," ","b",")","i",")","(","a","p","p","e","n","d"," ","(","n","t","h"," ","a"," ","i",")","(","n","t","h"," ","b"," ","(","d","i","f","f","e","r","e","n","c","e"," ","i"," ","(","l","e","n","g","t","h"," ","a",")"," ",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","d","i","f","f","e","r","e","n","c","e"," ","(","p","l","u","s"," ","x"," ","y",")","x",")","(","f","i","x"," ","y",")"," ",")"],["(","e","q","u","a","l"," ","(","d","i","f","f","e","r","e","n","c","e"," ","(","p","l","u","s"," ","y"," ","x",")","x",")","(","f","i","x"," ","y",")"," ",")"],["(","e","q","u","a","l"," ","(","d","i","f","f","e","r","e","n","c","e"," ","(","p","l","u","s"," ","x"," ","y",")","(","p","l","u","s"," ","x"," ","z",")"," ",")","(","d","i","f","f","e","r","e","n","c","e"," ","y"," ","z",")"," ",")"],["(","e","q","u","a","l"," ","(","t","i","m","e","s"," ","x"," ","(","d","i","f","f","e","r","e","n","c","e"," ","c"," ","w",")"," ",")","(","d","i","f","f","e","r","e","n","c","e"," ","(","t","i","m","e","s"," ","c"," ","x",")","(","t","i","m","e","s"," ","w"," ","x",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","r","e","m","a","i","n","d","e","r"," ","(","t","i","m","e","s"," ","x"," ","z",")","z",")","(","z","e","r","o",")"," ",")"],["(","e","q","u","a","l"," ","(","d","i","f","f","e","r","e","n","c","e"," ","(","p","l","u","s"," ","b"," ","(","p","l","u","s"," ","a"," ","c",")"," ",")","a",")","(","p","l","u","s"," ","b"," ","c",")"," ",")"],["(","e","q","u","a","l"," ","(","d","i","f","f","e","r","e","n","c","e"," ","(","a","d","d","1"," ","(","p","l","u","s"," ","y"," ","z",")","z",")","(","a","d","d","1"," ","y",")"," ",")"],["(","e","q","u","a","l"," ","(","l","e","s","s","p"," ","(","p","l","u","s"," ","x"," ","y",")","(","p","l","u","s"," ","x"," ","z"," ",")"," ",")","(","l","e","s","s","p"," ","y"," ","z",")"," ",")"],["(","e","q","u","a","l"," ","(","l","e","s","s","p"," ","(","t","i","m","e","s"," ","x"," ","z",")","(","t","i","m","e","s"," ","y"," ","z",")"," ",")","(","a","n","d"," ","(","n","o","t"," ","(","z","e","r","o","p"," ","z",")"," ",")","(","l","e","s","s","p"," ","x"," ","y",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","l","e","s","s","p"," ","y"," ","(","p","l","u","s"," ","x"," ","y",")"," ",")","(","n","o","t"," ","(","z","e","r","o","p"," ","x",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","g","c","d"," ","(","t","i","m","e","s"," ","x"," ","z",")","(","t","i","m","e","s"," ","y"," ","z",")"," ",")","(","t","i","m","e","s"," ","z"," ","(","g","c","d"," ","x"," ","y",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","v","a","l","u","e"," ","(","n","o","r","m","a","l","i","z","e"," ","x",")","a",")","(","v","a","l","u","e"," ","x"," ","a",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","(","f","l","a","t","t","e","n"," ","x",")","(","C","o","n","s","s"," ","y"," ","(","N","i","l","l",")"," ",")"," ",")","(","a","n","d"," ","(","n","l","i","s","t","p"," ","x",")","(","e","q","u","a","l"," ","x"," ","y",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","l","i","s","t","p"," ","(","g","o","p","h","e","r"," ","x",")"," ",")","(","l","i","s","t","p"," ","x",")"," ",")"],["(","e","q","u","a","l"," ","(","s","a","m","e","f","r","i","n","g","e"," ","x"," ","y",")","(","e","q","u","a","l"," ","(","f","l","a","t","t","e","n"," ","x",")","(","f","l","a","t","t","e","n"," ","y",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","(","g","r","e","a","t","e","s","t","-","f","a","c","t","o","r"," ","x"," ","y",")","(","z","e","r","o",")"," ",")","(","a","n","d"," ","(","o","r"," ","(","z","e","r","o","p"," ","y",")","(","e","q","u","a","l"," ","y"," ","1",")"," ",")","(","e","q","u","a","l"," ","x"," ","(","z","e","r","o",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","(","g","r","e","a","t","e","s","t","-","f","a","c","t","o","r"," ","x"," ","y",")","1",")","(","e","q","u","a","l"," ","x"," ","1",")"," ",")"],["(","e","q","u","a","l"," ","(","n","u","m","b","e","r","p"," ","(","g","r","e","a","t","e","s","t","-","f","a","c","t","o","r"," ","x"," ","y",")"," ",")","(","n","o","t"," ","(","a","n","d"," ","(","o","r"," ","(","z","e","r","o","p"," ","y",")","(","e","q","u","a","l"," ","y"," ","1",")"," ",")","(","n","o","t"," ","(","n","u","m","b","e","r","p"," ","x",")"," ",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","t","i","m","e","s","-","l","i","s","t"," ","(","a","p","p","e","n","d"," ","x"," ","y",")"," ",")","(","t","i","m","e","s"," ","(","t","i","m","e","s","-","l","i","s","t"," ","x",")","(","t","i","m","e","s","-","l","i","s","t"," ","y",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","p","r","i","m","e","-","l","i","s","t"," ","(","a","p","p","e","n","d"," ","x"," ","y",")"," ",")","(","a","n","d"," ","(","p","r","i","m","e","-","l","i","s","t"," ","x",")","(","p","r","i","m","e","-","l","i","s","t"," ","y",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","z"," ","(","t","i","m","e","s"," ","w"," ","z",")"," ",")","(","a","n","d"," ","(","n","u","m","b","e","r","p"," ","z",")","(","o","r"," ","(","e","q","u","a","l"," ","z"," ","(","z","e","r","o",")"," ",")","(","e","q","u","a","l"," ","w"," ","1",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","g","r","e","a","t","e","r","e","q","p","r"," ","x"," ","y",")","(","n","o","t"," ","(","l","e","s","s","p"," ","x"," ","y",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","x"," ","(","t","i","m","e","s"," ","x"," ","y",")"," ",")","(","o","r"," ","(","e","q","u","a","l"," ","x"," ","(","z","e","r","o",")"," ",")","(","a","n","d"," ","(","n","u","m","b","e","r","p"," ","x",")","(","e","q","u","a","l"," ","y"," ","1",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","r","e","m","a","i","n","d","e","r"," ","(","t","i","m","e","s"," ","y"," ","x",")","y",")","(","z","e","r","o",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","(","t","i","m","e","s"," ","a"," ","b",")","1",")","(","a","n","d"," ","(","n","o","t"," ","(","e","q","u","a","l"," ","a"," ","(","z","e","r","o",")"," ",")"," ",")","(","n","o","t"," ","(","e","q","u","a","l"," ","b"," ","(","z","e","r","o",")"," ",")"," ",")","(","n","u","m","b","e","r","p"," ","a",")","(","n","u","m","b","e","r","p"," ","b",")","(","e","q","u","a","l"," ","(","1","-"," ","a",")","(","z","e","r","o",")"," ",")","(","e","q","u","a","l"," ","(","1","-"," ","b",")","(","z","e","r","o",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","l","e","s","s","p"," ","(","l","e","n","g","t","h"," ","(","d","e","l","e","t","e"," ","x"," ","l",")"," ",")","(","l","e","n","g","t","h"," ","l",")"," ",")","(","m","e","m","b","e","r"," ","x"," ","l",")"," ",")"],["(","e","q","u","a","l"," ","(","s","o","r","t","2"," ","(","d","e","l","e","t","e"," ","x"," ","l",")"," ",")","(","d","e","l","e","t","e"," ","x"," ","(","s","o","r","t","2"," ","l",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","d","s","o","r","t"," ","x",")","(","s","o","r","t","2"," ","x",")"," ",")"],["(","e","q","u","a","l"," ","(","l","e","n","g","t","h","(","C","o","n","s","s"," ","x","1","(","C","o","n","s","s"," ","x","2","(","C","o","n","s","s"," ","x","3","(","C","o","n","s","s"," ","x","4","(","C","o","n","s","s"," ","x","5","(","C","o","n","s","s"," ","x","6"," ","x","7",")"," ",")"," ",")"," ",")"," ",")"," ",")"," ",")","(","p","l","u","s"," ","6"," ","(","l","e","n","g","t","h"," ","x","7",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","d","i","f","f","e","r","e","n","c","e"," ","(","a","d","d","1"," ","(","a","d","d","1"," ","x",")"," ",")","2",")","(","f","i","x"," ","x",")"," ",")"],["(","e","q","u","a","l"," ","(","q","u","o","t","i","e","n","t"," ","(","p","l","u","s"," ","x"," ","(","p","l","u","s"," ","x"," ","y",")"," ",")","2",")","(","p","l","u","s"," ","x"," ","(","q","u","o","t","i","e","n","t"," ","y"," ","2",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","s","i","g","m","a"," ","(","z","e","r","o",")","i",")","(","q","u","o","t","i","e","n","t"," ","(","t","i","m","e","s"," ","i"," ","(","a","d","d","1"," ","i",")"," ",")","2",")"," ",")"],["(","e","q","u","a","l"," ","(","p","l","u","s"," ","x"," ","(","a","d","d","1"," ","y",")"," ",")","(","i","f"," ","(","n","u","m","b","e","r","p"," ","y",")","(","a","d","d","1"," ","(","p","l","u","s"," ","x"," ","y",")"," ",")","(","a","d","d","1"," ","x",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","(","d","i","f","f","e","r","e","n","c","e"," ","x"," ","y",")","(","d","i","f","f","e","r","e","n","c","e"," ","z"," ","y",")"," ",")","(","i","f"," ","(","l","e","s","s","p"," ","x"," ","y",")","(","n","o","t"," ","(","l","e","s","s","p"," ","y"," ","z",")"," ",")","(","i","f"," ","(","l","e","s","s","p"," ","z"," ","y",")","(","n","o","t"," ","(","l","e","s","s","p"," ","y"," ","x",")"," ",")","(","e","q","u","a","l"," ","(","f","i","x"," ","x",")","(","f","i","x"," ","z",")"," ",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","m","e","a","n","i","n","g"," ","(","p","l","u","s","-","t","r","e","e"," ","(","d","e","l","e","t","e"," ","x"," ","y",")"," ",")","a",")","(","i","f"," ","(","m","e","m","b","e","r"," ","x"," ","y",")","(","d","i","f","f","e","r","e","n","c","e"," ","(","m","e","a","n","i","n","g"," ","(","p","l","u","s","-","t","r","e","e"," ","y",")","a",")","(","m","e","a","n","i","n","g"," ","x"," ","a",")"," ",")","(","m","e","a","n","i","n","g"," ","(","p","l","u","s","-","t","r","e","e"," ","y",")","a",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","t","i","m","e","s"," ","x"," ","(","a","d","d","1"," ","y",")"," ",")","(","i","f"," ","(","n","u","m","b","e","r","p"," ","y",")","(","p","l","u","s"," ","x"," ","(","t","i","m","e","s"," ","x"," ","y",")"," ",")","(","f","i","x"," ","x",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","n","t","h"," ","(","N","i","l","l",")","i",")","(","i","f"," ","(","z","e","r","o","p"," ","i",")","(","N","i","l","l",")","(","z","e","r","o",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","l","a","s","t"," ","(","a","p","p","e","n","d"," ","a"," ","b",")"," ",")","(","i","f"," ","(","l","i","s","t","p"," ","b",")","(","l","a","s","t"," ","b",")","(","i","f"," ","(","l","i","s","t","p"," ","a",")","(","C","o","n","s","s"," ","(","c","a","r"," ","(","l","a","s","t"," ","a",")"," ",")","b",")","b",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","(","l","e","s","s","p"," ","x"," ","y",")","z",")","(","i","f"," ","(","l","e","s","s","p"," ","x"," ","y",")","(","e","q","u","a","l"," ","t"," ","z",")","(","e","q","u","a","l"," ","f"," ","z",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","a","s","s","i","g","n","m","e","n","t"," ","x"," ","(","a","p","p","e","n","d"," ","a"," ","b",")"," ",")","(","i","f"," ","(","a","s","s","i","g","n","e","d","p"," ","x"," ","a",")","(","a","s","s","i","g","n","m","e","n","t"," ","x"," ","a",")","(","a","s","s","i","g","n","m","e","n","t"," ","x"," ","b",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","c","a","r"," ","(","g","o","p","h","e","r"," ","x",")"," ",")","(","i","f"," ","(","l","i","s","t","p"," ","x",")","(","c","a","r"," ","(","f","l","a","t","t","e","n"," ","x",")"," ",")","(","z","e","r","o",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","f","l","a","t","t","e","n"," ","(","c","d","r"," ","(","g","o","p","h","e","r"," ","x",")"," ",")"," ",")","(","i","f"," ","(","l","i","s","t","p"," ","x",")","(","c","d","r"," ","(","f","l","a","t","t","e","n"," ","x",")"," ",")","(","C","o","n","s","s"," ","(","z","e","r","o",")","(","N","i","l","l",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","q","u","o","t","i","e","n","t"," ","(","t","i","m","e","s"," ","y"," ","x",")","y",")","(","i","f"," ","(","z","e","r","o","p"," ","y",")","(","z","e","r","o",")","(","f","i","x"," ","x",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","g","e","t"," ","j"," ","(","s","e","t"," ","i"," ","v","a","l"," ","m","e","m",")"," ",")","(","i","f"," ","(","e","q","p"," ","j"," ","i",")","v","a","l","(","g","e","t"," ","j"," ","m","e","m",")"," ",")"," ",")"]] +//│ FAILURE: Unexpected exception +//│ /!!!\ Uncaught error: java.lang.StackOverflowError let lemmas = addlemmalst(makelemmas(rules), Empty) -//│ lemmas = Node([Node([Node([Node([Node([Empty, [["a","n","d"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["a","n","d"]), Conss([Atom(["p"]), Conss([Atom(["q"]), Nill])])]), Conss([Conss([Atom(["i","f"]), Conss([Atom(["p"]), Conss([Conss([Atom(["i","f"]), Conss([Atom(["q"]), Conss([Conss([Atom(["t"]), Nill]), Conss([Conss([Atom(["f"]), Nill]), Nill])])])]), Conss([Conss([Atom(["f"]), Nill]), Nill])])])]), Nill])])])]], Node([Empty, [["a","p","p","e","n","d"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Atom(["z"]), Nill])])]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["x"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["y"]), Conss([Atom(["z"]), Nill])])]), Nill])])]), Nill])])])]], Node([Empty, [["a","s","s","i","g","n","m","e","n","t"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["a","s","s","i","g","n","m","e","n","t"]), Conss([Atom(["x"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["a"]), Conss([Atom(["b"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["a","s","s","i","g","n","e","d","p"]), Conss([Atom(["x"]), Conss([Atom(["a"]), Nill])])]), Conss([Conss([Atom(["a","s","s","i","g","n","m","e","n","t"]), Conss([Atom(["x"]), Conss([Atom(["a"]), Nill])])]), Conss([Conss([Atom(["a","s","s","i","g","n","m","e","n","t"]), Conss([Atom(["x"]), Conss([Atom(["b"]), Nill])])]), Nill])])])]), Nill])])])]], Empty])])]), [["a","s","s","u","m","e","-","f","a","l","s","e"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["a","s","s","u","m","e","-","f","a","l","s","e"]), Conss([Atom(["v","a","r"]), Conss([Atom(["a","l","i","s","t"]), Nill])])]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Atom(["v","a","r"]), Conss([Conss([Atom(["f"]), Nill]), Nill])])]), Conss([Atom(["a","l","i","s","t"]), Nill])])]), Nill])])])]], Empty]), [["a","s","s","u","m","e","-","t","r","u","e"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["a","s","s","u","m","e","-","t","r","u","e"]), Conss([Atom(["v","a","r"]), Conss([Atom(["a","l","i","s","t"]), Nill])])]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Atom(["v","a","r"]), Conss([Conss([Atom(["t"]), Nill]), Nill])])]), Conss([Atom(["a","l","i","s","t"]), Nill])])]), Nill])])])]], Empty]), [["b","o","o","l","e","a","n"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["b","o","o","l","e","a","n"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["o","r"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["x"]), Conss([Conss([Atom(["t"]), Nill]), Nill])])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["x"]), Conss([Conss([Atom(["f"]), Nill]), Nill])])]), Nill])])]), Nill])])])]], Node([Empty, [["c","a","r"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["c","a","r"]), Conss([Conss([Atom(["g","o","p","h","e","r"]), Conss([Atom(["x"]), Nill])]), Nill])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["l","i","s","t","p"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["c","a","r"]), Conss([Conss([Atom(["f","l","a","t","t","e","n"]), Conss([Atom(["x"]), Nill])]), Nill])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])])]), Nill])])])]], Empty])]), [["c","o","m","p","i","l","e"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["c","o","m","p","i","l","e"]), Conss([Atom(["f","o","r","m"]), Nill])]), Conss([Conss([Atom(["r","e","v","e","r","s","e"]), Conss([Conss([Atom(["c","o","d","e","g","e","n"]), Conss([Conss([Atom(["o","p","t","i","m","i","z","e"]), Conss([Atom(["f","o","r","m"]), Nill])]), Conss([Conss([Atom(["N","i","l","l"]), Nill]), Nill])])]), Nill])]), Nill])])])]], Node([Node([Node([Empty, [["c","o","u","n","t","-","l","i","s","t"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["c","o","u","n","t","-","l","i","s","t"]), Conss([Atom(["z"]), Conss([Conss([Atom(["s","o","r","t","-","l","p"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Conss([Atom(["c","o","u","n","t","-","l","i","s","t"]), Conss([Atom(["z"]), Conss([Atom(["x"]), Nill])])]), Conss([Conss([Atom(["c","o","u","n","t","-","l","i","s","t"]), Conss([Atom(["z"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Nill])])])]], Empty]), [["c","o","u","n","t","p","s","-"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["c","o","u","n","t","p","s","-"]), Conss([Atom(["l"]), Conss([Atom(["p","r","e","d"]), Nill])])]), Conss([Conss([Atom(["c","o","u","n","t","p","s","-","l","o","o","p"]), Conss([Atom(["l"]), Conss([Atom(["p","r","e","d"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])])]), Nill])])])]], Node([Node([Empty, [["d","i","f","f","e","r","e","n","c","e"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Conss([Atom(["a","d","d","1"]), Conss([Conss([Atom(["a","d","d","1"]), Conss([Atom(["x"]), Nill])]), Nill])]), Conss([Atom(["2"]), Nill])])]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["x"]), Nill])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Conss([Atom(["a","d","d","1"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["y"]), Conss([Atom(["z"]), Nill])])]), Conss([Atom(["z"]), Nill])])]), Conss([Conss([Atom(["a","d","d","1"]), Conss([Atom(["y"]), Nill])]), Nill])])]), Nill])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["b"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["a"]), Conss([Atom(["c"]), Nill])])]), Nill])])]), Conss([Atom(["a"]), Nill])])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["b"]), Conss([Atom(["c"]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Atom(["z"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Atom(["y"]), Conss([Atom(["z"]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["y"]), Conss([Atom(["x"]), Nill])])]), Conss([Atom(["x"]), Nill])])]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["y"]), Nill])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Atom(["x"]), Nill])])]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["y"]), Nill])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Atom(["x"]), Conss([Atom(["x"]), Nill])])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])])]], Empty]), [["d","i","v","i","d","e","s"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["d","i","v","i","d","e","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Conss([Atom(["r","e","m","a","i","n","d","e","r"]), Conss([Atom(["y"]), Conss([Atom(["x"]), Nill])])]), Nill])]), Nill])])])]], Node([Empty, [["d","s","o","r","t"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["d","s","o","r","t"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["s","o","r","t","2"]), Conss([Atom(["x"]), Nill])]), Nill])])])]], Empty])])]), [["e","q","p"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","p"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["y"]), Nill])]), Nill])])]), Nill])])])]], Node([Node([Node([Node([Empty, [["e","q","u","a","l"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Atom(["z"]), Nill])])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["t"]), Conss([Atom(["z"]), Nill])])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["f"]), Conss([Atom(["z"]), Nill])])]), Nill])])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Atom(["z"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["y"]), Conss([Atom(["z"]), Nill])])]), Nill])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["z"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["y"]), Conss([Atom(["x"]), Nill])])]), Nill])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["z"]), Nill])]), Nill])])]), Nill])])])]), Nill])])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["a"]), Conss([Atom(["b"]), Nill])])]), Conss([Atom(["1"]), Nill])])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["a"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]), Nill])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["b"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]), Nill])]), Conss([Conss([Atom(["n","u","m","b","e","r","p"]), Conss([Atom(["a"]), Nill])]), Conss([Conss([Atom(["n","u","m","b","e","r","p"]), Conss([Atom(["b"]), Nill])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["1","-"]), Conss([Atom(["a"]), Nill])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["1","-"]), Conss([Atom(["b"]), Nill])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]), Nill])])])])])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["x"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["o","r"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["x"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["n","u","m","b","e","r","p"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["y"]), Conss([Atom(["1"]), Nill])])]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["z"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["w"]), Conss([Atom(["z"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["n","u","m","b","e","r","p"]), Conss([Atom(["z"]), Nill])]), Conss([Conss([Atom(["o","r"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["z"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["w"]), Conss([Atom(["1"]), Nill])])]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["g","r","e","a","t","e","s","t","-","f","a","c","t","o","r"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Atom(["1"]), Nill])])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["x"]), Conss([Atom(["1"]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["g","r","e","a","t","e","s","t","-","f","a","c","t","o","r"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["o","r"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["y"]), Nill])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["y"]), Conss([Atom(["1"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["x"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["f","l","a","t","t","e","n"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Atom(["y"]), Conss([Conss([Atom(["N","i","l","l"]), Nill]), Nill])])]), Nill])])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["n","l","i","s","t","p"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["a"]), Conss([Atom(["b"]), Nill])])]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["a"]), Conss([Atom(["c"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["b"]), Conss([Atom(["c"]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]), Conss([Conss([Atom(["o","r"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["y"]), Nill])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["x"]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["n","u","m","b","e","r","p"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["o","r"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["x"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["y"]), Nill])]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["y"]), Conss([Atom(["x"]), Nill])])]), Nill])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["a"]), Conss([Atom(["b"]), Nill])])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["a"]), Conss([Atom(["c"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["b"]), Nill])]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["c"]), Nill])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["a"]), Conss([Atom(["b"]), Nill])])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["a"]), Nill])]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["b"]), Nill])]), Nill])])]), Nill])])])]], Empty]), [["e","v","e","n","1"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","v","e","n","1"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["t"]), Nill]), Conss([Conss([Atom(["o","d","d"]), Conss([Conss([Atom(["1","-"]), Conss([Atom(["x"]), Nill])]), Nill])]), Nill])])])]), Nill])])])]], Node([Node([Empty, [["e","x","e","c"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","x","e","c"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Atom(["p","d","s"]), Conss([Atom(["e","n","v","r","n"]), Nill])])])]), Conss([Conss([Atom(["e","x","e","c"]), Conss([Atom(["y"]), Conss([Conss([Atom(["e","x","e","c"]), Conss([Atom(["x"]), Conss([Atom(["p","d","s"]), Conss([Atom(["e","n","v","r","n"]), Nill])])])]), Conss([Atom(["e","n","v","r","n"]), Nill])])])]), Nill])])])]], Node([Empty, [["e","x","p"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","x","p"]), Conss([Atom(["i"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["j"]), Conss([Atom(["k"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["e","x","p"]), Conss([Conss([Atom(["e","x","p"]), Conss([Atom(["i"]), Conss([Atom(["j"]), Nill])])]), Conss([Atom(["k"]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","x","p"]), Conss([Atom(["i"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["j"]), Conss([Atom(["k"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Conss([Atom(["e","x","p"]), Conss([Atom(["i"]), Conss([Atom(["j"]), Nill])])]), Conss([Conss([Atom(["e","x","p"]), Conss([Atom(["i"]), Conss([Atom(["k"]), Nill])])]), Nill])])]), Nill])])])]], Empty])]), [["f","a","c","t","-"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["f","a","c","t","-"]), Conss([Atom(["i"]), Nill])]), Conss([Conss([Atom(["f","a","c","t","-","l","o","o","p"]), Conss([Atom(["i"]), Conss([Atom(["1"]), Nill])])]), Nill])])])]], Node([Empty, [["f","a","l","s","i","f","y"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["f","a","l","s","i","f","y"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["f","a","l","s","i","f","y","1"]), Conss([Conss([Atom(["n","o","r","m","a","l","i","z","e"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["N","i","l","l"]), Nill]), Nill])])]), Nill])])])]], Node([Empty, [["f","i","x"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["n","u","m","b","e","r","p"]), Conss([Atom(["x"]), Nill])]), Conss([Atom(["x"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])])]), Nill])])])]], Node([Node([Empty, [["f","l","a","t","t","e","n"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["f","l","a","t","t","e","n"]), Conss([Conss([Atom(["c","d","r"]), Conss([Conss([Atom(["g","o","p","h","e","r"]), Conss([Atom(["x"]), Nill])]), Nill])]), Nill])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["l","i","s","t","p"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["c","d","r"]), Conss([Conss([Atom(["f","l","a","t","t","e","n"]), Conss([Atom(["x"]), Nill])]), Nill])]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Conss([Conss([Atom(["N","i","l","l"]), Nill]), Nill])])]), Nill])])])]), Nill])])])]], Empty]), [["g","c","d"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["g","c","d"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Atom(["z"]), Nill])])]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["y"]), Conss([Atom(["z"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["z"]), Conss([Conss([Atom(["g","c","d"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["g","c","d"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["g","c","d"]), Conss([Atom(["y"]), Conss([Atom(["x"]), Nill])])]), Nill])])])]], Node([Empty, [["g","e","t"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["g","e","t"]), Conss([Atom(["j"]), Conss([Conss([Atom(["s","e","t"]), Conss([Atom(["i"]), Conss([Atom(["v","a","l"]), Conss([Atom(["m","e","m"]), Nill])])])]), Nill])])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["e","q","p"]), Conss([Atom(["j"]), Conss([Atom(["i"]), Nill])])]), Conss([Atom(["v","a","l"]), Conss([Conss([Atom(["g","e","t"]), Conss([Atom(["j"]), Conss([Atom(["m","e","m"]), Nill])])]), Nill])])])]), Nill])])])]], Empty])])])])])]), [["g","r","e","a","t","e","r","e","q","p"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["g","r","e","a","t","e","r","e","q","p"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["y"]), Conss([Atom(["x"]), Nill])])]), Nill])]), Nill])])])]], Node([Empty, [["g","r","e","a","t","e","r","e","q","p","r"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["g","r","e","a","t","e","r","e","q","p","r"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])]), Nill])])])]], Empty])]), [["g","r","e","a","t","e","r","p"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["g","r","e","a","t","e","r","p"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["y"]), Conss([Atom(["x"]), Nill])])]), Nill])])])]], Node([Node([Node([Empty, [["i","f"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["i","f"]), Conss([Atom(["a"]), Conss([Atom(["b"]), Conss([Atom(["c"]), Nill])])])]), Conss([Atom(["d"]), Conss([Atom(["e"]), Nill])])])]), Conss([Conss([Atom(["i","f"]), Conss([Atom(["a"]), Conss([Conss([Atom(["i","f"]), Conss([Atom(["b"]), Conss([Atom(["d"]), Conss([Atom(["e"]), Nill])])])]), Conss([Conss([Atom(["i","f"]), Conss([Atom(["c"]), Conss([Atom(["d"]), Conss([Atom(["e"]), Nill])])])]), Nill])])])]), Nill])])])]], Empty]), [["i","f","f"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["i","f","f"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["i","m","p","l","i","e","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["i","m","p","l","i","e","s"]), Conss([Atom(["y"]), Conss([Atom(["x"]), Nill])])]), Nill])])]), Nill])])])]], Node([Empty, [["i","m","p","l","i","e","s"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["i","m","p","l","i","e","s"]), Conss([Atom(["p"]), Conss([Atom(["q"]), Nill])])]), Conss([Conss([Atom(["i","f"]), Conss([Atom(["p"]), Conss([Conss([Atom(["i","f"]), Conss([Atom(["q"]), Conss([Conss([Atom(["t"]), Nill]), Conss([Conss([Atom(["f"]), Nill]), Nill])])])]), Conss([Conss([Atom(["t"]), Nill]), Nill])])])]), Nill])])])]], Node([Node([Empty, [["l","a","s","t"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","a","s","t"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["a"]), Conss([Atom(["b"]), Nill])])]), Nill])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["l","i","s","t","p"]), Conss([Atom(["b"]), Nill])]), Conss([Conss([Atom(["l","a","s","t"]), Conss([Atom(["b"]), Nill])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["l","i","s","t","p"]), Conss([Atom(["a"]), Nill])]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Conss([Atom(["c","a","r"]), Conss([Conss([Atom(["l","a","s","t"]), Conss([Atom(["a"]), Nill])]), Nill])]), Conss([Atom(["b"]), Nill])])]), Conss([Atom(["b"]), Nill])])])]), Nill])])])]), Nill])])])]], Empty]), [["l","e","n","g","t","h"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","e","n","g","t","h"]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Atom(["x","1"]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Atom(["x","2"]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Atom(["x","3"]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Atom(["x","4"]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Atom(["x","5"]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Atom(["x","6"]), Conss([Atom(["x","7"]), Nill])])]), Nill])])]), Nill])])]), Nill])])]), Nill])])]), Nill])])]), Nill])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["6"]), Conss([Conss([Atom(["l","e","n","g","t","h"]), Conss([Atom(["x","7"]), Nill])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","e","n","g","t","h"]), Conss([Conss([Atom(["r","e","v","e","r","s","e"]), Conss([Atom(["x"]), Nill])]), Nill])]), Conss([Conss([Atom(["l","e","n","g","t","h"]), Conss([Atom(["x"]), Nill])]), Nill])])])]], Empty])])]), [["l","e","s","s","e","q","p"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","e","s","s","e","q","p"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["y"]), Conss([Atom(["x"]), Nill])])]), Nill])]), Nill])])])]], Node([Node([Node([Node([Node([Node([Node([Empty, [["l","e","s","s","p"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Conss([Atom(["l","e","n","g","t","h"]), Conss([Conss([Atom(["d","e","l","e","t","e"]), Conss([Atom(["x"]), Conss([Atom(["l"]), Nill])])]), Nill])]), Conss([Conss([Atom(["l","e","n","g","t","h"]), Conss([Atom(["l"]), Nill])]), Nill])])]), Conss([Conss([Atom(["m","e","m","b","e","r"]), Conss([Atom(["x"]), Conss([Atom(["l"]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["y"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["x"]), Nill])]), Nill])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Atom(["z"]), Nill])])]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["y"]), Conss([Atom(["z"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["z"]), Nill])]), Nill])]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Atom(["z"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["y"]), Conss([Atom(["z"]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Conss([Atom(["r","e","m","a","i","n","d","e","r"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Atom(["x"]), Nill])])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["y"]), Nill])]), Nill])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["x"]), Nill])]), Nill])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])]), Nill])])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Conss([Atom(["q","u","o","t","i","e","n","t"]), Conss([Atom(["i"]), Conss([Atom(["j"]), Nill])])]), Conss([Atom(["i"]), Nill])])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["i"]), Nill])]), Nill])]), Conss([Conss([Atom(["o","r"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["j"]), Nill])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["j"]), Conss([Atom(["1"]), Nill])])]), Nill])]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Conss([Atom(["r","e","m","a","i","n","d","e","r"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["y"]), Nill])]), Nill])]), Nill])])])]], Node([Empty, [["l","i","s","t","p"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","i","s","t","p"]), Conss([Conss([Atom(["g","o","p","h","e","r"]), Conss([Atom(["x"]), Nill])]), Nill])]), Conss([Conss([Atom(["l","i","s","t","p"]), Conss([Atom(["x"]), Nill])]), Nill])])])]], Empty])]), [["m","c","-","f","l","a","t","t","e","n"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["m","c","-","f","l","a","t","t","e","n"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Conss([Atom(["f","l","a","t","t","e","n"]), Conss([Atom(["x"]), Nill])]), Conss([Atom(["y"]), Nill])])]), Nill])])])]], Empty]), [["m","e","a","n","i","n","g"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["m","e","a","n","i","n","g"]), Conss([Conss([Atom(["p","l","u","s","-","t","r","e","e"]), Conss([Conss([Atom(["d","e","l","e","t","e"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])]), Conss([Atom(["a"]), Nill])])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["m","e","m","b","e","r"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Conss([Atom(["m","e","a","n","i","n","g"]), Conss([Conss([Atom(["p","l","u","s","-","t","r","e","e"]), Conss([Atom(["y"]), Nill])]), Conss([Atom(["a"]), Nill])])]), Conss([Conss([Atom(["m","e","a","n","i","n","g"]), Conss([Atom(["x"]), Conss([Atom(["a"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["m","e","a","n","i","n","g"]), Conss([Conss([Atom(["p","l","u","s","-","t","r","e","e"]), Conss([Atom(["y"]), Nill])]), Conss([Atom(["a"]), Nill])])]), Nill])])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["m","e","a","n","i","n","g"]), Conss([Conss([Atom(["p","l","u","s","-","t","r","e","e"]), Conss([Conss([Atom(["p","l","u","s","-","f","r","i","n","g","e"]), Conss([Atom(["x"]), Nill])]), Nill])]), Conss([Atom(["a"]), Nill])])]), Conss([Conss([Atom(["f","i","x"]), Conss([Conss([Atom(["m","e","a","n","i","n","g"]), Conss([Atom(["x"]), Conss([Atom(["a"]), Nill])])]), Nill])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["m","e","a","n","i","n","g"]), Conss([Conss([Atom(["p","l","u","s","-","t","r","e","e"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])]), Conss([Atom(["a"]), Nill])])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Conss([Atom(["m","e","a","n","i","n","g"]), Conss([Conss([Atom(["p","l","u","s","-","t","r","e","e"]), Conss([Atom(["x"]), Nill])]), Conss([Atom(["a"]), Nill])])]), Conss([Conss([Atom(["m","e","a","n","i","n","g"]), Conss([Conss([Atom(["p","l","u","s","-","t","r","e","e"]), Conss([Atom(["y"]), Nill])]), Conss([Atom(["a"]), Nill])])]), Nill])])]), Nill])])])]], Node([Empty, [["m","e","m","b","e","r"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["m","e","m","b","e","r"]), Conss([Atom(["a"]), Conss([Conss([Atom(["i","n","t","e","r","s","e","c","t"]), Conss([Atom(["b"]), Conss([Atom(["c"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["m","e","m","b","e","r"]), Conss([Atom(["a"]), Conss([Atom(["b"]), Nill])])]), Conss([Conss([Atom(["m","e","m","b","e","r"]), Conss([Atom(["a"]), Conss([Atom(["c"]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["m","e","m","b","e","r"]), Conss([Atom(["x"]), Conss([Conss([Atom(["r","e","v","e","r","s","e"]), Conss([Atom(["y"]), Nill])]), Nill])])]), Conss([Conss([Atom(["m","e","m","b","e","r"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["m","e","m","b","e","r"]), Conss([Atom(["x"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["a"]), Conss([Atom(["b"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["o","r"]), Conss([Conss([Atom(["m","e","m","b","e","r"]), Conss([Atom(["x"]), Conss([Atom(["a"]), Nill])])]), Conss([Conss([Atom(["m","e","m","b","e","r"]), Conss([Atom(["x"]), Conss([Atom(["b"]), Nill])])]), Nill])])]), Nill])])])]], Empty])]), [["n","o","t"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["n","o","t"]), Conss([Atom(["p"]), Nill])]), Conss([Conss([Atom(["i","f"]), Conss([Atom(["p"]), Conss([Conss([Atom(["f"]), Nill]), Conss([Conss([Atom(["t"]), Nill]), Nill])])])]), Nill])])])]], Node([Empty, [["n","t","h"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["n","t","h"]), Conss([Conss([Atom(["N","i","l","l"]), Nill]), Conss([Atom(["i"]), Nill])])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["i"]), Nill])]), Conss([Conss([Atom(["N","i","l","l"]), Nill]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["n","t","h"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["a"]), Conss([Atom(["b"]), Nill])])]), Conss([Atom(["i"]), Nill])])]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Conss([Atom(["n","t","h"]), Conss([Atom(["a"]), Conss([Atom(["i"]), Nill])])]), Conss([Conss([Atom(["n","t","h"]), Conss([Atom(["b"]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Atom(["i"]), Conss([Conss([Atom(["l","e","n","g","t","h"]), Conss([Atom(["a"]), Nill])]), Nill])])]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["n","t","h"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Conss([Atom(["i"]), Nill])])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])])]], Node([Empty, [["n","u","m","b","e","r","p"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["n","u","m","b","e","r","p"]), Conss([Conss([Atom(["g","r","e","a","t","e","s","t","-","f","a","c","t","o","r"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["o","r"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["y"]), Nill])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["y"]), Conss([Atom(["1"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["n","u","m","b","e","r","p"]), Conss([Atom(["x"]), Nill])]), Nill])]), Nill])])]), Nill])]), Nill])])])]], Empty])])]), [["o","r"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["o","r"]), Conss([Atom(["p"]), Conss([Atom(["q"]), Nill])])]), Conss([Conss([Atom(["i","f"]), Conss([Atom(["p"]), Conss([Conss([Atom(["t"]), Nill]), Conss([Conss([Atom(["i","f"]), Conss([Atom(["q"]), Conss([Conss([Atom(["t"]), Nill]), Conss([Conss([Atom(["f"]), Nill]), Nill])])])]), Nill])])])]), Nill])])])]], Node([Empty, [["p","l","u","s"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Conss([Atom(["a","d","d","1"]), Conss([Atom(["y"]), Nill])]), Nill])])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["n","u","m","b","e","r","p"]), Conss([Atom(["y"]), Nill])]), Conss([Conss([Atom(["a","d","d","1"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])]), Conss([Conss([Atom(["a","d","d","1"]), Conss([Atom(["x"]), Nill])]), Nill])])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Conss([Atom(["r","e","m","a","i","n","d","e","r"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["y"]), Conss([Conss([Atom(["q","u","o","t","i","e","n","t"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Nill])])]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["x"]), Nill])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Atom(["z"]), Nill])])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["y"]), Conss([Atom(["z"]), Nill])])]), Nill])])]), Nill])])])]], Node([Empty, [["p","o","w","e","r","-","e","v","a","l"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["p","o","w","e","r","-","e","v","a","l"]), Conss([Conss([Atom(["b","i","g","-","p","l","u","s"]), Conss([Conss([Atom(["p","o","w","e","r","-","r","e","p"]), Conss([Atom(["i"]), Conss([Atom(["b","a","s","e"]), Nill])])]), Conss([Conss([Atom(["p","o","w","e","r","-","r","e","p"]), Conss([Atom(["j"]), Conss([Atom(["b","a","s","e"]), Nill])])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Conss([Atom(["b","a","s","e"]), Nill])])])])]), Conss([Atom(["b","a","s","e"]), Nill])])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["i"]), Conss([Atom(["j"]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["p","o","w","e","r","-","e","v","a","l"]), Conss([Conss([Atom(["p","o","w","e","r","-","r","e","p"]), Conss([Atom(["i"]), Conss([Atom(["b","a","s","e"]), Nill])])]), Conss([Atom(["b","a","s","e"]), Nill])])]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["i"]), Nill])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["p","o","w","e","r","-","e","v","a","l"]), Conss([Conss([Atom(["b","i","g","-","p","l","u","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Conss([Atom(["i"]), Conss([Atom(["b","a","s","e"]), Nill])])])])]), Conss([Atom(["b","a","s","e"]), Nill])])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["i"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Conss([Atom(["p","o","w","e","r","-","e","v","a","l"]), Conss([Atom(["x"]), Conss([Atom(["b","a","s","e"]), Nill])])]), Conss([Conss([Atom(["p","o","w","e","r","-","e","v","a","l"]), Conss([Atom(["y"]), Conss([Atom(["b","a","s","e"]), Nill])])]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["p","o","w","e","r","-","e","v","a","l"]), Conss([Conss([Atom(["b","i","g","-","p","l","u","s","1"]), Conss([Atom(["l"]), Conss([Atom(["i"]), Conss([Atom(["b","a","s","e"]), Nill])])])]), Conss([Atom(["b","a","s","e"]), Nill])])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Conss([Atom(["p","o","w","e","r","-","e","v","a","l"]), Conss([Atom(["l"]), Conss([Atom(["b","a","s","e"]), Nill])])]), Conss([Atom(["i"]), Nill])])]), Nill])])])]], Empty])])]), [["p","r","i","m","e"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["p","r","i","m","e"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["x"]), Nill])]), Nill])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["x"]), Conss([Conss([Atom(["a","d","d","1"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])]), Nill])])]), Nill])]), Conss([Conss([Atom(["p","r","i","m","e","1"]), Conss([Atom(["x"]), Conss([Conss([Atom(["1","-"]), Conss([Atom(["x"]), Nill])]), Nill])])]), Nill])])])]), Nill])])])]], Node([Node([Node([Empty, [["p","r","i","m","e","-","l","i","s","t"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["p","r","i","m","e","-","l","i","s","t"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["p","r","i","m","e","-","l","i","s","t"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["p","r","i","m","e","-","l","i","s","t"]), Conss([Atom(["y"]), Nill])]), Nill])])]), Nill])])])]], Node([Empty, [["q","u","o","t","i","e","n","t"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["q","u","o","t","i","e","n","t"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["y"]), Conss([Atom(["x"]), Nill])])]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["y"]), Nill])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["x"]), Nill])]), Nill])])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["q","u","o","t","i","e","n","t"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Conss([Atom(["2"]), Nill])])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Conss([Atom(["q","u","o","t","i","e","n","t"]), Conss([Atom(["y"]), Conss([Atom(["2"]), Nill])])]), Nill])])]), Nill])])])]], Empty])]), [["r","e","m","a","i","n","d","e","r"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["r","e","m","a","i","n","d","e","r"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["y"]), Conss([Atom(["x"]), Nill])])]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["r","e","m","a","i","n","d","e","r"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Atom(["z"]), Nill])])]), Conss([Atom(["z"]), Nill])])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["r","e","m","a","i","n","d","e","r"]), Conss([Atom(["x"]), Conss([Atom(["x"]), Nill])])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["r","e","m","a","i","n","d","e","r"]), Conss([Atom(["y"]), Conss([Atom(["1"]), Nill])])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])])]], Empty]), [["r","e","v","e","r","s","e"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["r","e","v","e","r","s","e"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["a"]), Conss([Atom(["b"]), Nill])])]), Nill])]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Conss([Atom(["r","e","v","e","r","s","e"]), Conss([Atom(["b"]), Nill])]), Conss([Conss([Atom(["r","e","v","e","r","s","e"]), Conss([Atom(["a"]), Nill])]), Nill])])]), Nill])])])]], Empty])]), [["r","e","v","e","r","s","e","-"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["r","e","v","e","r","s","e","-"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["r","e","v","e","r","s","e","-","l","o","o","p"]), Conss([Atom(["x"]), Conss([Conss([Atom(["N","i","l","l"]), Nill]), Nill])])]), Nill])])])]], Node([Node([Empty, [["r","e","v","e","r","s","e","-","l","o","o","p"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["r","e","v","e","r","s","e","-","l","o","o","p"]), Conss([Atom(["x"]), Conss([Conss([Atom(["N","i","l","l"]), Nill]), Nill])])]), Conss([Conss([Atom(["r","e","v","e","r","s","e"]), Conss([Atom(["x"]), Nill])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["r","e","v","e","r","s","e","-","l","o","o","p"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Conss([Atom(["r","e","v","e","r","s","e"]), Conss([Atom(["x"]), Nill])]), Conss([Atom(["y"]), Nill])])]), Nill])])])]], Node([Empty, [["s","a","m","e","f","r","i","n","g","e"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["s","a","m","e","f","r","i","n","g","e"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["f","l","a","t","t","e","n"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["f","l","a","t","t","e","n"]), Conss([Atom(["y"]), Nill])]), Nill])])]), Nill])])])]], Node([Node([Empty, [["s","i","g","m","a"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["s","i","g","m","a"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Conss([Atom(["i"]), Nill])])]), Conss([Conss([Atom(["q","u","o","t","i","e","n","t"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["i"]), Conss([Conss([Atom(["a","d","d","1"]), Conss([Atom(["i"]), Nill])]), Nill])])]), Conss([Atom(["2"]), Nill])])]), Nill])])])]], Empty]), [["s","o","r","t","2"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["s","o","r","t","2"]), Conss([Conss([Atom(["d","e","l","e","t","e"]), Conss([Atom(["x"]), Conss([Atom(["l"]), Nill])])]), Nill])]), Conss([Conss([Atom(["d","e","l","e","t","e"]), Conss([Atom(["x"]), Conss([Conss([Atom(["s","o","r","t","2"]), Conss([Atom(["l"]), Nill])]), Nill])])]), Nill])])])]], Empty])])]), [["t","a","u","t","o","l","o","g","y","-","c","h","e","c","k","e","r"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["t","a","u","t","o","l","o","g","y","-","c","h","e","c","k","e","r"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["t","a","u","t","o","l","o","g","y","p"]), Conss([Conss([Atom(["n","o","r","m","a","l","i","z","e"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["N","i","l","l"]), Nill]), Nill])])]), Nill])])])]], Node([Node([Empty, [["t","i","m","e","s"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Conss([Atom(["a","d","d","1"]), Conss([Atom(["y"]), Nill])]), Nill])])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["n","u","m","b","e","r","p"]), Conss([Atom(["y"]), Nill])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["x"]), Nill])]), Nill])])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Atom(["c"]), Conss([Atom(["w"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["c"]), Conss([Atom(["x"]), Nill])])]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["w"]), Conss([Atom(["x"]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Atom(["z"]), Nill])])]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["y"]), Conss([Atom(["z"]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["y"]), Conss([Atom(["z"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Atom(["z"]), Nill])])]), Nill])])]), Nill])])])]], Node([Node([Empty, [["t","i","m","e","s","-","l","i","s","t"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["t","i","m","e","s","-","l","i","s","t"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Conss([Atom(["t","i","m","e","s","-","l","i","s","t"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["t","i","m","e","s","-","l","i","s","t"]), Conss([Atom(["y"]), Nill])]), Nill])])]), Nill])])])]], Empty]), [["v","a","l","u","e"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["v","a","l","u","e"]), Conss([Conss([Atom(["n","o","r","m","a","l","i","z","e"]), Conss([Atom(["x"]), Nill])]), Conss([Atom(["a"]), Nill])])]), Conss([Conss([Atom(["v","a","l","u","e"]), Conss([Atom(["x"]), Conss([Atom(["a"]), Nill])])]), Nill])])])]], Empty])]), [["z","e","r","o","p"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["o","r"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["x"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["n","u","m","b","e","r","p"]), Conss([Atom(["x"]), Nill])]), Nill])]), Nill])])]), Nill])])])]], Empty])])])])])])]) +//│ FAILURE: Unexpected type error +//│ FAILURE LOCATION: term (Elaborator.scala:331) +//│ ╔══[ERROR] Name not found: rules +//│ ║ l.328: let lemmas = addlemmalst(makelemmas(rules), Empty) +//│ ╙── ^^^^^ +//│ FAILURE: Unexpected exception +//│ /!!!\ Uncaught error: hkmc2.InternalError: Not in scope: lemmas (class hkmc2.semantics.VarSymbol) +//│ at: hkmc2.InternalError$.apply(Diagnostic.scala:60) +//│ at: hkmc2.InternalError$.apply(Diagnostic.scala:71) +//│ at: hkmc2.utils.Scope.lookup_$bang$$anonfun$1(Scope.scala:93) +//│ at: scala.Option.getOrElse(Option.scala:201) +//│ at: hkmc2.utils.Scope.lookup_$bang(Scope.scala:94) +//│ at: hkmc2.codegen.js.JSBuilder.getVar(JSBuilder.scala:77) +//│ at: hkmc2.codegen.js.JSBuilder.result(JSBuilder.scala:96) +//│ at: hkmc2.codegen.js.JSBuilder.argument(JSBuilder.scala:80) +//│ at: hkmc2.codegen.js.JSBuilder.$anonfun$2(JSBuilder.scala:122) +//│ at: scala.collection.immutable.List.map(List.scala:247) fun tautp(term) = tautologyp([rewrite(term, lemmas), Nill, Nill]) +//│ FAILURE: Unexpected exception +//│ /!!!\ Uncaught error: hkmc2.InternalError: Not in scope: lemmas (class hkmc2.semantics.VarSymbol) +//│ at: hkmc2.InternalError$.apply(Diagnostic.scala:60) +//│ at: hkmc2.InternalError$.apply(Diagnostic.scala:71) +//│ at: hkmc2.utils.Scope.lookup_$bang$$anonfun$1(Scope.scala:93) +//│ at: scala.Option.getOrElse(Option.scala:201) +//│ at: hkmc2.utils.Scope.lookup_$bang(Scope.scala:94) +//│ at: hkmc2.codegen.js.JSBuilder.getVar(JSBuilder.scala:77) +//│ at: hkmc2.codegen.js.JSBuilder.result(JSBuilder.scala:96) +//│ at: hkmc2.codegen.js.JSBuilder.argument(JSBuilder.scala:80) +//│ at: hkmc2.codegen.js.JSBuilder.$anonfun$2(JSBuilder.scala:122) +//│ at: scala.collection.immutable.List.map(List.scala:251) fun teststatement(i) = applysubst(subterm(i), statement) @@ -336,7 +366,22 @@ fun testBoyer2_nofib(n) = report(testresult(n)) :expect "The term is a tautology" testBoyer2_nofib(3) -//│ = "The term is a tautology" +//│ FAILURE: Unexpected runtime error +//│ FAILURE LOCATION: mkQuery (JSBackendDiffMaker.scala:146) +//│ ═══[RUNTIME ERROR] ReferenceError: tautp is not defined +//│ at testresult (REPL122:1:227) +//│ at testBoyer2_nofib (REPL125:1:215) +//│ at REPL128:1:39 +//│ at ContextifyScript.runInThisContext (node:vm:137:12) +//│ at REPLServer.defaultEval (node:repl:597:22) +//│ at bound (node:domain:433:15) +//│ at REPLServer.runBound [as eval] (node:domain:444:12) +//│ at REPLServer.onLine (node:repl:926:10) +//│ at REPLServer.emit (node:events:524:28) +//│ at REPLServer.emit (node:domain:489:12) +//│ FAILURE: Unexpected runtime error +//│ FAILURE LOCATION: processTerm (JSBackendDiffMaker.scala:192) +//│ ═══[RUNTIME ERROR] Expected: '"The term is a tautology"', got: 'undefined' diff --git a/hkmc2/shared/src/test/mlscript/nofib/cichelli.mls b/hkmc2/shared/src/test/mlscript/nofib/cichelli.mls index 7ccddb9146..7f9b27af0f 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/cichelli.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/cichelli.mls @@ -22,9 +22,9 @@ fun last(ls) = h :: t then go(h, t) else throw Error("last: empty list") -class K(s: String, c1: Char, c2: Char, i: Int) +data class K(s: String, c1: Char, c2: Char, i: Int) -class H(f: Option[Int], s: Option[Int], ls: List[Int]) +data class H(f: Option[Int], s: Option[Int], ls: List[Int]) fun ends(k) = if k is K(_, a, z, _) then a :: z :: Nil @@ -92,9 +92,10 @@ let maxval = listLen(freqtab) abstract class Status[T]: NotEver | YesIts[T] -class - NotEver(i: Int) extends Status[Nothing] - YesIts[T](i: Int, t: T) extends Status[T] +data + class + NotEver(i: Int) extends Status[Nothing] + YesIts[T](i: Int, t: T) extends Status[T] fun hinsert(h, hh) = if hh is H(lo, hi, hs) then let lo_ = minm(lo, h) diff --git a/hkmc2/shared/src/test/mlscript/nofib/circsim.mls b/hkmc2/shared/src/test/mlscript/nofib/circsim.mls index 48ee27f27d..14222fa034 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/circsim.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/circsim.mls @@ -6,9 +6,10 @@ abstract class BinTree[T, U]: Cell[T] | Node[T, U] -class - Cell[T](value: T) extends BinTree[T, Nothing] - Node[T, U](value: U, left: BinTree[T, U], right: BinTree[T, U]) extends BinTree[T, U] +data + class + Cell[T](value: T) extends BinTree[T, Nothing] + Node[T, U](value: U, left: BinTree[T, U], right: BinTree[T, U]) extends BinTree[T, U] abstract class Componenet: None_ | Inp | Outp | Dff | Inv | And2 | Or2 | Xor @@ -24,7 +25,7 @@ object object Unit -class PS[T](pid: Int, compType: Componenet, pathDepth: Int, inports: List[[Int, Int, T]], outports: List[[Int, T, Bool, Int, Bool, Int]]) +data class PS[T](pid: Int, compType: Componenet, pathDepth: Int, inports: List[[Int, Int, T]], outports: List[[Int, T, Bool, Int, Bool, Int]]) fun pid(p) = p.pid diff --git a/hkmc2/shared/src/test/mlscript/nofib/clausify.mls b/hkmc2/shared/src/test/mlscript/nofib/clausify.mls index 2492afc8b3..2a49f0f1dc 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/clausify.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/clausify.mls @@ -5,19 +5,21 @@ abstract class Formula: Sym | Not | Dis | Con | Imp | Eqv -class - Sym(a: Char) extends Formula - Not(a: Formula) extends Formula - Dis(a: Formula, b: Formula) extends Formula - Con(a: Formula, b: Formula) extends Formula - Imp(a: Formula, b: Formula) extends Formula - Eqv(a: Formula, b: Formula) extends Formula +data + class + Sym(a: Char) extends Formula + Not(a: Formula) extends Formula + Dis(a: Formula, b: Formula) extends Formula + Con(a: Formula, b: Formula) extends Formula + Imp(a: Formula, b: Formula) extends Formula + Eqv(a: Formula, b: Formula) extends Formula abstract class StackFrame: Ast | Lex -class - Ast(f: Formula) extends StackFrame - Lex(s: Char) extends StackFrame +data + class + Ast(f: Formula) extends StackFrame + Lex(s: Char) extends StackFrame fun charLt(a, b) = a < b fun charLeq(a, b) = a <= b diff --git a/hkmc2/shared/src/test/mlscript/nofib/constraints.mls b/hkmc2/shared/src/test/mlscript/nofib/constraints.mls index 74d4cd5ddb..0af3426516 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/constraints.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/constraints.mls @@ -5,9 +5,9 @@ // -- Figure 1. CSPs in Haskell. -class Assign(varr: Int, value: Int) +data class Assign(varr: Int, value: Int) -class CSP(vars: Int, vals: Int, rel: Int) +data class CSP(vars: Int, vals: Int, rel: Int) :... //│ ———————————————————————————————————————————————————————————————————————————————— @@ -86,7 +86,7 @@ fun safe(as1, as2) = if as1 is Assign(i, m) and as2 is Assign(j, n) then not(m = fun queens(n) = CSP(n, n, safe) // -- Figure 2. Trees in Haskell. -class Node[out T](lab: T, children: List[Node[T]]) +data class Node[out T](lab: T, children: List[Node[T]]) fun label(n) = if n is Node(l, _) then l @@ -145,7 +145,7 @@ fun btsolver0(csp) = // -- Figure 6. Conflict-directed solving of CSPs. abstract class ConflictSet: Known | Unknown -class Known(vs: List[Int]) extends ConflictSet +data class Known(vs: List[Int]) extends ConflictSet object Unknown extends ConflictSet fun knownConflict(c) = if c is diff --git a/hkmc2/shared/src/test/mlscript/nofib/cryptarithm2.mls b/hkmc2/shared/src/test/mlscript/nofib/cryptarithm2.mls index 302656e35b..345bc687f9 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/cryptarithm2.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/cryptarithm2.mls @@ -15,7 +15,7 @@ fun delete_(xs, e) = deleteBy((x, y) => x === y, e, xs) fun listDiff(a, ls) = foldl(delete_, a, ls) -class StateT[S, M, A](run) +data class StateT[S, M, A](run) fun runStateT(m, s) = if m is StateT(run) then run(s) @@ -38,7 +38,7 @@ fun put(s) = StateT(x => [Unit, s] :: Nil) let get = StateT(s => [s, s] :: Nil) //│ get = StateT([function]) -class Digits(i: List[Int], c: List[[Char, Int]]) +data class Digits(i: List[Int], c: List[[Char, Int]]) fun digits(d) = if d is Digits(a, b) then a diff --git a/hkmc2/shared/src/test/mlscript/nofib/cse.mls b/hkmc2/shared/src/test/mlscript/nofib/cse.mls index cfe6f18034..853cee4d73 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/cse.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/cse.mls @@ -55,7 +55,7 @@ fun set_(s_) = s => [s_, s] let incr = update(x => x + 1) //│ incr = [function] -class Node[T](a: T, b: List[Node[T]]) +data class Node[T](a: T, b: List[Node[T]]) fun labelTree(t) = fun label(t) = if t is Node(x, xs) then diff --git a/hkmc2/shared/src/test/mlscript/nofib/knights.mls b/hkmc2/shared/src/test/mlscript/nofib/knights.mls index 566967f76b..308ef244cd 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/knights.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/knights.mls @@ -78,7 +78,7 @@ fun addFront(x, q) = x :: q let createQueue = Nil //│ createQueue = [] -class Board(a: Int, b: Int, c: Lazy[[Int, Int]], d: List[[Int, Int]]) +data class Board(a: Int, b: Int, c: Lazy[[Int, Int]], d: List[[Int, Int]]) fun createBoard(x, t) = Board(x, 1, (lazy of (() => t)), t :: Nil) diff --git a/hkmc2/shared/src/test/mlscript/nofib/lambda.mls b/hkmc2/shared/src/test/mlscript/nofib/lambda.mls index 0212dc307d..e6df8676f1 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/lambda.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/lambda.mls @@ -8,7 +8,7 @@ fun lookup(k, t) = if t is Nil then None [x, v] :: t then if listEq(k, x) then Some(v) else lookup(k, t) -class MyState[S, A](r: S -> [S, A]) +data class MyState[S, A](r: S -> [S, A]) fun myRunState(m, s) = if m is MyState(f) then f(s) @@ -26,14 +26,15 @@ abstract class Term: Var | Con | Incr | Add | Lam | App | IfZero | Thunk object Incr extends Term -class - Var(s: String) extends Term - Con(i: Int) extends Term - Add(a: Term, b: Term) extends Term - Lam(s: String, t: Term) extends Term - App(a: Term, b: Term) extends Term - IfZero(a: Term, b: Term, c: Term) extends Term - Thunk(t: Term, e: List[[String, Term]]) extends Term +data + class + Var(s: String) extends Term + Con(i: Int) extends Term + Add(a: Term, b: Term) extends Term + Lam(s: String, t: Term) extends Term + App(a: Term, b: Term) extends Term + IfZero(a: Term, b: Term, c: Term) extends Term + Thunk(t: Term, e: List[[String, Term]]) extends Term object Unit diff --git a/hkmc2/shared/src/test/mlscript/nofib/last-piece.mls b/hkmc2/shared/src/test/mlscript/nofib/last-piece.mls index 3f54803744..6bbe23537f 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/last-piece.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/last-piece.mls @@ -28,7 +28,7 @@ abstract class Map[K, A]: Tip | Bin[K, A] object Tip extends Map[Anything, Nothing] -class Bin[K, A](i: Int, k: K, v: A, l: Map[K, A], r: Map[K, A]) extends Map[K, A] +data class Bin[K, A](i: Int, k: K, v: A, l: Map[K, A], r: Map[K, A]) extends Map[K, A] fun mapLookup(k, m) = if m is Tip then None @@ -90,7 +90,7 @@ fun insert(kx, x, m) = if m is fun indent(n) = if n <= 0 then Nil else " " :: indent(n - 1) -class P(i: Char, a: List[List[[Int, Int]]], b: List[List[[Int, Int]]]) +data class P(i: Char, a: List[List[[Int, Int]]], b: List[List[[Int, Int]]]) abstract class S: Male | Female @@ -106,10 +106,11 @@ abstract class Solution: Soln | Choose | Fail type Board = Map[[Int, Int], Char] -class - Soln(b: Board) extends Solution - Choose(s: List[Solution]) extends Solution - Fail(b: Board, s: [Int, Int]) extends Solution +data + class + Soln(b: Board) extends Solution + Choose(s: List[Solution]) extends Solution + Fail(b: Board, s: [Int, Int]) extends Solution fun addIntInt(row_col, orow_ocol) = if row_col is [row, col] and orow_ocol is [orow, ocol] then [row + orow, col + ocol] @@ -300,10 +301,11 @@ object abstract class TextDetails: Chr | Str | PStr -class - Chr(c: Char) extends TextDetails - Str(s: String) extends TextDetails - PStr(s: String) extends TextDetails +data + class + Chr(c: Char) extends TextDetails + Str(s: String) extends TextDetails + PStr(s: String) extends TextDetails abstract class AnnotDetails: AnnotStart | NoAnnot | AnnotEnd @@ -311,7 +313,7 @@ object AnnotStart extends AnnotDetails AnnotEnd extends AnnotDetails -class NoAnnot(t: TextDetails, i: Int) extends AnnotDetails +data class NoAnnot(t: TextDetails, i: Int) extends AnnotDetails abstract class IsEmptyy: IsEmpty | NotEmpty @@ -325,13 +327,14 @@ object Empty extends Doc NoDoc extends Doc -class - NilAbove(d: Doc) extends Doc - TextBeside(a: AnnotDetails, d: Doc) extends Doc - Nest(i: Int, d: Doc) extends Doc - Union(d1: Doc, d2: Doc) extends Doc - Beside(d1: Doc, b: Bool, d2: Doc) extends Doc - Above(d1: Doc, b: Bool, d2: Doc) extends Doc +data + class + NilAbove(d: Doc) extends Doc + TextBeside(a: AnnotDetails, d: Doc) extends Doc + Nest(i: Int, d: Doc) extends Doc + Union(d1: Doc, d2: Doc) extends Doc + Beside(d1: Doc, b: Bool, d2: Doc) extends Doc + Above(d1: Doc, b: Bool, d2: Doc) extends Doc let spaceText = NoAnnot(Chr(" "), 1) //│ spaceText = NoAnnot(Chr(" "), 1) diff --git a/hkmc2/shared/src/test/mlscript/nofib/mandel.mls b/hkmc2/shared/src/test/mlscript/nofib/mandel.mls index 6106b48b85..d12260cf93 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/mandel.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/mandel.mls @@ -4,11 +4,11 @@ :import NofibPrelude.mls -class Pixmap(a: Int, b: Int, c: Int, d:List[[Int, Int, Int]]) +data class Pixmap(a: Int, b: Int, c: Int, d:List[[Int, Int, Int]]) fun createPixmap(width, height, max, colours) = Pixmap(width, height, max, colours) -class Complex(r: Num, i: Num) +data class Complex(r: Num, i: Num) fun comp_magnitude(c) = if c is Complex(a, b) then sqrt(a * a + b * b) diff --git a/hkmc2/shared/src/test/mlscript/nofib/mandel2.mls b/hkmc2/shared/src/test/mlscript/nofib/mandel2.mls index 7de1855dc8..4b92ff30bd 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/mandel2.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/mandel2.mls @@ -6,10 +6,11 @@ abstract class MandTree: NS | EW | Leaf -class - NS(l: MandTree, r: MandTree) extends MandTree - EW(l: MandTree, r: MandTree) extends MandTree - Leaf(colour: Int) extends MandTree +data + class + NS(l: MandTree, r: MandTree) extends MandTree + EW(l: MandTree, r: MandTree) extends MandTree + Leaf(colour: Int) extends MandTree let size = 200 let pmn = -2.25 diff --git a/hkmc2/shared/src/test/mlscript/nofib/mate.mls b/hkmc2/shared/src/test/mlscript/nofib/mate.mls index 0c3ac0dfc8..ad5e4adbb7 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/mate.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/mate.mls @@ -56,13 +56,13 @@ type Piece = [Colour,Kind] type Square = [Int,Int] -class Board(a: List[[Kind, Square]], b: List[[Kind, Square]]) +data class Board(a: List[[Kind, Square]], b: List[[Kind, Square]]) -class Move(a: Square, b: Option[Piece], c: Option[Piece]) +data class Move(a: Square, b: Option[Piece], c: Option[Piece]) -class MoveInFull(a: Piece, b: Square, c: Move) +data class MoveInFull(a: Piece, b: Square, c: Move) -class Solution(a: MoveInFull, b: List[[List[MoveInFull],Solution]]) +data class Solution(a: MoveInFull, b: List[[List[MoveInFull],Solution]]) fun maybe(d, f, x) = if x is None then d @@ -482,7 +482,7 @@ fun solution(bd, c, n) = else throw Error("n <= 0") //│ ———————————————————————————————————————————————————————————————————————————————— -class Soln(a: MoveInFull, b: List[[List[MoveInFull],Soln]]) +data class Soln(a: MoveInFull, b: List[[List[MoveInFull],Soln]]) fun tab(n) = if n <= 0 then Nil else " " :: tab(n - 1) @@ -557,22 +557,16 @@ fun testMate_nofib(dummy) = solve(bd, c, n) print(nofibListToString(testMate_nofib(0))) -//│ > - - - - - - - - -//│ > - - - - - - - - -//│ > - - - - - - - - -//│ > - - - - P - - - -//│ > - - - - p - k b -//│ > - P n - K - - - -//│ > - P - - - - - - -//│ > - q - - - - - - -//│ > -//│ > White to move and mate in 3 -//│ > -//│ > 1. N/QB3-QR2, -//│ > if K-Q5; 2. B/KR4-KB2, K-QB5; 3. Q/QN1-KB1++ -//│ > if K-Q7; 2. K-KB3, P/QN6xN/QR7; 3. B/KR4-K1++ -//│ > if K-K7; 2. N/QR2-QN4, -//│ > if K-Q7; 3. Q/QN1-K1++ -//│ > if K-K6; 3. Q/QN1-Q3++ -//│ > if P/QN6xN/QR7; 2. Q/QN1-QB2, ...; 3. B/KR4-KB2++ -//│ > +//│ FAILURE: Unexpected runtime error +//│ FAILURE LOCATION: mkQuery (JSBackendDiffMaker.scala:146) +//│ ═══[RUNTIME ERROR] Error: ENOENT: no such file or directory, open 'hkmc2/shared/src/test/mlscript/nofib/input/heathcote3.prob' +//│ at Object.openSync (node:fs:562:18) +//│ at Object.readFileSync (node:fs:446:35) +//│ at testMate_nofib (REPL226:1:388) +//│ at REPL229:1:47 +//│ at ContextifyScript.runInThisContext (node:vm:137:12) +//│ at REPLServer.defaultEval (node:repl:597:22) +//│ at bound (node:domain:433:15) +//│ at REPLServer.runBound [as eval] (node:domain:444:12) +//│ at REPLServer.onLine (node:repl:926:10) +//│ at REPLServer.emit (node:events:524:28) diff --git a/hkmc2/shared/src/test/mlscript/nofib/minimax.mls b/hkmc2/shared/src/test/mlscript/nofib/minimax.mls index 87adb88449..3325df0b00 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/minimax.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/minimax.mls @@ -26,7 +26,7 @@ object XWin extends Evaluation OWin extends Evaluation -class Score(i: Int) extends Evaluation +data class Score(i: Int) extends Evaluation fun evaluationEq(x, y) = if x is XWin and y is XWin then true @@ -34,7 +34,7 @@ fun evaluationEq(x, y) = if x is Score(i) and y is Score(j) and i === j then true else false -class Branch[A](a: A, cs: List[Branch[A]]) +data class Branch[A](a: A, cs: List[Branch[A]]) fun showEvaluation(e) = if e is XWin then nofibStringToList("XWin") diff --git a/hkmc2/shared/src/test/mlscript/nofib/power.mls b/hkmc2/shared/src/test/mlscript/nofib/power.mls index 4c20a3b74f..0bb499e42b 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/power.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/power.mls @@ -8,7 +8,7 @@ abstract class Pss[T]: Pz | Pc[T] type Ps[T] = Lazy[Pss[T]] -class Pc[T](f: T, s: Ps[T]) extends Pss[T] +data class Pc[T](f: T, s: Ps[T]) extends Pss[T] object Pz extends Pss diff --git a/hkmc2/shared/src/test/mlscript/nofib/pretty.mls b/hkmc2/shared/src/test/mlscript/nofib/pretty.mls index 3d2ac0929a..4bc0d3205d 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/pretty.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/pretty.mls @@ -6,11 +6,12 @@ abstract class CSeq: CNil | CAppend | CIndent | CNewline | CStr | CCh -class - CAppend(a: CSeq, b: CSeq) extends CSeq - CIndent(a: Int, b: CSeq) extends CSeq - CStr(a: List[Char]) extends CSeq - CCh(a: Char) extends CSeq +data + class + CAppend(a: CSeq, b: CSeq) extends CSeq + CIndent(a: Int, b: CSeq) extends CSeq + CStr(a: List[Char]) extends CSeq + CCh(a: Char) extends CSeq object CNil extends CSeq @@ -64,7 +65,7 @@ fun flatten(n, nlp, cseq, seqs) = if cseq is fun cShow(seq) = flatten(0, true, seq, Nil) -class MkPrettyRep(cseq: CSeq, n: Int, b1: Bool, b2: Bool) +data class MkPrettyRep(cseq: CSeq, n: Int, b1: Bool, b2: Bool) fun ppShow(width, p) = if p(width, false) is MkPrettyRep(seq, ll, emp, sl) then cShow(seq) diff --git a/hkmc2/shared/src/test/mlscript/nofib/puzzle.mls b/hkmc2/shared/src/test/mlscript/nofib/puzzle.mls index 31576a5e9a..bbde627cc2 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/puzzle.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/puzzle.mls @@ -42,7 +42,7 @@ fun bankEq(a, b) = if a is RightBank and b is RightBank then true else false -class State(b: BankType, e: BankType, l: BankType, a: BankType) +data class State(b: BankType, e: BankType, l: BankType, a: BankType) fun stateEq(s1, s2) = if s1 is State(a, b, c, d) and s2 is State(e, f, g, h) then (bankEq(a, e) && bankEq(b, f) && bankEq(c, g) && bankEq(d, h)) diff --git a/hkmc2/shared/src/test/mlscript/nofib/sorting.mls b/hkmc2/shared/src/test/mlscript/nofib/sorting.mls index a6f250617f..7eacb33060 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/sorting.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/sorting.mls @@ -114,7 +114,7 @@ abstract class Tree[T]: Tip | Branch[T] object Tip extends Tree[Nothing] -class Branch[T](a: T, l: Tree[T], r: Tree[T]) extends Tree[T] +data class Branch[T](a: T, l: Tree[T], r: Tree[T]) extends Tree[T] fun treeSort(param) = fun mkTree(innerparam) = @@ -133,9 +133,10 @@ abstract class Tree2[T]: Tip2 | Twig2[T] | Branch2[T] object Tip2 extends Tree2[Nothing] -class - Twig2[T](a: T) extends Tree2[T] - Branch2[T](a: T, l: Tree2[T], r: Tree2[T]) extends Tree2[T] +data + class + Twig2[T](a: T) extends Tree2[T] + Branch2[T](a: T, l: Tree2[T], r: Tree2[T]) extends Tree2[T] fun treeSort2(param) = fun mkTree(innerparam) = @@ -215,4 +216,16 @@ fun testSorting_nofib(d) = hash(mangle(f)) testSorting_nofib(0) -//│ = 51324117188054929115411819706576305711291550658570113274291768822777898552447837804420193403034280334581113235670099168108057310001444698188883902000871912629747889286942274533143362191347715770581074120684028066661549409447053566864805982796651442411825424058139343253169753750307013113236996387277789074623630137288987589869641913268610508598505040964906263227437054452571059796961267985287441539342423613634888118731387934522320394294636575704912348025851038478882488022787377510287490741895262233989080994241592338442788051616303082788441666485156091668196999668892850523930511918729736856089560984406499736606084171798216360770991023233180481976810767432750226966921480421914178641779179040473344962763594357880599983085435482161632405644389584578524102239884780307588440751057343783694537559222924711205140877849398042544407611747227163056408231621727687968160470282720794027470616537695447289808133239223198869 +//│ FAILURE: Unexpected runtime error +//│ FAILURE LOCATION: mkQuery (JSBackendDiffMaker.scala:146) +//│ ═══[RUNTIME ERROR] Error: ENOENT: no such file or directory, open 'hkmc2/shared/src/test/mlscript/nofib/input/Main.hs' +//│ at Object.openSync (node:fs:562:18) +//│ at Object.readFileSync (node:fs:446:35) +//│ at testSorting_nofib (REPL108:1:240) +//│ at REPL111:1:39 +//│ at ContextifyScript.runInThisContext (node:vm:137:12) +//│ at REPLServer.defaultEval (node:repl:597:22) +//│ at bound (node:domain:433:15) +//│ at REPLServer.runBound [as eval] (node:domain:444:12) +//│ at REPLServer.onLine (node:repl:926:10) +//│ at REPLServer.emit (node:events:524:28) diff --git a/hkmc2/shared/src/test/mlscript/nofib/sphere.mls b/hkmc2/shared/src/test/mlscript/nofib/sphere.mls index 664119bc43..cbe99aa006 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/sphere.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/sphere.mls @@ -40,9 +40,10 @@ fun is_zerovector(x) = if x is [x, y, z] then (x < epsilon) && (y < epsilon) && abstract class Light: Directional | Point -class - Directional(x: [Num, Num, Num], y: [Num, Num, Num]) extends Light - Point(x: [Num, Num, Num], y: [Num, Num, Num]) extends Light +data + class + Directional(x: [Num, Num, Num], y: [Num, Num, Num]) extends Light + Point(x: [Num, Num, Num], y: [Num, Num, Num]) extends Light fun lightpos(p) = if p is Point(pos, col) then pos @@ -54,15 +55,16 @@ fun lightcolour(x) = if x is abstract class Surfspec: Ambient | Diffuse | Specular | Specpow | Reflect | Transmit | Refract | Body -class - Ambient(v: [Num, Num, Num]) extends Surfspec - Diffuse(v: [Num, Num, Num]) extends Surfspec - Specular(v: [Num, Num, Num]) extends Surfspec - Specpow(v: Num) extends Surfspec - Reflect(v: Num) extends Surfspec - Transmit(v: Num) extends Surfspec - Refract(v: Num) extends Surfspec - Body(v: [Num, Num, Num]) extends Surfspec +data + class + Ambient(v: [Num, Num, Num]) extends Surfspec + Diffuse(v: [Num, Num, Num]) extends Surfspec + Specular(v: [Num, Num, Num]) extends Surfspec + Specpow(v: Num) extends Surfspec + Reflect(v: Num) extends Surfspec + Transmit(v: Num) extends Surfspec + Refract(v: Num) extends Surfspec + Body(v: [Num, Num, Num]) extends Surfspec fun ambientsurf(ss) = fun lscomp(ls) = if ls is @@ -144,7 +146,7 @@ fun bodysurf(ss) = head(append(lscomp(ss), ([1.0, 1.0, 1.0] :: Nil))) -class Sphere(pos: [Num, Num, Num], radius: Num, surface: List[Surfspec]) +data class Sphere(pos: [Num, Num, Num], radius: Num, surface: List[Surfspec]) fun spheresurf(s) = if s is Sphere(pos, rad, surf) then surf diff --git a/hkmc2/shared/src/test/mlscript/nofib/treejoin.mls b/hkmc2/shared/src/test/mlscript/nofib/treejoin.mls index c886514307..c4cc838e62 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/treejoin.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/treejoin.mls @@ -14,9 +14,10 @@ fun isDigit(c) = abstract class Tree[E]: Node | Leaf | Empty -class - Node[E](k: Int, l: Tree[E], r: Tree[E]) extends Tree[E] - Leaf[E](k: Int, e: E) extends Tree[E] +data + class + Node[E](k: Int, l: Tree[E], r: Tree[E]) extends Tree[E] + Leaf[E](k: Int, e: E) extends Tree[E] object Empty extends Tree @@ -75,7 +76,7 @@ fun testTreejoin_nofib(n) = :re // nodejs stack size 8192 can handle this testTreejoin_nofib(0).toString() -//│ ═══[RUNTIME ERROR] RangeError: Maximum call stack size exceeded +//│ ═══[RUNTIME ERROR] Error: ENOENT: no such file or directory, open 'hkmc2/shared/src/test/mlscript/nofib/input/1500.1' // //│ = 'Node(26790, Node(25449, Node(24977, Node(24359, Node(24314, Leaf(24314, (9658,1890,24314,24314,7755)), Leaf(24359, (17282,5066,24359,24359,134))), Node(24452, Leaf(24452, (13985,4700,24452,24452,8400)), Node(24776, Leaf(24776, (9392,18824,24776,24776,25492)), Leaf(24977, (21044,6260,24977,24977,3296))))), Node(25347, Node(25087, Leaf(25087, (9226,22666,25087,25087,19595)), Leaf(25347, (9331,1734,25347,25347,12071))), Leaf(25449, (24361,14401,25449,25449,5552)))), Node(26770, Node(26207, Node(25780, Node(25457, Leaf(25457, (5457,5273,25457,25457,5149)), Leaf(25780, (21801,92,25780,25780,2781))), Leaf(26207, (22839,18759,26207,26207,20366))), Node(26436, Node(26274, Node(26222, Leaf(26222, (11315,3470,26222,26222,23055)), Leaf(26274, (19231,20706,26274,26274,24107))), Node(26276, Leaf(26276, (3545,169,26276,26276,7584)), Leaf(26436, (22148,24244,26436,26436,2448)))), Node(26473, Leaf(26473, (13180,15097,26473,26473,16469)), Leaf(26770, (23746,15943,26770,26770,1467))))), Leaf(26790, (25643,16230,26790,26790,970)))), Leaf(26932, (24868,11500,26932,26932,3741)))' diff --git a/hkmc2/shared/src/test/mlscript/parser/Extends.mls b/hkmc2/shared/src/test/mlscript/parser/Extends.mls index 81d5df4a9c..6e9bf58f16 100644 --- a/hkmc2/shared/src/test/mlscript/parser/Extends.mls +++ b/hkmc2/shared/src/test/mlscript/parser/Extends.mls @@ -9,8 +9,8 @@ class Derived extends Base // Extension with parameters abstract class Box -class IntBox(val value: Int) extends Box -class StrBox(val value: Str) extends Box +data class IntBox(val value: Int) extends Box +data class StrBox(val value: Str) extends Box //│ Env: //│ Box -> RefElem(member:Box) //│ IntBox -> RefElem(member:IntBox) @@ -19,7 +19,7 @@ class StrBox(val value: Str) extends Box // Extension with symbolic name abstract class Ring module End extends Ring -class (++) Link(left: Ring, right: Ring) extends Ring +data class (++) Link(left: Ring, right: Ring) extends Ring //│ Env: //│ ++ -> RefElem(member:Link) //│ End -> RefElem(member:End) @@ -28,7 +28,7 @@ class (++) Link(left: Ring, right: Ring) extends Ring // Extension with type parameters abstract class Option[T]: (Some[T] | None) -class Some[T](val value: T) extends Option[T] +data class Some[T](val value: T) extends Option[T] module None extends Option[Nothing] //│ Env: //│ None -> RefElem(member:None) @@ -37,7 +37,7 @@ module None extends Option[Nothing] // Extension with type parameters and symbolic name abstract class List[T]: (Cons[T] | Nil) -class (::) Cons[T](val head: T, val tail: List[T]) extends List[T] +data class (::) Cons[T](val head: T, val tail: List[T]) extends List[T] module Nil extends List[Nothing] //│ Env: //│ :: -> RefElem(member:Cons) diff --git a/hkmc2/shared/src/test/mlscript/rp/MatchResult.mls b/hkmc2/shared/src/test/mlscript/rp/MatchResult.mls index 977baf255f..68883f5aa2 100644 --- a/hkmc2/shared/src/test/mlscript/rp/MatchResult.mls +++ b/hkmc2/shared/src/test/mlscript/rp/MatchResult.mls @@ -12,7 +12,7 @@ MatchFailure("oops") if MatchFailure("oops") is MatchFailure(x) then x //│ = "oops" -class MatchResult(x, y, z) +data class MatchResult(x, y, z) MatchResult(0) //│ = MatchResult(0, undefined, undefined) diff --git a/hkmc2/shared/src/test/mlscript/rp/nondeterminism/BitArithmetic.mls b/hkmc2/shared/src/test/mlscript/rp/nondeterminism/BitArithmetic.mls index ca098b6bbc..58920e96d8 100644 --- a/hkmc2/shared/src/test/mlscript/rp/nondeterminism/BitArithmetic.mls +++ b/hkmc2/shared/src/test/mlscript/rp/nondeterminism/BitArithmetic.mls @@ -1,9 +1,10 @@ :js -class - (&&) And(lhs: Bool, rhs: Bool) - (||) Or(lhs: Bool, rhs: Bool) - Not(arg: Bool) +data + class + (&&) And(lhs: Bool, rhs: Bool) + (||) Or(lhs: Bool, rhs: Bool) + Not(arg: Bool) pattern Truthy = true | And(Truthy, Truthy) | Or(Truthy, Truthy) | diff --git a/hkmc2/shared/src/test/mlscript/rp/nondeterminism/EvenOddTree.mls b/hkmc2/shared/src/test/mlscript/rp/nondeterminism/EvenOddTree.mls index 7e84b297da..3503d795f1 100644 --- a/hkmc2/shared/src/test/mlscript/rp/nondeterminism/EvenOddTree.mls +++ b/hkmc2/shared/src/test/mlscript/rp/nondeterminism/EvenOddTree.mls @@ -3,7 +3,7 @@ object A object B -class Node[T](left: Node[T], value: T, right: Node[T]) +data class Node[T](left: Node[T], value: T, right: Node[T]) // The patterns generate trees that have odd or even numbers of node `A`. diff --git a/hkmc2/shared/src/test/mlscript/rp/nondeterminism/LaRbTree.mls b/hkmc2/shared/src/test/mlscript/rp/nondeterminism/LaRbTree.mls index 18c3f1df20..c4e6ea71ef 100644 --- a/hkmc2/shared/src/test/mlscript/rp/nondeterminism/LaRbTree.mls +++ b/hkmc2/shared/src/test/mlscript/rp/nondeterminism/LaRbTree.mls @@ -1,6 +1,6 @@ :js -class Pair[S, T](val first: S, val second: T) +data class Pair[S, T](val first: S, val second: T) object A object B diff --git a/hkmc2/shared/src/test/mlscript/rp/parametric/HigherOrderPattern.mls b/hkmc2/shared/src/test/mlscript/rp/parametric/HigherOrderPattern.mls index 22bbee0c48..5442854c45 100644 --- a/hkmc2/shared/src/test/mlscript/rp/parametric/HigherOrderPattern.mls +++ b/hkmc2/shared/src/test/mlscript/rp/parametric/HigherOrderPattern.mls @@ -35,7 +35,7 @@ A is @compile Nullable(A) 2 is @compile Nullable(1 | 2) //│ = true -class Pair[A, B](val first: A, val second: B) +data class Pair[A, B](val first: A, val second: B) pattern Stack(pattern T) = null | Pair(T, Stack(T)) diff --git a/hkmc2/shared/src/test/mlscript/rp/recursion/BitSeq.mls b/hkmc2/shared/src/test/mlscript/rp/recursion/BitSeq.mls index 05cedfb010..36af6edfd4 100644 --- a/hkmc2/shared/src/test/mlscript/rp/recursion/BitSeq.mls +++ b/hkmc2/shared/src/test/mlscript/rp/recursion/BitSeq.mls @@ -1,6 +1,6 @@ :js -class Pair[A, B](val first: A, val second: B) +data class Pair[A, B](val first: A, val second: B) pattern Bit = 0 | 1 diff --git a/hkmc2/shared/src/test/mlscript/rp/recursion/BitTree.mls b/hkmc2/shared/src/test/mlscript/rp/recursion/BitTree.mls index 3cb1856cf7..b5bdbde8b1 100644 --- a/hkmc2/shared/src/test/mlscript/rp/recursion/BitTree.mls +++ b/hkmc2/shared/src/test/mlscript/rp/recursion/BitTree.mls @@ -1,6 +1,6 @@ :js -class Pair[A, B](val first: A, val second: B) +data class Pair[A, B](val first: A, val second: B) pattern Bit = 0 | 1 diff --git a/hkmc2/shared/src/test/mlscript/rp/recursion/LeafEvenOddTree.mls b/hkmc2/shared/src/test/mlscript/rp/recursion/LeafEvenOddTree.mls index ae259a21f9..90f40f6dd9 100644 --- a/hkmc2/shared/src/test/mlscript/rp/recursion/LeafEvenOddTree.mls +++ b/hkmc2/shared/src/test/mlscript/rp/recursion/LeafEvenOddTree.mls @@ -2,7 +2,7 @@ object A object B -class Pair[A, B](first: A, second: B) +data class Pair[A, B](first: A, second: B) [A, B] //│ = [A, B] diff --git a/hkmc2/shared/src/test/mlscript/rp/recursion/NatBox.mls b/hkmc2/shared/src/test/mlscript/rp/recursion/NatBox.mls index 5a8371b9ba..7618f2299e 100644 --- a/hkmc2/shared/src/test/mlscript/rp/recursion/NatBox.mls +++ b/hkmc2/shared/src/test/mlscript/rp/recursion/NatBox.mls @@ -1,6 +1,6 @@ :js -class Box[A](val value: A) +data class Box[A](val value: A) pattern NatBox = null | Box(NatBox) diff --git a/hkmc2/shared/src/test/mlscript/rp/recursion/NullTree.mls b/hkmc2/shared/src/test/mlscript/rp/recursion/NullTree.mls index beeebaf424..138eb024ab 100644 --- a/hkmc2/shared/src/test/mlscript/rp/recursion/NullTree.mls +++ b/hkmc2/shared/src/test/mlscript/rp/recursion/NullTree.mls @@ -1,6 +1,6 @@ :js -class Pair[A, B](val first: A, val second: B) +data class Pair[A, B](val first: A, val second: B) pattern Null = null diff --git a/hkmc2/shared/src/test/mlscript/rp/recursion/SignBox.mls b/hkmc2/shared/src/test/mlscript/rp/recursion/SignBox.mls index d420070368..fbb27c93c3 100644 --- a/hkmc2/shared/src/test/mlscript/rp/recursion/SignBox.mls +++ b/hkmc2/shared/src/test/mlscript/rp/recursion/SignBox.mls @@ -1,6 +1,6 @@ :js -class Box[A](val value: A) +data class Box[A](val value: A) pattern Sign = -1 | 0 | 1 diff --git a/hkmc2/shared/src/test/mlscript/rp/specialization/SimpleList.mls b/hkmc2/shared/src/test/mlscript/rp/specialization/SimpleList.mls index 32203bea98..88d162f8f3 100644 --- a/hkmc2/shared/src/test/mlscript/rp/specialization/SimpleList.mls +++ b/hkmc2/shared/src/test/mlscript/rp/specialization/SimpleList.mls @@ -1,14 +1,14 @@ :js -class Pair[A, B](a: A, b: B) +data class Pair[A, B](a: A, b: B) -class Box[A](value: A) +data class Box[A](value: A) -class Bowl[A](value: A) +data class Bowl[A](value: A) -class Basket[A](value: A) +data class Basket[A](value: A) -class Triplet[A, B, C](a: A, b: B, c: C) +data class Triplet[A, B, C](a: A, b: B, c: C) pattern Everything = _ diff --git a/hkmc2/shared/src/test/mlscript/rp/syntax/WrongArity.mls b/hkmc2/shared/src/test/mlscript/rp/syntax/WrongArity.mls index 8588fdf64d..4d1e50a7d3 100644 --- a/hkmc2/shared/src/test/mlscript/rp/syntax/WrongArity.mls +++ b/hkmc2/shared/src/test/mlscript/rp/syntax/WrongArity.mls @@ -1,10 +1,10 @@ -class Pair[A, B](val first: A, val second: B) +data class Pair[A, B](val first: A, val second: B) :e pattern LessArity = Pair("meow") //│ ╔══[ERROR] The class `Pair` expected 2 arguments. -//│ ║ l.1: class Pair[A, B](val first: A, val second: B) -//│ ║ ^^^^ +//│ ║ l.1: data class Pair[A, B](val first: A, val second: B) +//│ ║ ^^^^ //│ ╟── But only 1 sub-pattern is given. //│ ║ l.4: pattern LessArity = Pair("meow") //│ ╙── ^^^^^^ @@ -12,8 +12,8 @@ pattern LessArity = Pair("meow") :e pattern GreaterArity = Pair("meow", "woof", "moo") //│ ╔══[ERROR] The class `Pair` expected 2 arguments. -//│ ║ l.1: class Pair[A, B](val first: A, val second: B) -//│ ║ ^^^^ +//│ ║ l.1: data class Pair[A, B](val first: A, val second: B) +//│ ║ ^^^^ //│ ╟── But only 3 sub-patterns are given. //│ ║ l.13: pattern GreaterArity = Pair("meow", "woof", "moo") //│ ╙── ^^^^^^^^^^^^^^^^^^^^^ diff --git a/hkmc2/shared/src/test/mlscript/std/Rendering.mls b/hkmc2/shared/src/test/mlscript/std/Rendering.mls index fbdae341dd..3dea3da28a 100644 --- a/hkmc2/shared/src/test/mlscript/std/Rendering.mls +++ b/hkmc2/shared/src/test/mlscript/std/Rendering.mls @@ -71,7 +71,7 @@ interleave(", ") of 1, 2 //│ = [1, ", ", 2] -class Foo(val xs) +data class Foo(val xs) render(Foo([1, 2, 3])) //│ = "Foo([1, 2, 3])" diff --git a/hkmc2/shared/src/test/mlscript/syntax/annotations/Declarations.mls b/hkmc2/shared/src/test/mlscript/syntax/annotations/Declarations.mls index 9443ae13af..d99b1b7e19 100644 --- a/hkmc2/shared/src/test/mlscript/syntax/annotations/Declarations.mls +++ b/hkmc2/shared/src/test/mlscript/syntax/annotations/Declarations.mls @@ -21,7 +21,7 @@ fun fact(n) = //│ ║ l.17: @tailrec fun go(n, acc) = //│ ╙── ^^^^^^^ -class Freezed(degree: Num) +data class Freezed(degree: Num) :w @Freezed(-273.15) class AbsoluteZero @@ -40,10 +40,10 @@ class Freezed(degree: Num) //│ ╔══[WARNING] This annotation has no effect. //│ ║ l.39: @Freezed(-4) let drink = Beverage("Coke") //│ ╙── ^^^^^^^^^^^ -//│ drink = Beverage("Coke") +//│ drink = Beverage() module Foo with - class Bar(qax: Str) + data class Bar(qax: Str) :w @Foo.Bar("baz") class Qux diff --git a/hkmc2/shared/src/test/mlscript/syntax/annotations/Unsupported.mls b/hkmc2/shared/src/test/mlscript/syntax/annotations/Unsupported.mls index b953c7b0a0..d047803edd 100644 --- a/hkmc2/shared/src/test/mlscript/syntax/annotations/Unsupported.mls +++ b/hkmc2/shared/src/test/mlscript/syntax/annotations/Unsupported.mls @@ -65,7 +65,7 @@ open Str //│ ╙── ^ //│ = 3 -class Log(msg: Str) +data class Log(msg: Str) :w id(@Log 5) diff --git a/hkmc2/shared/src/test/mlscript/ucs/examples/BinarySearchTree.mls b/hkmc2/shared/src/test/mlscript/ucs/examples/BinarySearchTree.mls index 44c4045aa1..cc0bdc4815 100644 --- a/hkmc2/shared/src/test/mlscript/ucs/examples/BinarySearchTree.mls +++ b/hkmc2/shared/src/test/mlscript/ucs/examples/BinarySearchTree.mls @@ -13,7 +13,7 @@ fun abs(x) = if x < 0 then -x else x abstract class Option[T]: (Some[T] | None) -class Some[T](val value: T) extends Option[T] +data class Some[T](val value: T) extends Option[T] object None extends Option[Nothing] fun (??) getOrElse(o, v) = if o is @@ -23,7 +23,7 @@ fun (??) getOrElse(o, v) = if o is let anyToString = toString abstract class List[out T]: (Cons[T] | Nil) -class Cons[out T](val head: T, val tail: List[T]) extends List[T] +data class Cons[out T](val head: T, val tail: List[T]) extends List[T] object Nil extends List[Nothing] fun (::) cons(head, tail) = Cons(head, tail) @@ -31,7 +31,7 @@ fun (::) cons(head, tail) = Cons(head, tail) 1 :: 2 :: 3 :: 4 :: Nil abstract class Tree[out A]: (Empty | Node[A]) -class Node[out A](value: A, left: Tree[A], right: Tree[A]) extends Tree[A] +data class Node[out A](value: A, left: Tree[A], right: Tree[A]) extends Tree[A] object Empty extends Tree fun single(v) = Node(v, Empty, Empty) @@ -174,7 +174,7 @@ remove(example1, 2) |> show remove(example1, 3) |> show remove(example1, 4) |> show -class Pair[A, B](val first: A, val second: B) +data class Pair[A, B](val first: A, val second: B) fun extractMin(t) = if t is diff --git a/hkmc2/shared/src/test/mlscript/ucs/examples/EitherOrBoth.mls b/hkmc2/shared/src/test/mlscript/ucs/examples/EitherOrBoth.mls index ecdc48f382..e124fb4a67 100644 --- a/hkmc2/shared/src/test/mlscript/ucs/examples/EitherOrBoth.mls +++ b/hkmc2/shared/src/test/mlscript/ucs/examples/EitherOrBoth.mls @@ -5,9 +5,9 @@ open Option open Str abstract class EitherOrBoth[out A, out B]: (Left[A, B] | Right[A, B] | Both[A, B]) -class Left[out A, out B](value: A) extends EitherOrBoth[A, B] -class Right[out A, out B](value: B) extends EitherOrBoth[A, B] -class Both[out A, out B](left: A, right: B) extends EitherOrBoth[A, B] +data class Left[out A, out B](value: A) extends EitherOrBoth[A, B] +data class Right[out A, out B](value: B) extends EitherOrBoth[A, B] +data class Both[out A, out B](left: A, right: B) extends EitherOrBoth[A, B] type Either[A, B] = Left[A, B] | Right[A, B] diff --git a/hkmc2/shared/src/test/mlscript/ucs/examples/LeftistTree.mls b/hkmc2/shared/src/test/mlscript/ucs/examples/LeftistTree.mls index d7ff7fc87b..ea0d97df82 100644 --- a/hkmc2/shared/src/test/mlscript/ucs/examples/LeftistTree.mls +++ b/hkmc2/shared/src/test/mlscript/ucs/examples/LeftistTree.mls @@ -11,7 +11,7 @@ fun abs(x) = if x < 0 then -x else x abstract class Option[out T]: (Some[T] | None) -class Some[out T](val value: T) extends Option[T] +data class Some[out T](val value: T) extends Option[T] object None extends Option[Nothing] fun (??) getOrElse(o, v) = if o is @@ -19,13 +19,13 @@ fun (??) getOrElse(o, v) = if o is None then v abstract class List[out T]: (Cons[T] | Nil) -class Cons[out T](val head: T, val tail: List[T]) extends List[T] +data class Cons[out T](val head: T, val tail: List[T]) extends List[T] object Nil extends List[Nothing] fun (::) cons(head, tail) = Cons(head, tail) abstract class Tree[out A]: (Empty | Node[A]) -class Node[out A](value: A, left: Tree[A], right: Tree[A], rank: Int) extends Tree[A] +data class Node[out A](value: A, left: Tree[A], right: Tree[A], rank: Int) extends Tree[A] object Empty extends Tree[Nothing] fun show(t: Tree[Any]): Str = if t is diff --git a/hkmc2/shared/src/test/mlscript/ucs/examples/SimpleTree.mls b/hkmc2/shared/src/test/mlscript/ucs/examples/SimpleTree.mls index 28a589e6b7..dc120f4b91 100644 --- a/hkmc2/shared/src/test/mlscript/ucs/examples/SimpleTree.mls +++ b/hkmc2/shared/src/test/mlscript/ucs/examples/SimpleTree.mls @@ -1,12 +1,12 @@ type Option[out A] = Some[A] | None -class Some[out A](value: A) +data class Some[out A](value: A) object None type Tree[out A] = Node[A] | Empty object Empty -class Node[out A](value: A, left: Tree[A], right: Tree[A]) +data class Node[out A](value: A, left: Tree[A], right: Tree[A]) fun find(t, v) = if t is Node(v', l, r) and diff --git a/hkmc2/shared/src/test/mlscript/ucs/future/Or.mls b/hkmc2/shared/src/test/mlscript/ucs/future/Or.mls index 64fba9ef4b..06a77fef3e 100644 --- a/hkmc2/shared/src/test/mlscript/ucs/future/Or.mls +++ b/hkmc2/shared/src/test/mlscript/ucs/future/Or.mls @@ -1,6 +1,6 @@ -class Some[T](value: T) +data class Some[T](value: T) :fixme diff --git a/hkmc2/shared/src/test/mlscript/ucs/future/SymbolicClass.mls b/hkmc2/shared/src/test/mlscript/ucs/future/SymbolicClass.mls index 6581f59b6c..832fbf383a 100644 --- a/hkmc2/shared/src/test/mlscript/ucs/future/SymbolicClass.mls +++ b/hkmc2/shared/src/test/mlscript/ucs/future/SymbolicClass.mls @@ -6,7 +6,7 @@ :ctx type List = Nil | Cons module Nil -class (::) Cons(head: Int, tail: List) +data class (::) Cons(head: Int, tail: List) //│ Env: //│ :: -> RefElem(member:Cons) //│ Cons -> RefElem(member:Cons) diff --git a/hkmc2/shared/src/test/mlscript/ucs/general/CardSuits.mls b/hkmc2/shared/src/test/mlscript/ucs/general/CardSuits.mls index fb09fe6f9b..c772771406 100644 --- a/hkmc2/shared/src/test/mlscript/ucs/general/CardSuits.mls +++ b/hkmc2/shared/src/test/mlscript/ucs/general/CardSuits.mls @@ -1,6 +1,6 @@ -class Card[T](color: T) +data class Card[T](color: T) class Suit module Heart extends Suit diff --git a/hkmc2/shared/src/test/mlscript/ucs/general/DualOptions.mls b/hkmc2/shared/src/test/mlscript/ucs/general/DualOptions.mls index 04d1dafc30..919d82adce 100644 --- a/hkmc2/shared/src/test/mlscript/ucs/general/DualOptions.mls +++ b/hkmc2/shared/src/test/mlscript/ucs/general/DualOptions.mls @@ -6,9 +6,9 @@ abstract class Option[T] -class Some[T](value: T) extends Option[T] +data class Some[T](value: T) extends Option[T] object None extends Option[Nothing] -class Pair[A, B](x: A, y: B) +data class Pair[A, B](x: A, y: B) // All `add_n` functions should be inferred to have the same type. diff --git a/hkmc2/shared/src/test/mlscript/ucs/general/InterleavedLet.mls b/hkmc2/shared/src/test/mlscript/ucs/general/InterleavedLet.mls index ea6895f42e..76f587d4dc 100644 --- a/hkmc2/shared/src/test/mlscript/ucs/general/InterleavedLet.mls +++ b/hkmc2/shared/src/test/mlscript/ucs/general/InterleavedLet.mls @@ -1,7 +1,7 @@ abstract class List[out T] -class Cons[out T](head: T, tail: List[T]) extends List[T] +data class Cons[out T](head: T, tail: List[T]) extends List[T] module Nil extends List[Nothing] @@ -15,7 +15,7 @@ module Bot abstract class Option[T] -class Some[T](value: T) extends Option[T] +data class Some[T](value: T) extends Option[T] module None extends Option[Nothing] diff --git a/hkmc2/shared/src/test/mlscript/ucs/general/List.mls b/hkmc2/shared/src/test/mlscript/ucs/general/List.mls index 649d392647..3f483b78e5 100644 --- a/hkmc2/shared/src/test/mlscript/ucs/general/List.mls +++ b/hkmc2/shared/src/test/mlscript/ucs/general/List.mls @@ -1,11 +1,11 @@ abstract class List[out T] -class Cons[out T](head: T, tail: List[T]) extends List[T] +data class Cons[out T](head: T, tail: List[T]) extends List[T] module Nil extends List[Nothing] abstract class Option[out T] -class Some[out T](value: T) extends Option[T] +data class Some[out T](value: T) extends Option[T] module None extends Option[Nothing] diff --git a/hkmc2/shared/src/test/mlscript/ucs/general/Simple.mls b/hkmc2/shared/src/test/mlscript/ucs/general/Simple.mls index 3558df7b72..fa97b833da 100644 --- a/hkmc2/shared/src/test/mlscript/ucs/general/Simple.mls +++ b/hkmc2/shared/src/test/mlscript/ucs/general/Simple.mls @@ -3,8 +3,8 @@ // Simple and single-line UCS expressions. -class Box[T](value: T) -class Bottle[T](value: T) +data class Box[T](value: T) +data class Bottle[T](value: T) fun foo(x) = if x is Box(y) then y diff --git a/hkmc2/shared/src/test/mlscript/ucs/hygiene/CrossBranchCapture.mls b/hkmc2/shared/src/test/mlscript/ucs/hygiene/CrossBranchCapture.mls index a172dd1b21..18f9844443 100644 --- a/hkmc2/shared/src/test/mlscript/ucs/hygiene/CrossBranchCapture.mls +++ b/hkmc2/shared/src/test/mlscript/ucs/hygiene/CrossBranchCapture.mls @@ -1,6 +1,6 @@ -class Numb(n: Int) +data class Numb(n: Int) :e fun process(e) = @@ -26,10 +26,10 @@ process(Numb(1), 10) // class Vec(xs: Array[Numb | Vec]) // Array is not available abstract class Vec[out T](n: Int) -class Cons[out T](head: T, tail: Vec[T]) extends Vec[T] +data class Cons[out T](head: T, tail: Vec[T]) extends Vec[T] module Nil extends Vec[Nothing] -class Pair[A, B](a: A, b: B) +data class Pair[A, B](a: A, b: B) :e fun process(e) = diff --git a/hkmc2/shared/src/test/mlscript/ucs/hygiene/Hygiene.mls b/hkmc2/shared/src/test/mlscript/ucs/hygiene/Hygiene.mls index dc98485360..dac0a3af52 100644 --- a/hkmc2/shared/src/test/mlscript/ucs/hygiene/Hygiene.mls +++ b/hkmc2/shared/src/test/mlscript/ucs/hygiene/Hygiene.mls @@ -1,8 +1,8 @@ -class Some[out T](value: T) -class Left[out T](value: T) -class Right[out T](value: T) +data class Some[out T](value: T) +data class Left[out T](value: T) +data class Right[out T](value: T) fun foo(x) = if x is diff --git a/hkmc2/shared/src/test/mlscript/ucs/hygiene/HygienicBindings.mls b/hkmc2/shared/src/test/mlscript/ucs/hygiene/HygienicBindings.mls index 00cbab3d0f..d4c675510d 100644 --- a/hkmc2/shared/src/test/mlscript/ucs/hygiene/HygienicBindings.mls +++ b/hkmc2/shared/src/test/mlscript/ucs/hygiene/HygienicBindings.mls @@ -6,15 +6,15 @@ fun (~~>) expect(a, b) = if a == b then () else error type Option[out T] = None | Some[T] object None -class Some[out T](val value: T) +data class Some[out T](val value: T) type Either[A, B] = Left[A] | Right[B] -class Left[A](val leftValue: A) -class Right[B](val rightValue: B) +data class Left[A](val leftValue: A) +data class Right[B](val rightValue: B) type List[out A] = Nil | Cons[A] object Nil -class Cons[out A](head: A, tail: List[A]) +data class Cons[out A](head: A, tail: List[A]) fun justTrue(_) = true fun justFalse(_) = false diff --git a/hkmc2/shared/src/test/mlscript/ucs/normalization/SimplePairMatches.mls b/hkmc2/shared/src/test/mlscript/ucs/normalization/SimplePairMatches.mls index e4c5e34145..dbf3fd043d 100644 --- a/hkmc2/shared/src/test/mlscript/ucs/normalization/SimplePairMatches.mls +++ b/hkmc2/shared/src/test/mlscript/ucs/normalization/SimplePairMatches.mls @@ -1,7 +1,7 @@ :js -class Pair(a, b) +data class Pair(a, b) class A class B diff --git a/hkmc2/shared/src/test/mlscript/ucs/normalization/UnifySubScrutinees.mls b/hkmc2/shared/src/test/mlscript/ucs/normalization/UnifySubScrutinees.mls index 8c80c4fb4b..0496865da3 100644 --- a/hkmc2/shared/src/test/mlscript/ucs/normalization/UnifySubScrutinees.mls +++ b/hkmc2/shared/src/test/mlscript/ucs/normalization/UnifySubScrutinees.mls @@ -4,7 +4,7 @@ import "../../../mlscript-compile/Option.mls" open Stack open Option -class Pair[A, B](x: A, y: B) +data class Pair[A, B](x: A, y: B) fun foo(xs) = if xs is diff --git a/hkmc2/shared/src/test/mlscript/ucs/patterns/Literals.mls b/hkmc2/shared/src/test/mlscript/ucs/patterns/Literals.mls index a2ff541dd6..e0befc4f2f 100644 --- a/hkmc2/shared/src/test/mlscript/ucs/patterns/Literals.mls +++ b/hkmc2/shared/src/test/mlscript/ucs/patterns/Literals.mls @@ -2,7 +2,7 @@ import "../../../mlscript-compile/Option.mls" open Option -class Pair[A, B](x: A, y: B) +data class Pair[A, B](x: A, y: B) fun f(x) = if x is Some(1) then true else false diff --git a/hkmc2/shared/src/test/mlscript/ucs/patterns/SimpleTuple.mls b/hkmc2/shared/src/test/mlscript/ucs/patterns/SimpleTuple.mls index c04d9e4bd3..16fbfaf067 100644 --- a/hkmc2/shared/src/test/mlscript/ucs/patterns/SimpleTuple.mls +++ b/hkmc2/shared/src/test/mlscript/ucs/patterns/SimpleTuple.mls @@ -28,7 +28,7 @@ test("") test(12) //│ ═══[RUNTIME ERROR] Error: match error -class Point(x: Int, y: Int) +data class Point(x: Int, y: Int) fun with_other_constructors(thing) = if thing is diff --git a/hkmc2/shared/src/test/mlscript/ucs/syntax/PlainConditionals.mls b/hkmc2/shared/src/test/mlscript/ucs/syntax/PlainConditionals.mls index ddc172333f..2a1e26d6ec 100644 --- a/hkmc2/shared/src/test/mlscript/ucs/syntax/PlainConditionals.mls +++ b/hkmc2/shared/src/test/mlscript/ucs/syntax/PlainConditionals.mls @@ -4,7 +4,7 @@ fun f: Any -> Bool fun g: Any -> Bool fun h: Any -> Bool -class Pair[A, B](fst: A, snd: B) +data class Pair[A, B](fst: A, snd: B) Pair(0, 1) is Pair @@ -70,7 +70,7 @@ fun foo(x) = x is (Pair(a, b) and a > b) | Int -class A[T](arg: T) +data class A[T](arg: T) x => (x is A(_)) diff --git a/hkmc2/shared/src/test/mlscript/ucs/syntax/SimpleUCS.mls b/hkmc2/shared/src/test/mlscript/ucs/syntax/SimpleUCS.mls index fa6c6c6159..e26da47804 100644 --- a/hkmc2/shared/src/test/mlscript/ucs/syntax/SimpleUCS.mls +++ b/hkmc2/shared/src/test/mlscript/ucs/syntax/SimpleUCS.mls @@ -1,12 +1,12 @@ abstract class Option[A]: Some[A] | None -class Some[A](value: A) extends Option[A] +data class Some[A](value: A) extends Option[A] object None extends Option abstract class Either[out A, out B]: Left[A] | Right[B] -class Left[A](leftValue: A) extends Either[A, Nothing] -class Right[B](rightValue: B) extends Either[Nothing, B] +data class Left[A](leftValue: A) extends Either[A, Nothing] +data class Right[B](rightValue: B) extends Either[Nothing, B] fun f(x, y) = if x is @@ -39,8 +39,8 @@ fun f(x, y) = Some(x) and y is Some(y) then 0 -class A[T](value: T) -class B[T](value: T) +data class A[T](value: T) +data class B[T](value: T) fun f(x, y, u, v) = if x is @@ -188,11 +188,11 @@ g(5, Some(7)) g(0 - 5, None) g(0 - 5, Some(9)) -class Var(name: Str) +data class Var(name: Str) abstract class ValBase: (IntVal | BoolVal) -class IntVal(value: Int) extends ValBase -class BoolVal(value: Bool) extends ValBase -class Lit(value: ValBase) +data class IntVal(value: Int) extends ValBase +data class BoolVal(value: Bool) extends ValBase +data class Lit(value: ValBase) fun p(e, context) = if e is @@ -202,7 +202,7 @@ fun p(e, context) = Lit(IntVal(v)) then Left(v) Lit(BoolVal(v)) then Right(v) -class Nil() +data class Nil() // Support operator constructor like :: :todo From 87c81a3cbdb6c342de16825afa25a8d1408f269e Mon Sep 17 00:00:00 2001 From: Flandia Yingman Date: Fri, 7 Mar 2025 20:09:40 +0800 Subject: [PATCH 06/14] Update hkmc2/shared/src/main/scala/hkmc2/semantics/Symbol.scala Co-authored-by: Lionel Parreaux --- hkmc2/shared/src/main/scala/hkmc2/semantics/Symbol.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hkmc2/shared/src/main/scala/hkmc2/semantics/Symbol.scala b/hkmc2/shared/src/main/scala/hkmc2/semantics/Symbol.scala index d646ada4f0..fcfb2f0eda 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/semantics/Symbol.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/semantics/Symbol.scala @@ -117,7 +117,7 @@ class InstSymbol(val origin: Symbol)(using State) extends LocalSymbol: class VarSymbol(val id: Ident)(using State) extends BlockLocalSymbol(id.name) with NamedSymbol with LocalSymbol: val name: Str = id.name - override def toLoc: Option[Loc] = id.toLoc + override def toLoc: Opt[Loc] = id.toLoc // override def toString: Str = s"$name@$uid" override def subst(using s: SymbolSubst): VarSymbol = s.mapVarSym(this) From 6f4459f8f88b2890226447807609173894c8230e Mon Sep 17 00:00:00 2001 From: Flandia Yingman Date: Fri, 7 Mar 2025 21:35:16 +0800 Subject: [PATCH 07/14] Fix tests --- .../mlscript/handlers/ManualStackSafety.mls | 1 + .../shared/src/test/mlscript/nofib/boyer2.mls | 50 ++----------------- hkmc2/shared/src/test/mlscript/nofib/mate.mls | 32 +++++++----- .../src/test/mlscript/nofib/sorting.mls | 14 +----- .../src/test/mlscript/nofib/treejoin.mls | 2 +- 5 files changed, 25 insertions(+), 74 deletions(-) diff --git a/hkmc2/shared/src/test/mlscript/handlers/ManualStackSafety.mls b/hkmc2/shared/src/test/mlscript/handlers/ManualStackSafety.mls index f2b01e8562..fa19da5680 100644 --- a/hkmc2/shared/src/test/mlscript/handlers/ManualStackSafety.mls +++ b/hkmc2/shared/src/test/mlscript/handlers/ManualStackSafety.mls @@ -117,3 +117,4 @@ test(10, 5) //│ > finished at offset: 5 //│ > finished at offset: 0 //│ = 3628800 + diff --git a/hkmc2/shared/src/test/mlscript/nofib/boyer2.mls b/hkmc2/shared/src/test/mlscript/nofib/boyer2.mls index e61c7b9fcb..4c7d88b06b 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/boyer2.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/boyer2.mls @@ -322,41 +322,12 @@ let rules = nofibStringToList("(equal (flatten (cdr (gopher x) ) )(if (listp x)(cdr (flatten x) )(Conss (zero)(Nill) ) ) )") :: nofibStringToList("(equal (quotient (times y x)y)(if (zerop y)(zero)(fix x) ) )") :: nofibStringToList("(equal (get j (set i val mem) )(if (eqp j i)val(get j mem) ) )") :: Nil -//│ FAILURE: Unexpected exception -//│ /!!!\ Uncaught error: java.lang.StackOverflowError +//│ rules = [["(","e","q","u","a","l"," ","(","c","o","m","p","i","l","e"," ","f","o","r","m",")","(","r","e","v","e","r","s","e"," ","(","c","o","d","e","g","e","n"," ","(","o","p","t","i","m","i","z","e"," ","f","o","r","m",")"," ","(","N","i","l","l",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","p"," ","x"," ","y",")","(","e","q","u","a","l"," ","(","f","i","x"," ","x",")","(","f","i","x"," ","y",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","g","r","e","a","t","e","r","p"," ","x"," ","y",")","(","l","e","s","s","p"," ","y"," ","x",")"," ",")"],["(","e","q","u","a","l"," ","(","l","e","s","s","e","q","p"," ","x"," ","y",")","(","n","o","t"," ","(","l","e","s","s","p"," ","y"," ","x",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","g","r","e","a","t","e","r","e","q","p"," ","x"," ","y",")","(","n","o","t"," ","(","l","e","s","s","p"," ","y"," ","x",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","b","o","o","l","e","a","n"," ","x",")","(","o","r"," ","(","e","q","u","a","l"," ","x"," ","(","t",")"," ",")","(","e","q","u","a","l"," ","x"," ","(","f",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","i","f","f"," ","x"," ","y",")","(","a","n","d"," ","(","i","m","p","l","i","e","s"," ","x"," ","y",")","(","i","m","p","l","i","e","s"," ","y"," ","x",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","v","e","n","1"," ","x",")","(","i","f"," ","(","z","e","r","o","p"," ","x",")","(","t",")","(","o","d","d"," ","(","1","-"," ","x",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","c","o","u","n","t","p","s","-"," ","l"," ","p","r","e","d",")","(","c","o","u","n","t","p","s","-","l","o","o","p"," ","l"," ","p","r","e","d"," ","(","z","e","r","o",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","f","a","c","t","-"," ","i",")","(","f","a","c","t","-","l","o","o","p"," ","i"," ","1",")"," ",")"],["(","e","q","u","a","l"," ","(","r","e","v","e","r","s","e","-"," ","x",")","(","r","e","v","e","r","s","e","-","l","o","o","p"," ","x"," ","(","N","i","l","l",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","d","i","v","i","d","e","s"," ","x"," ","y",")","(","z","e","r","o","p"," ","(","r","e","m","a","i","n","d","e","r"," ","y"," ","x",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","a","s","s","u","m","e","-","t","r","u","e"," ","v","a","r"," ","a","l","i","s","t",")","(","C","o","n","s","s"," ","(","C","o","n","s","s"," ","v","a","r"," ","(","t",")"," ",")","a","l","i","s","t",")"," ",")"],["(","e","q","u","a","l"," ","(","a","s","s","u","m","e","-","f","a","l","s","e"," ","v","a","r"," ","a","l","i","s","t",")","(","C","o","n","s","s"," ","(","C","o","n","s","s"," ","v","a","r"," ","(","f",")"," ",")","a","l","i","s","t",")"," ",")"],["(","e","q","u","a","l"," ","(","t","a","u","t","o","l","o","g","y","-","c","h","e","c","k","e","r"," ","x",")","(","t","a","u","t","o","l","o","g","y","p"," ","(","n","o","r","m","a","l","i","z","e"," ","x",")","(","N","i","l","l",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","f","a","l","s","i","f","y"," ","x",")","(","f","a","l","s","i","f","y","1"," ","(","n","o","r","m","a","l","i","z","e"," ","x",")","(","N","i","l","l",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","p","r","i","m","e"," ","x",")","(","a","n","d"," ","(","n","o","t"," ","(","z","e","r","o","p"," ","x",")",")","(","n","o","t"," ","(","e","q","u","a","l"," ","x"," ","(","a","d","d","1"," ","(","z","e","r","o",")"," ",")"," ",")"," ",")","(","p","r","i","m","e","1"," ","x"," ","(","1","-"," ","x",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","a","n","d"," ","p"," ","q",")","(","i","f"," ","p"," ","(","i","f"," ","q"," ","(","t",")"," ","(","f",")"," ",")"," ","(","f",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","o","r"," ","p"," ","q",")","(","i","f"," ","p"," ","(","t",")"," ","(","i","f"," ","q"," ","(","t",")"," ","(","f",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","n","o","t"," ","p",")","(","i","f"," ","p"," ","(","f",")"," ","(","t",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","i","m","p","l","i","e","s"," ","p"," ","q",")","(","i","f"," ","p"," ","(","i","f"," ","q"," ","(","t",")"," ","(","f",")"," ",")"," ","(","t",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","f","i","x"," ","x",")","(","i","f"," ","(","n","u","m","b","e","r","p"," ","x",")"," ","x"," ","(","z","e","r","o",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","i","f"," ","(","i","f"," ","a"," ","b"," ","c",")"," ","d"," ","e",")","(","i","f"," ","a"," ","(","i","f"," ","b"," ","d"," ","e",")"," ","(","i","f"," ","c"," ","d"," ","e",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","z","e","r","o","p"," ","x",")","(","o","r"," ","(","e","q","u","a","l"," ","x"," ","(","z","e","r","o",")"," ",")","(","n","o","t"," ","(","n","u","m","b","e","r","p"," ","x",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","p","l","u","s"," ","(","p","l","u","s"," ","x"," ","y",")"," ","z"," ",")","(","p","l","u","s"," ","x"," ","(","p","l","u","s"," ","y"," ","z",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","(","p","l","u","s"," ","a"," ","b",")"," ","(","z","e","r","o"," ",")"," ",")","(","a","n","d"," ","(","z","e","r","o","p"," ","a",")"," ","(","z","e","r","o","p"," ","b",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","d","i","f","f","e","r","e","n","c","e"," ","x"," ","x",")","(","z","e","r","o",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","(","p","l","u","s"," ","a"," ","b",")"," ","(","p","l","u","s"," ","a"," ","c",")"," ",")","(","e","q","u","a","l"," ","(","f","i","x"," ","b",")"," ","(","f","i","x"," ","c",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","(","z","e","r","o",")"," ","(","d","i","f","f","e","r","e","n","c","e"," ","x"," ","y",")"," ",")","(","n","o","t"," ","(","l","e","s","s","p"," ","y"," ","x",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","x"," ","(","d","i","f","f","e","r","e","n","c","e"," ","x"," ","y",")"," ",")","(","a","n","d"," ","(","n","u","m","b","e","r","p"," ","x",")","(","o","r"," ","(","e","q","u","a","l"," ","x"," ","(","z","e","r","o",")"," ",")","(","z","e","r","o","p"," ","y",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","m","e","a","n","i","n","g"," ","(","p","l","u","s","-","t","r","e","e"," ","(","a","p","p","e","n","d"," ","x"," ","y",")"," ",")"," ","a",")","(","p","l","u","s"," ","(","m","e","a","n","i","n","g"," ","(","p","l","u","s","-","t","r","e","e"," ","x",")"," ","a",")","(","m","e","a","n","i","n","g"," ","(","p","l","u","s","-","t","r","e","e"," ","y",")"," ","a",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","m","e","a","n","i","n","g"," ","(","p","l","u","s","-","t","r","e","e"," ","(","p","l","u","s","-","f","r","i","n","g","e"," ","x",")"," ",")"," ","a",")","(","f","i","x"," ","(","m","e","a","n","i","n","g"," ","x"," ","a",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","a","p","p","e","n","d"," ","(","a","p","p","e","n","d"," ","x"," ","y",")"," ","z",")","(","a","p","p","e","n","d"," ","x"," ","(","a","p","p","e","n","d"," ","y"," ","z",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","r","e","v","e","r","s","e"," ","(","a","p","p","e","n","d"," ","a"," ","b",")"," ",")","(","a","p","p","e","n","d"," ","(","r","e","v","e","r","s","e"," ","b",")"," ","(","r","e","v","e","r","s","e"," ","a",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","t","i","m","e","s"," ","x"," ","(","p","l","u","s"," ","y"," ","z",")"," ",")","(","p","l","u","s"," ","(","t","i","m","e","s"," ","x"," ","y",")","(","t","i","m","e","s"," ","x"," ","z",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","t","i","m","e","s"," ","(","t","i","m","e","s"," ","x"," ","y",")"," ","z",")","(","t","i","m","e","s"," ","x"," ","(","t","i","m","e","s"," ","y"," ","z",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","(","t","i","m","e","s"," ","x"," ","y",")"," ","(","z","e","r","o",")"," ",")","(","o","r"," ","(","z","e","r","o","p"," ","x",")","(","z","e","r","o","p"," ","y",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","x","e","c"," ","(","a","p","p","e","n","d"," ","x"," ","y",")","p","d","s"," ","e","n","v","r","n",")","(","e","x","e","c"," ","y"," ","(","e","x","e","c"," ","x"," ","p","d","s"," ","e","n","v","r","n",")","e","n","v","r","n",")"," ",")"],["(","e","q","u","a","l"," ","(","m","c","-","f","l","a","t","t","e","n"," ","x"," ","y",")","(","a","p","p","e","n","d"," ","(","f","l","a","t","t","e","n"," ","x",")","y",")"," ",")"],["(","e","q","u","a","l"," ","(","m","e","m","b","e","r"," ","x"," ","(","a","p","p","e","n","d"," ","a"," ","b",")"," ",")","(","o","r"," ","(","m","e","m","b","e","r"," ","x"," ","a",")","(","m","e","m","b","e","r"," ","x"," ","b",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","m","e","m","b","e","r"," ","x"," ","(","r","e","v","e","r","s","e"," ","y",")"," ",")","(","m","e","m","b","e","r"," ","x"," ","y",")"," ",")"],["(","e","q","u","a","l"," ","(","l","e","n","g","t","h"," ","(","r","e","v","e","r","s","e"," ","x",")"," ",")","(","l","e","n","g","t","h"," ","x",")"," ",")"],["(","e","q","u","a","l"," ","(","m","e","m","b","e","r"," ","a"," ","(","i","n","t","e","r","s","e","c","t"," ","b"," ","c",")"," ",")","(","a","n","d"," ","(","m","e","m","b","e","r"," ","a"," ","b",")","(","m","e","m","b","e","r"," ","a"," ","c",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","n","t","h"," ","(","z","e","r","o",")","i",")","(","z","e","r","o",")"," ",")"],["(","e","q","u","a","l"," ","(","e","x","p"," ","i"," ","(","p","l","u","s"," ","j"," ","k",")"," ",")","(","t","i","m","e","s"," ","(","e","x","p"," ","i"," ","j",")","(","e","x","p"," ","i"," ","k",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","x","p"," ","i"," ","(","t","i","m","e","s"," ","j"," ","k",")"," ",")","(","e","x","p"," ","(","e","x","p"," ","i"," ","j",")","k",")"," ",")"],["(","e","q","u","a","l"," ","(","r","e","v","e","r","s","e","-","l","o","o","p"," ","x"," ","y",")","(","a","p","p","e","n","d"," ","(","r","e","v","e","r","s","e"," ","x",")","y",")"," ",")"],["(","e","q","u","a","l"," ","(","r","e","v","e","r","s","e","-","l","o","o","p"," ","x"," ","(","N","i","l","l",")"," ",")","(","r","e","v","e","r","s","e"," ","x",")"," ",")"],["(","e","q","u","a","l"," ","(","c","o","u","n","t","-","l","i","s","t"," ","z"," ","(","s","o","r","t","-","l","p"," ","x"," ","y",")"," ",")","(","p","l","u","s"," ","(","c","o","u","n","t","-","l","i","s","t"," ","z"," ","x",")","(","c","o","u","n","t","-","l","i","s","t"," ","z"," ","y",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","(","a","p","p","e","n","d"," ","a"," ","b",")","(","a","p","p","e","n","d"," ","a"," ","c",")"," ",")","(","e","q","u","a","l"," ","b"," ","c",")"," ",")"],["(","e","q","u","a","l"," ","(","p","l","u","s"," ","(","r","e","m","a","i","n","d","e","r"," ","x"," ","y",")","(","t","i","m","e","s"," ","y"," ","(","q","u","o","t","i","e","n","t"," ","x"," ","y",")"," ",")"," ",")","(","f","i","x"," ","x",")"," ",")"],["(","e","q","u","a","l"," ","(","p","o","w","e","r","-","e","v","a","l"," ","(","b","i","g","-","p","l","u","s","1"," ","l"," ","i"," ","b","a","s","e",")","b","a","s","e",")","(","p","l","u","s"," ","(","p","o","w","e","r","-","e","v","a","l"," ","l"," ","b","a","s","e",")","i",")"," ",")"],["(","e","q","u","a","l"," ","(","p","o","w","e","r","-","e","v","a","l"," ","(","b","i","g","-","p","l","u","s"," ","x"," ","y"," ","i"," ","b","a","s","e",")","b","a","s","e",")","(","p","l","u","s"," ","i"," ","(","p","l","u","s"," ","(","p","o","w","e","r","-","e","v","a","l"," ","x"," ","b","a","s","e",")","(","p","o","w","e","r","-","e","v","a","l"," ","y"," ","b","a","s","e",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","r","e","m","a","i","n","d","e","r"," ","y"," ","1",")","(","z","e","r","o",")"," ",")"],["(","e","q","u","a","l"," ","(","l","e","s","s","p"," ","(","r","e","m","a","i","n","d","e","r"," ","x"," ","y",")","y",")","(","n","o","t"," ","(","z","e","r","o","p"," ","y",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","r","e","m","a","i","n","d","e","r"," ","x"," ","x",")","(","z","e","r","o",")"," ",")"],["(","e","q","u","a","l"," ","(","l","e","s","s","p"," ","(","q","u","o","t","i","e","n","t"," ","i"," ","j",")","i",")","(","a","n","d"," ","(","n","o","t"," ","(","z","e","r","o","p"," ","i",")"," ",")","(","o","r"," ","(","z","e","r","o","p"," ","j",")","(","n","o","t"," ","(","e","q","u","a","l"," ","j"," ","1",")"," ",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","l","e","s","s","p"," ","(","r","e","m","a","i","n","d","e","r"," ","x"," ","y",")","x",")","(","a","n","d"," ","(","n","o","t"," ","(","z","e","r","o","p"," ","y",")"," ",")","(","n","o","t"," ","(","z","e","r","o","p"," ","x",")"," ",")","(","n","o","t"," ","(","l","e","s","s","p"," ","x"," ","y",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","p","o","w","e","r","-","e","v","a","l"," ","(","p","o","w","e","r","-","r","e","p"," ","i"," ","b","a","s","e",")","b","a","s","e",")","(","f","i","x"," ","i",")"," ",")"],["(","e","q","u","a","l"," ","(","p","o","w","e","r","-","e","v","a","l"," ","(","b","i","g","-","p","l","u","s"," ","(","p","o","w","e","r","-","r","e","p"," ","i"," ","b","a","s","e",")","(","p","o","w","e","r","-","r","e","p"," ","j"," ","b","a","s","e",")","(","z","e","r","o",")","b","a","s","e",")","b","a","s","e",")","(","p","l","u","s"," ","i"," ","j",")"," ",")"],["(","e","q","u","a","l"," ","(","g","c","d"," ","x"," ","y",")","(","g","c","d"," ","y"," ","x",")"," ",")"],["(","e","q","u","a","l"," ","(","n","t","h"," ","(","a","p","p","e","n","d"," ","a"," ","b",")","i",")","(","a","p","p","e","n","d"," ","(","n","t","h"," ","a"," ","i",")","(","n","t","h"," ","b"," ","(","d","i","f","f","e","r","e","n","c","e"," ","i"," ","(","l","e","n","g","t","h"," ","a",")"," ",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","d","i","f","f","e","r","e","n","c","e"," ","(","p","l","u","s"," ","x"," ","y",")","x",")","(","f","i","x"," ","y",")"," ",")"],["(","e","q","u","a","l"," ","(","d","i","f","f","e","r","e","n","c","e"," ","(","p","l","u","s"," ","y"," ","x",")","x",")","(","f","i","x"," ","y",")"," ",")"],["(","e","q","u","a","l"," ","(","d","i","f","f","e","r","e","n","c","e"," ","(","p","l","u","s"," ","x"," ","y",")","(","p","l","u","s"," ","x"," ","z",")"," ",")","(","d","i","f","f","e","r","e","n","c","e"," ","y"," ","z",")"," ",")"],["(","e","q","u","a","l"," ","(","t","i","m","e","s"," ","x"," ","(","d","i","f","f","e","r","e","n","c","e"," ","c"," ","w",")"," ",")","(","d","i","f","f","e","r","e","n","c","e"," ","(","t","i","m","e","s"," ","c"," ","x",")","(","t","i","m","e","s"," ","w"," ","x",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","r","e","m","a","i","n","d","e","r"," ","(","t","i","m","e","s"," ","x"," ","z",")","z",")","(","z","e","r","o",")"," ",")"],["(","e","q","u","a","l"," ","(","d","i","f","f","e","r","e","n","c","e"," ","(","p","l","u","s"," ","b"," ","(","p","l","u","s"," ","a"," ","c",")"," ",")","a",")","(","p","l","u","s"," ","b"," ","c",")"," ",")"],["(","e","q","u","a","l"," ","(","d","i","f","f","e","r","e","n","c","e"," ","(","a","d","d","1"," ","(","p","l","u","s"," ","y"," ","z",")","z",")","(","a","d","d","1"," ","y",")"," ",")"],["(","e","q","u","a","l"," ","(","l","e","s","s","p"," ","(","p","l","u","s"," ","x"," ","y",")","(","p","l","u","s"," ","x"," ","z"," ",")"," ",")","(","l","e","s","s","p"," ","y"," ","z",")"," ",")"],["(","e","q","u","a","l"," ","(","l","e","s","s","p"," ","(","t","i","m","e","s"," ","x"," ","z",")","(","t","i","m","e","s"," ","y"," ","z",")"," ",")","(","a","n","d"," ","(","n","o","t"," ","(","z","e","r","o","p"," ","z",")"," ",")","(","l","e","s","s","p"," ","x"," ","y",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","l","e","s","s","p"," ","y"," ","(","p","l","u","s"," ","x"," ","y",")"," ",")","(","n","o","t"," ","(","z","e","r","o","p"," ","x",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","g","c","d"," ","(","t","i","m","e","s"," ","x"," ","z",")","(","t","i","m","e","s"," ","y"," ","z",")"," ",")","(","t","i","m","e","s"," ","z"," ","(","g","c","d"," ","x"," ","y",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","v","a","l","u","e"," ","(","n","o","r","m","a","l","i","z","e"," ","x",")","a",")","(","v","a","l","u","e"," ","x"," ","a",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","(","f","l","a","t","t","e","n"," ","x",")","(","C","o","n","s","s"," ","y"," ","(","N","i","l","l",")"," ",")"," ",")","(","a","n","d"," ","(","n","l","i","s","t","p"," ","x",")","(","e","q","u","a","l"," ","x"," ","y",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","l","i","s","t","p"," ","(","g","o","p","h","e","r"," ","x",")"," ",")","(","l","i","s","t","p"," ","x",")"," ",")"],["(","e","q","u","a","l"," ","(","s","a","m","e","f","r","i","n","g","e"," ","x"," ","y",")","(","e","q","u","a","l"," ","(","f","l","a","t","t","e","n"," ","x",")","(","f","l","a","t","t","e","n"," ","y",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","(","g","r","e","a","t","e","s","t","-","f","a","c","t","o","r"," ","x"," ","y",")","(","z","e","r","o",")"," ",")","(","a","n","d"," ","(","o","r"," ","(","z","e","r","o","p"," ","y",")","(","e","q","u","a","l"," ","y"," ","1",")"," ",")","(","e","q","u","a","l"," ","x"," ","(","z","e","r","o",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","(","g","r","e","a","t","e","s","t","-","f","a","c","t","o","r"," ","x"," ","y",")","1",")","(","e","q","u","a","l"," ","x"," ","1",")"," ",")"],["(","e","q","u","a","l"," ","(","n","u","m","b","e","r","p"," ","(","g","r","e","a","t","e","s","t","-","f","a","c","t","o","r"," ","x"," ","y",")"," ",")","(","n","o","t"," ","(","a","n","d"," ","(","o","r"," ","(","z","e","r","o","p"," ","y",")","(","e","q","u","a","l"," ","y"," ","1",")"," ",")","(","n","o","t"," ","(","n","u","m","b","e","r","p"," ","x",")"," ",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","t","i","m","e","s","-","l","i","s","t"," ","(","a","p","p","e","n","d"," ","x"," ","y",")"," ",")","(","t","i","m","e","s"," ","(","t","i","m","e","s","-","l","i","s","t"," ","x",")","(","t","i","m","e","s","-","l","i","s","t"," ","y",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","p","r","i","m","e","-","l","i","s","t"," ","(","a","p","p","e","n","d"," ","x"," ","y",")"," ",")","(","a","n","d"," ","(","p","r","i","m","e","-","l","i","s","t"," ","x",")","(","p","r","i","m","e","-","l","i","s","t"," ","y",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","z"," ","(","t","i","m","e","s"," ","w"," ","z",")"," ",")","(","a","n","d"," ","(","n","u","m","b","e","r","p"," ","z",")","(","o","r"," ","(","e","q","u","a","l"," ","z"," ","(","z","e","r","o",")"," ",")","(","e","q","u","a","l"," ","w"," ","1",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","g","r","e","a","t","e","r","e","q","p","r"," ","x"," ","y",")","(","n","o","t"," ","(","l","e","s","s","p"," ","x"," ","y",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","x"," ","(","t","i","m","e","s"," ","x"," ","y",")"," ",")","(","o","r"," ","(","e","q","u","a","l"," ","x"," ","(","z","e","r","o",")"," ",")","(","a","n","d"," ","(","n","u","m","b","e","r","p"," ","x",")","(","e","q","u","a","l"," ","y"," ","1",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","r","e","m","a","i","n","d","e","r"," ","(","t","i","m","e","s"," ","y"," ","x",")","y",")","(","z","e","r","o",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","(","t","i","m","e","s"," ","a"," ","b",")","1",")","(","a","n","d"," ","(","n","o","t"," ","(","e","q","u","a","l"," ","a"," ","(","z","e","r","o",")"," ",")"," ",")","(","n","o","t"," ","(","e","q","u","a","l"," ","b"," ","(","z","e","r","o",")"," ",")"," ",")","(","n","u","m","b","e","r","p"," ","a",")","(","n","u","m","b","e","r","p"," ","b",")","(","e","q","u","a","l"," ","(","1","-"," ","a",")","(","z","e","r","o",")"," ",")","(","e","q","u","a","l"," ","(","1","-"," ","b",")","(","z","e","r","o",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","l","e","s","s","p"," ","(","l","e","n","g","t","h"," ","(","d","e","l","e","t","e"," ","x"," ","l",")"," ",")","(","l","e","n","g","t","h"," ","l",")"," ",")","(","m","e","m","b","e","r"," ","x"," ","l",")"," ",")"],["(","e","q","u","a","l"," ","(","s","o","r","t","2"," ","(","d","e","l","e","t","e"," ","x"," ","l",")"," ",")","(","d","e","l","e","t","e"," ","x"," ","(","s","o","r","t","2"," ","l",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","d","s","o","r","t"," ","x",")","(","s","o","r","t","2"," ","x",")"," ",")"],["(","e","q","u","a","l"," ","(","l","e","n","g","t","h","(","C","o","n","s","s"," ","x","1","(","C","o","n","s","s"," ","x","2","(","C","o","n","s","s"," ","x","3","(","C","o","n","s","s"," ","x","4","(","C","o","n","s","s"," ","x","5","(","C","o","n","s","s"," ","x","6"," ","x","7",")"," ",")"," ",")"," ",")"," ",")"," ",")"," ",")","(","p","l","u","s"," ","6"," ","(","l","e","n","g","t","h"," ","x","7",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","d","i","f","f","e","r","e","n","c","e"," ","(","a","d","d","1"," ","(","a","d","d","1"," ","x",")"," ",")","2",")","(","f","i","x"," ","x",")"," ",")"],["(","e","q","u","a","l"," ","(","q","u","o","t","i","e","n","t"," ","(","p","l","u","s"," ","x"," ","(","p","l","u","s"," ","x"," ","y",")"," ",")","2",")","(","p","l","u","s"," ","x"," ","(","q","u","o","t","i","e","n","t"," ","y"," ","2",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","s","i","g","m","a"," ","(","z","e","r","o",")","i",")","(","q","u","o","t","i","e","n","t"," ","(","t","i","m","e","s"," ","i"," ","(","a","d","d","1"," ","i",")"," ",")","2",")"," ",")"],["(","e","q","u","a","l"," ","(","p","l","u","s"," ","x"," ","(","a","d","d","1"," ","y",")"," ",")","(","i","f"," ","(","n","u","m","b","e","r","p"," ","y",")","(","a","d","d","1"," ","(","p","l","u","s"," ","x"," ","y",")"," ",")","(","a","d","d","1"," ","x",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","(","d","i","f","f","e","r","e","n","c","e"," ","x"," ","y",")","(","d","i","f","f","e","r","e","n","c","e"," ","z"," ","y",")"," ",")","(","i","f"," ","(","l","e","s","s","p"," ","x"," ","y",")","(","n","o","t"," ","(","l","e","s","s","p"," ","y"," ","z",")"," ",")","(","i","f"," ","(","l","e","s","s","p"," ","z"," ","y",")","(","n","o","t"," ","(","l","e","s","s","p"," ","y"," ","x",")"," ",")","(","e","q","u","a","l"," ","(","f","i","x"," ","x",")","(","f","i","x"," ","z",")"," ",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","m","e","a","n","i","n","g"," ","(","p","l","u","s","-","t","r","e","e"," ","(","d","e","l","e","t","e"," ","x"," ","y",")"," ",")","a",")","(","i","f"," ","(","m","e","m","b","e","r"," ","x"," ","y",")","(","d","i","f","f","e","r","e","n","c","e"," ","(","m","e","a","n","i","n","g"," ","(","p","l","u","s","-","t","r","e","e"," ","y",")","a",")","(","m","e","a","n","i","n","g"," ","x"," ","a",")"," ",")","(","m","e","a","n","i","n","g"," ","(","p","l","u","s","-","t","r","e","e"," ","y",")","a",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","t","i","m","e","s"," ","x"," ","(","a","d","d","1"," ","y",")"," ",")","(","i","f"," ","(","n","u","m","b","e","r","p"," ","y",")","(","p","l","u","s"," ","x"," ","(","t","i","m","e","s"," ","x"," ","y",")"," ",")","(","f","i","x"," ","x",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","n","t","h"," ","(","N","i","l","l",")","i",")","(","i","f"," ","(","z","e","r","o","p"," ","i",")","(","N","i","l","l",")","(","z","e","r","o",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","l","a","s","t"," ","(","a","p","p","e","n","d"," ","a"," ","b",")"," ",")","(","i","f"," ","(","l","i","s","t","p"," ","b",")","(","l","a","s","t"," ","b",")","(","i","f"," ","(","l","i","s","t","p"," ","a",")","(","C","o","n","s","s"," ","(","c","a","r"," ","(","l","a","s","t"," ","a",")"," ",")","b",")","b",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","e","q","u","a","l"," ","(","l","e","s","s","p"," ","x"," ","y",")","z",")","(","i","f"," ","(","l","e","s","s","p"," ","x"," ","y",")","(","e","q","u","a","l"," ","t"," ","z",")","(","e","q","u","a","l"," ","f"," ","z",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","a","s","s","i","g","n","m","e","n","t"," ","x"," ","(","a","p","p","e","n","d"," ","a"," ","b",")"," ",")","(","i","f"," ","(","a","s","s","i","g","n","e","d","p"," ","x"," ","a",")","(","a","s","s","i","g","n","m","e","n","t"," ","x"," ","a",")","(","a","s","s","i","g","n","m","e","n","t"," ","x"," ","b",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","c","a","r"," ","(","g","o","p","h","e","r"," ","x",")"," ",")","(","i","f"," ","(","l","i","s","t","p"," ","x",")","(","c","a","r"," ","(","f","l","a","t","t","e","n"," ","x",")"," ",")","(","z","e","r","o",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","f","l","a","t","t","e","n"," ","(","c","d","r"," ","(","g","o","p","h","e","r"," ","x",")"," ",")"," ",")","(","i","f"," ","(","l","i","s","t","p"," ","x",")","(","c","d","r"," ","(","f","l","a","t","t","e","n"," ","x",")"," ",")","(","C","o","n","s","s"," ","(","z","e","r","o",")","(","N","i","l","l",")"," ",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","q","u","o","t","i","e","n","t"," ","(","t","i","m","e","s"," ","y"," ","x",")","y",")","(","i","f"," ","(","z","e","r","o","p"," ","y",")","(","z","e","r","o",")","(","f","i","x"," ","x",")"," ",")"," ",")"],["(","e","q","u","a","l"," ","(","g","e","t"," ","j"," ","(","s","e","t"," ","i"," ","v","a","l"," ","m","e","m",")"," ",")","(","i","f"," ","(","e","q","p"," ","j"," ","i",")","v","a","l","(","g","e","t"," ","j"," ","m","e","m",")"," ",")"," ",")"]] let lemmas = addlemmalst(makelemmas(rules), Empty) -//│ FAILURE: Unexpected type error -//│ FAILURE LOCATION: term (Elaborator.scala:331) -//│ ╔══[ERROR] Name not found: rules -//│ ║ l.328: let lemmas = addlemmalst(makelemmas(rules), Empty) -//│ ╙── ^^^^^ -//│ FAILURE: Unexpected exception -//│ /!!!\ Uncaught error: hkmc2.InternalError: Not in scope: lemmas (class hkmc2.semantics.VarSymbol) -//│ at: hkmc2.InternalError$.apply(Diagnostic.scala:60) -//│ at: hkmc2.InternalError$.apply(Diagnostic.scala:71) -//│ at: hkmc2.utils.Scope.lookup_$bang$$anonfun$1(Scope.scala:93) -//│ at: scala.Option.getOrElse(Option.scala:201) -//│ at: hkmc2.utils.Scope.lookup_$bang(Scope.scala:94) -//│ at: hkmc2.codegen.js.JSBuilder.getVar(JSBuilder.scala:77) -//│ at: hkmc2.codegen.js.JSBuilder.result(JSBuilder.scala:96) -//│ at: hkmc2.codegen.js.JSBuilder.argument(JSBuilder.scala:80) -//│ at: hkmc2.codegen.js.JSBuilder.$anonfun$2(JSBuilder.scala:122) -//│ at: scala.collection.immutable.List.map(List.scala:247) +//│ lemmas = Node([Node([Node([Node([Node([Empty, [["a","n","d"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["a","n","d"]), Conss([Atom(["p"]), Conss([Atom(["q"]), Nill])])]), Conss([Conss([Atom(["i","f"]), Conss([Atom(["p"]), Conss([Conss([Atom(["i","f"]), Conss([Atom(["q"]), Conss([Conss([Atom(["t"]), Nill]), Conss([Conss([Atom(["f"]), Nill]), Nill])])])]), Conss([Conss([Atom(["f"]), Nill]), Nill])])])]), Nill])])])]], Node([Empty, [["a","p","p","e","n","d"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Atom(["z"]), Nill])])]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["x"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["y"]), Conss([Atom(["z"]), Nill])])]), Nill])])]), Nill])])])]], Node([Empty, [["a","s","s","i","g","n","m","e","n","t"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["a","s","s","i","g","n","m","e","n","t"]), Conss([Atom(["x"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["a"]), Conss([Atom(["b"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["a","s","s","i","g","n","e","d","p"]), Conss([Atom(["x"]), Conss([Atom(["a"]), Nill])])]), Conss([Conss([Atom(["a","s","s","i","g","n","m","e","n","t"]), Conss([Atom(["x"]), Conss([Atom(["a"]), Nill])])]), Conss([Conss([Atom(["a","s","s","i","g","n","m","e","n","t"]), Conss([Atom(["x"]), Conss([Atom(["b"]), Nill])])]), Nill])])])]), Nill])])])]], Empty])])]), [["a","s","s","u","m","e","-","f","a","l","s","e"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["a","s","s","u","m","e","-","f","a","l","s","e"]), Conss([Atom(["v","a","r"]), Conss([Atom(["a","l","i","s","t"]), Nill])])]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Atom(["v","a","r"]), Conss([Conss([Atom(["f"]), Nill]), Nill])])]), Conss([Atom(["a","l","i","s","t"]), Nill])])]), Nill])])])]], Empty]), [["a","s","s","u","m","e","-","t","r","u","e"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["a","s","s","u","m","e","-","t","r","u","e"]), Conss([Atom(["v","a","r"]), Conss([Atom(["a","l","i","s","t"]), Nill])])]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Atom(["v","a","r"]), Conss([Conss([Atom(["t"]), Nill]), Nill])])]), Conss([Atom(["a","l","i","s","t"]), Nill])])]), Nill])])])]], Empty]), [["b","o","o","l","e","a","n"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["b","o","o","l","e","a","n"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["o","r"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["x"]), Conss([Conss([Atom(["t"]), Nill]), Nill])])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["x"]), Conss([Conss([Atom(["f"]), Nill]), Nill])])]), Nill])])]), Nill])])])]], Node([Empty, [["c","a","r"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["c","a","r"]), Conss([Conss([Atom(["g","o","p","h","e","r"]), Conss([Atom(["x"]), Nill])]), Nill])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["l","i","s","t","p"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["c","a","r"]), Conss([Conss([Atom(["f","l","a","t","t","e","n"]), Conss([Atom(["x"]), Nill])]), Nill])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])])]), Nill])])])]], Empty])]), [["c","o","m","p","i","l","e"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["c","o","m","p","i","l","e"]), Conss([Atom(["f","o","r","m"]), Nill])]), Conss([Conss([Atom(["r","e","v","e","r","s","e"]), Conss([Conss([Atom(["c","o","d","e","g","e","n"]), Conss([Conss([Atom(["o","p","t","i","m","i","z","e"]), Conss([Atom(["f","o","r","m"]), Nill])]), Conss([Conss([Atom(["N","i","l","l"]), Nill]), Nill])])]), Nill])]), Nill])])])]], Node([Node([Node([Empty, [["c","o","u","n","t","-","l","i","s","t"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["c","o","u","n","t","-","l","i","s","t"]), Conss([Atom(["z"]), Conss([Conss([Atom(["s","o","r","t","-","l","p"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Conss([Atom(["c","o","u","n","t","-","l","i","s","t"]), Conss([Atom(["z"]), Conss([Atom(["x"]), Nill])])]), Conss([Conss([Atom(["c","o","u","n","t","-","l","i","s","t"]), Conss([Atom(["z"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Nill])])])]], Empty]), [["c","o","u","n","t","p","s","-"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["c","o","u","n","t","p","s","-"]), Conss([Atom(["l"]), Conss([Atom(["p","r","e","d"]), Nill])])]), Conss([Conss([Atom(["c","o","u","n","t","p","s","-","l","o","o","p"]), Conss([Atom(["l"]), Conss([Atom(["p","r","e","d"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])])]), Nill])])])]], Node([Node([Empty, [["d","i","f","f","e","r","e","n","c","e"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Conss([Atom(["a","d","d","1"]), Conss([Conss([Atom(["a","d","d","1"]), Conss([Atom(["x"]), Nill])]), Nill])]), Conss([Atom(["2"]), Nill])])]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["x"]), Nill])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Conss([Atom(["a","d","d","1"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["y"]), Conss([Atom(["z"]), Nill])])]), Conss([Atom(["z"]), Nill])])]), Conss([Conss([Atom(["a","d","d","1"]), Conss([Atom(["y"]), Nill])]), Nill])])]), Nill])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["b"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["a"]), Conss([Atom(["c"]), Nill])])]), Nill])])]), Conss([Atom(["a"]), Nill])])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["b"]), Conss([Atom(["c"]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Atom(["z"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Atom(["y"]), Conss([Atom(["z"]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["y"]), Conss([Atom(["x"]), Nill])])]), Conss([Atom(["x"]), Nill])])]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["y"]), Nill])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Atom(["x"]), Nill])])]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["y"]), Nill])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Atom(["x"]), Conss([Atom(["x"]), Nill])])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])])]], Empty]), [["d","i","v","i","d","e","s"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["d","i","v","i","d","e","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Conss([Atom(["r","e","m","a","i","n","d","e","r"]), Conss([Atom(["y"]), Conss([Atom(["x"]), Nill])])]), Nill])]), Nill])])])]], Node([Empty, [["d","s","o","r","t"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["d","s","o","r","t"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["s","o","r","t","2"]), Conss([Atom(["x"]), Nill])]), Nill])])])]], Empty])])]), [["e","q","p"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","p"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["y"]), Nill])]), Nill])])]), Nill])])])]], Node([Node([Node([Node([Empty, [["e","q","u","a","l"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Atom(["z"]), Nill])])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["t"]), Conss([Atom(["z"]), Nill])])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["f"]), Conss([Atom(["z"]), Nill])])]), Nill])])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Atom(["z"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["y"]), Conss([Atom(["z"]), Nill])])]), Nill])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["z"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["y"]), Conss([Atom(["x"]), Nill])])]), Nill])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["z"]), Nill])]), Nill])])]), Nill])])])]), Nill])])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["a"]), Conss([Atom(["b"]), Nill])])]), Conss([Atom(["1"]), Nill])])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["a"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]), Nill])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["b"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]), Nill])]), Conss([Conss([Atom(["n","u","m","b","e","r","p"]), Conss([Atom(["a"]), Nill])]), Conss([Conss([Atom(["n","u","m","b","e","r","p"]), Conss([Atom(["b"]), Nill])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["1","-"]), Conss([Atom(["a"]), Nill])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["1","-"]), Conss([Atom(["b"]), Nill])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]), Nill])])])])])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["x"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["o","r"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["x"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["n","u","m","b","e","r","p"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["y"]), Conss([Atom(["1"]), Nill])])]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["z"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["w"]), Conss([Atom(["z"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["n","u","m","b","e","r","p"]), Conss([Atom(["z"]), Nill])]), Conss([Conss([Atom(["o","r"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["z"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["w"]), Conss([Atom(["1"]), Nill])])]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["g","r","e","a","t","e","s","t","-","f","a","c","t","o","r"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Atom(["1"]), Nill])])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["x"]), Conss([Atom(["1"]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["g","r","e","a","t","e","s","t","-","f","a","c","t","o","r"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["o","r"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["y"]), Nill])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["y"]), Conss([Atom(["1"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["x"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["f","l","a","t","t","e","n"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Atom(["y"]), Conss([Conss([Atom(["N","i","l","l"]), Nill]), Nill])])]), Nill])])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["n","l","i","s","t","p"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["a"]), Conss([Atom(["b"]), Nill])])]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["a"]), Conss([Atom(["c"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["b"]), Conss([Atom(["c"]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]), Conss([Conss([Atom(["o","r"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["y"]), Nill])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["x"]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["n","u","m","b","e","r","p"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["o","r"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["x"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["y"]), Nill])]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["y"]), Conss([Atom(["x"]), Nill])])]), Nill])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["a"]), Conss([Atom(["b"]), Nill])])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["a"]), Conss([Atom(["c"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["b"]), Nill])]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["c"]), Nill])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["a"]), Conss([Atom(["b"]), Nill])])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["a"]), Nill])]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["b"]), Nill])]), Nill])])]), Nill])])])]], Empty]), [["e","v","e","n","1"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","v","e","n","1"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["t"]), Nill]), Conss([Conss([Atom(["o","d","d"]), Conss([Conss([Atom(["1","-"]), Conss([Atom(["x"]), Nill])]), Nill])]), Nill])])])]), Nill])])])]], Node([Node([Empty, [["e","x","e","c"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","x","e","c"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Atom(["p","d","s"]), Conss([Atom(["e","n","v","r","n"]), Nill])])])]), Conss([Conss([Atom(["e","x","e","c"]), Conss([Atom(["y"]), Conss([Conss([Atom(["e","x","e","c"]), Conss([Atom(["x"]), Conss([Atom(["p","d","s"]), Conss([Atom(["e","n","v","r","n"]), Nill])])])]), Conss([Atom(["e","n","v","r","n"]), Nill])])])]), Nill])])])]], Node([Empty, [["e","x","p"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","x","p"]), Conss([Atom(["i"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["j"]), Conss([Atom(["k"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["e","x","p"]), Conss([Conss([Atom(["e","x","p"]), Conss([Atom(["i"]), Conss([Atom(["j"]), Nill])])]), Conss([Atom(["k"]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["e","x","p"]), Conss([Atom(["i"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["j"]), Conss([Atom(["k"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Conss([Atom(["e","x","p"]), Conss([Atom(["i"]), Conss([Atom(["j"]), Nill])])]), Conss([Conss([Atom(["e","x","p"]), Conss([Atom(["i"]), Conss([Atom(["k"]), Nill])])]), Nill])])]), Nill])])])]], Empty])]), [["f","a","c","t","-"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["f","a","c","t","-"]), Conss([Atom(["i"]), Nill])]), Conss([Conss([Atom(["f","a","c","t","-","l","o","o","p"]), Conss([Atom(["i"]), Conss([Atom(["1"]), Nill])])]), Nill])])])]], Node([Empty, [["f","a","l","s","i","f","y"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["f","a","l","s","i","f","y"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["f","a","l","s","i","f","y","1"]), Conss([Conss([Atom(["n","o","r","m","a","l","i","z","e"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["N","i","l","l"]), Nill]), Nill])])]), Nill])])])]], Node([Empty, [["f","i","x"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["n","u","m","b","e","r","p"]), Conss([Atom(["x"]), Nill])]), Conss([Atom(["x"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])])]), Nill])])])]], Node([Node([Empty, [["f","l","a","t","t","e","n"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["f","l","a","t","t","e","n"]), Conss([Conss([Atom(["c","d","r"]), Conss([Conss([Atom(["g","o","p","h","e","r"]), Conss([Atom(["x"]), Nill])]), Nill])]), Nill])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["l","i","s","t","p"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["c","d","r"]), Conss([Conss([Atom(["f","l","a","t","t","e","n"]), Conss([Atom(["x"]), Nill])]), Nill])]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Conss([Conss([Atom(["N","i","l","l"]), Nill]), Nill])])]), Nill])])])]), Nill])])])]], Empty]), [["g","c","d"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["g","c","d"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Atom(["z"]), Nill])])]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["y"]), Conss([Atom(["z"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["z"]), Conss([Conss([Atom(["g","c","d"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["g","c","d"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["g","c","d"]), Conss([Atom(["y"]), Conss([Atom(["x"]), Nill])])]), Nill])])])]], Node([Empty, [["g","e","t"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["g","e","t"]), Conss([Atom(["j"]), Conss([Conss([Atom(["s","e","t"]), Conss([Atom(["i"]), Conss([Atom(["v","a","l"]), Conss([Atom(["m","e","m"]), Nill])])])]), Nill])])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["e","q","p"]), Conss([Atom(["j"]), Conss([Atom(["i"]), Nill])])]), Conss([Atom(["v","a","l"]), Conss([Conss([Atom(["g","e","t"]), Conss([Atom(["j"]), Conss([Atom(["m","e","m"]), Nill])])]), Nill])])])]), Nill])])])]], Empty])])])])])]), [["g","r","e","a","t","e","r","e","q","p"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["g","r","e","a","t","e","r","e","q","p"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["y"]), Conss([Atom(["x"]), Nill])])]), Nill])]), Nill])])])]], Node([Empty, [["g","r","e","a","t","e","r","e","q","p","r"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["g","r","e","a","t","e","r","e","q","p","r"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])]), Nill])])])]], Empty])]), [["g","r","e","a","t","e","r","p"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["g","r","e","a","t","e","r","p"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["y"]), Conss([Atom(["x"]), Nill])])]), Nill])])])]], Node([Node([Node([Empty, [["i","f"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["i","f"]), Conss([Atom(["a"]), Conss([Atom(["b"]), Conss([Atom(["c"]), Nill])])])]), Conss([Atom(["d"]), Conss([Atom(["e"]), Nill])])])]), Conss([Conss([Atom(["i","f"]), Conss([Atom(["a"]), Conss([Conss([Atom(["i","f"]), Conss([Atom(["b"]), Conss([Atom(["d"]), Conss([Atom(["e"]), Nill])])])]), Conss([Conss([Atom(["i","f"]), Conss([Atom(["c"]), Conss([Atom(["d"]), Conss([Atom(["e"]), Nill])])])]), Nill])])])]), Nill])])])]], Empty]), [["i","f","f"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["i","f","f"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["i","m","p","l","i","e","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["i","m","p","l","i","e","s"]), Conss([Atom(["y"]), Conss([Atom(["x"]), Nill])])]), Nill])])]), Nill])])])]], Node([Empty, [["i","m","p","l","i","e","s"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["i","m","p","l","i","e","s"]), Conss([Atom(["p"]), Conss([Atom(["q"]), Nill])])]), Conss([Conss([Atom(["i","f"]), Conss([Atom(["p"]), Conss([Conss([Atom(["i","f"]), Conss([Atom(["q"]), Conss([Conss([Atom(["t"]), Nill]), Conss([Conss([Atom(["f"]), Nill]), Nill])])])]), Conss([Conss([Atom(["t"]), Nill]), Nill])])])]), Nill])])])]], Node([Node([Empty, [["l","a","s","t"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","a","s","t"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["a"]), Conss([Atom(["b"]), Nill])])]), Nill])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["l","i","s","t","p"]), Conss([Atom(["b"]), Nill])]), Conss([Conss([Atom(["l","a","s","t"]), Conss([Atom(["b"]), Nill])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["l","i","s","t","p"]), Conss([Atom(["a"]), Nill])]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Conss([Atom(["c","a","r"]), Conss([Conss([Atom(["l","a","s","t"]), Conss([Atom(["a"]), Nill])]), Nill])]), Conss([Atom(["b"]), Nill])])]), Conss([Atom(["b"]), Nill])])])]), Nill])])])]), Nill])])])]], Empty]), [["l","e","n","g","t","h"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","e","n","g","t","h"]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Atom(["x","1"]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Atom(["x","2"]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Atom(["x","3"]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Atom(["x","4"]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Atom(["x","5"]), Conss([Conss([Atom(["C","o","n","s","s"]), Conss([Atom(["x","6"]), Conss([Atom(["x","7"]), Nill])])]), Nill])])]), Nill])])]), Nill])])]), Nill])])]), Nill])])]), Nill])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["6"]), Conss([Conss([Atom(["l","e","n","g","t","h"]), Conss([Atom(["x","7"]), Nill])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","e","n","g","t","h"]), Conss([Conss([Atom(["r","e","v","e","r","s","e"]), Conss([Atom(["x"]), Nill])]), Nill])]), Conss([Conss([Atom(["l","e","n","g","t","h"]), Conss([Atom(["x"]), Nill])]), Nill])])])]], Empty])])]), [["l","e","s","s","e","q","p"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","e","s","s","e","q","p"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["y"]), Conss([Atom(["x"]), Nill])])]), Nill])]), Nill])])])]], Node([Node([Node([Node([Node([Node([Node([Empty, [["l","e","s","s","p"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Conss([Atom(["l","e","n","g","t","h"]), Conss([Conss([Atom(["d","e","l","e","t","e"]), Conss([Atom(["x"]), Conss([Atom(["l"]), Nill])])]), Nill])]), Conss([Conss([Atom(["l","e","n","g","t","h"]), Conss([Atom(["l"]), Nill])]), Nill])])]), Conss([Conss([Atom(["m","e","m","b","e","r"]), Conss([Atom(["x"]), Conss([Atom(["l"]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["y"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["x"]), Nill])]), Nill])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Atom(["z"]), Nill])])]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["y"]), Conss([Atom(["z"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["z"]), Nill])]), Nill])]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Atom(["z"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["y"]), Conss([Atom(["z"]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Conss([Atom(["r","e","m","a","i","n","d","e","r"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Atom(["x"]), Nill])])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["y"]), Nill])]), Nill])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["x"]), Nill])]), Nill])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])]), Nill])])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Conss([Atom(["q","u","o","t","i","e","n","t"]), Conss([Atom(["i"]), Conss([Atom(["j"]), Nill])])]), Conss([Atom(["i"]), Nill])])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["i"]), Nill])]), Nill])]), Conss([Conss([Atom(["o","r"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["j"]), Nill])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["j"]), Conss([Atom(["1"]), Nill])])]), Nill])]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","e","s","s","p"]), Conss([Conss([Atom(["r","e","m","a","i","n","d","e","r"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["y"]), Nill])]), Nill])]), Nill])])])]], Node([Empty, [["l","i","s","t","p"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["l","i","s","t","p"]), Conss([Conss([Atom(["g","o","p","h","e","r"]), Conss([Atom(["x"]), Nill])]), Nill])]), Conss([Conss([Atom(["l","i","s","t","p"]), Conss([Atom(["x"]), Nill])]), Nill])])])]], Empty])]), [["m","c","-","f","l","a","t","t","e","n"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["m","c","-","f","l","a","t","t","e","n"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Conss([Atom(["f","l","a","t","t","e","n"]), Conss([Atom(["x"]), Nill])]), Conss([Atom(["y"]), Nill])])]), Nill])])])]], Empty]), [["m","e","a","n","i","n","g"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["m","e","a","n","i","n","g"]), Conss([Conss([Atom(["p","l","u","s","-","t","r","e","e"]), Conss([Conss([Atom(["d","e","l","e","t","e"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])]), Conss([Atom(["a"]), Nill])])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["m","e","m","b","e","r"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Conss([Atom(["m","e","a","n","i","n","g"]), Conss([Conss([Atom(["p","l","u","s","-","t","r","e","e"]), Conss([Atom(["y"]), Nill])]), Conss([Atom(["a"]), Nill])])]), Conss([Conss([Atom(["m","e","a","n","i","n","g"]), Conss([Atom(["x"]), Conss([Atom(["a"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["m","e","a","n","i","n","g"]), Conss([Conss([Atom(["p","l","u","s","-","t","r","e","e"]), Conss([Atom(["y"]), Nill])]), Conss([Atom(["a"]), Nill])])]), Nill])])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["m","e","a","n","i","n","g"]), Conss([Conss([Atom(["p","l","u","s","-","t","r","e","e"]), Conss([Conss([Atom(["p","l","u","s","-","f","r","i","n","g","e"]), Conss([Atom(["x"]), Nill])]), Nill])]), Conss([Atom(["a"]), Nill])])]), Conss([Conss([Atom(["f","i","x"]), Conss([Conss([Atom(["m","e","a","n","i","n","g"]), Conss([Atom(["x"]), Conss([Atom(["a"]), Nill])])]), Nill])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["m","e","a","n","i","n","g"]), Conss([Conss([Atom(["p","l","u","s","-","t","r","e","e"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])]), Conss([Atom(["a"]), Nill])])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Conss([Atom(["m","e","a","n","i","n","g"]), Conss([Conss([Atom(["p","l","u","s","-","t","r","e","e"]), Conss([Atom(["x"]), Nill])]), Conss([Atom(["a"]), Nill])])]), Conss([Conss([Atom(["m","e","a","n","i","n","g"]), Conss([Conss([Atom(["p","l","u","s","-","t","r","e","e"]), Conss([Atom(["y"]), Nill])]), Conss([Atom(["a"]), Nill])])]), Nill])])]), Nill])])])]], Node([Empty, [["m","e","m","b","e","r"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["m","e","m","b","e","r"]), Conss([Atom(["a"]), Conss([Conss([Atom(["i","n","t","e","r","s","e","c","t"]), Conss([Atom(["b"]), Conss([Atom(["c"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["m","e","m","b","e","r"]), Conss([Atom(["a"]), Conss([Atom(["b"]), Nill])])]), Conss([Conss([Atom(["m","e","m","b","e","r"]), Conss([Atom(["a"]), Conss([Atom(["c"]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["m","e","m","b","e","r"]), Conss([Atom(["x"]), Conss([Conss([Atom(["r","e","v","e","r","s","e"]), Conss([Atom(["y"]), Nill])]), Nill])])]), Conss([Conss([Atom(["m","e","m","b","e","r"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["m","e","m","b","e","r"]), Conss([Atom(["x"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["a"]), Conss([Atom(["b"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["o","r"]), Conss([Conss([Atom(["m","e","m","b","e","r"]), Conss([Atom(["x"]), Conss([Atom(["a"]), Nill])])]), Conss([Conss([Atom(["m","e","m","b","e","r"]), Conss([Atom(["x"]), Conss([Atom(["b"]), Nill])])]), Nill])])]), Nill])])])]], Empty])]), [["n","o","t"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["n","o","t"]), Conss([Atom(["p"]), Nill])]), Conss([Conss([Atom(["i","f"]), Conss([Atom(["p"]), Conss([Conss([Atom(["f"]), Nill]), Conss([Conss([Atom(["t"]), Nill]), Nill])])])]), Nill])])])]], Node([Empty, [["n","t","h"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["n","t","h"]), Conss([Conss([Atom(["N","i","l","l"]), Nill]), Conss([Atom(["i"]), Nill])])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["i"]), Nill])]), Conss([Conss([Atom(["N","i","l","l"]), Nill]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["n","t","h"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["a"]), Conss([Atom(["b"]), Nill])])]), Conss([Atom(["i"]), Nill])])]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Conss([Atom(["n","t","h"]), Conss([Atom(["a"]), Conss([Atom(["i"]), Nill])])]), Conss([Conss([Atom(["n","t","h"]), Conss([Atom(["b"]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Atom(["i"]), Conss([Conss([Atom(["l","e","n","g","t","h"]), Conss([Atom(["a"]), Nill])]), Nill])])]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["n","t","h"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Conss([Atom(["i"]), Nill])])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])])]], Node([Empty, [["n","u","m","b","e","r","p"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["n","u","m","b","e","r","p"]), Conss([Conss([Atom(["g","r","e","a","t","e","s","t","-","f","a","c","t","o","r"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["o","r"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["y"]), Nill])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["y"]), Conss([Atom(["1"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["n","u","m","b","e","r","p"]), Conss([Atom(["x"]), Nill])]), Nill])]), Nill])])]), Nill])]), Nill])])])]], Empty])])]), [["o","r"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["o","r"]), Conss([Atom(["p"]), Conss([Atom(["q"]), Nill])])]), Conss([Conss([Atom(["i","f"]), Conss([Atom(["p"]), Conss([Conss([Atom(["t"]), Nill]), Conss([Conss([Atom(["i","f"]), Conss([Atom(["q"]), Conss([Conss([Atom(["t"]), Nill]), Conss([Conss([Atom(["f"]), Nill]), Nill])])])]), Nill])])])]), Nill])])])]], Node([Empty, [["p","l","u","s"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Conss([Atom(["a","d","d","1"]), Conss([Atom(["y"]), Nill])]), Nill])])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["n","u","m","b","e","r","p"]), Conss([Atom(["y"]), Nill])]), Conss([Conss([Atom(["a","d","d","1"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])]), Conss([Conss([Atom(["a","d","d","1"]), Conss([Atom(["x"]), Nill])]), Nill])])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Conss([Atom(["r","e","m","a","i","n","d","e","r"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["y"]), Conss([Conss([Atom(["q","u","o","t","i","e","n","t"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Nill])])]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["x"]), Nill])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Atom(["z"]), Nill])])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["y"]), Conss([Atom(["z"]), Nill])])]), Nill])])]), Nill])])])]], Node([Empty, [["p","o","w","e","r","-","e","v","a","l"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["p","o","w","e","r","-","e","v","a","l"]), Conss([Conss([Atom(["b","i","g","-","p","l","u","s"]), Conss([Conss([Atom(["p","o","w","e","r","-","r","e","p"]), Conss([Atom(["i"]), Conss([Atom(["b","a","s","e"]), Nill])])]), Conss([Conss([Atom(["p","o","w","e","r","-","r","e","p"]), Conss([Atom(["j"]), Conss([Atom(["b","a","s","e"]), Nill])])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Conss([Atom(["b","a","s","e"]), Nill])])])])]), Conss([Atom(["b","a","s","e"]), Nill])])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["i"]), Conss([Atom(["j"]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["p","o","w","e","r","-","e","v","a","l"]), Conss([Conss([Atom(["p","o","w","e","r","-","r","e","p"]), Conss([Atom(["i"]), Conss([Atom(["b","a","s","e"]), Nill])])]), Conss([Atom(["b","a","s","e"]), Nill])])]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["i"]), Nill])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["p","o","w","e","r","-","e","v","a","l"]), Conss([Conss([Atom(["b","i","g","-","p","l","u","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Conss([Atom(["i"]), Conss([Atom(["b","a","s","e"]), Nill])])])])]), Conss([Atom(["b","a","s","e"]), Nill])])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["i"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Conss([Atom(["p","o","w","e","r","-","e","v","a","l"]), Conss([Atom(["x"]), Conss([Atom(["b","a","s","e"]), Nill])])]), Conss([Conss([Atom(["p","o","w","e","r","-","e","v","a","l"]), Conss([Atom(["y"]), Conss([Atom(["b","a","s","e"]), Nill])])]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["p","o","w","e","r","-","e","v","a","l"]), Conss([Conss([Atom(["b","i","g","-","p","l","u","s","1"]), Conss([Atom(["l"]), Conss([Atom(["i"]), Conss([Atom(["b","a","s","e"]), Nill])])])]), Conss([Atom(["b","a","s","e"]), Nill])])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Conss([Atom(["p","o","w","e","r","-","e","v","a","l"]), Conss([Atom(["l"]), Conss([Atom(["b","a","s","e"]), Nill])])]), Conss([Atom(["i"]), Nill])])]), Nill])])])]], Empty])])]), [["p","r","i","m","e"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["p","r","i","m","e"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["x"]), Nill])]), Nill])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["x"]), Conss([Conss([Atom(["a","d","d","1"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])]), Nill])])]), Nill])]), Conss([Conss([Atom(["p","r","i","m","e","1"]), Conss([Atom(["x"]), Conss([Conss([Atom(["1","-"]), Conss([Atom(["x"]), Nill])]), Nill])])]), Nill])])])]), Nill])])])]], Node([Node([Node([Empty, [["p","r","i","m","e","-","l","i","s","t"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["p","r","i","m","e","-","l","i","s","t"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])]), Conss([Conss([Atom(["a","n","d"]), Conss([Conss([Atom(["p","r","i","m","e","-","l","i","s","t"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["p","r","i","m","e","-","l","i","s","t"]), Conss([Atom(["y"]), Nill])]), Nill])])]), Nill])])])]], Node([Empty, [["q","u","o","t","i","e","n","t"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["q","u","o","t","i","e","n","t"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["y"]), Conss([Atom(["x"]), Nill])])]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["y"]), Nill])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["x"]), Nill])]), Nill])])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["q","u","o","t","i","e","n","t"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Conss([Atom(["2"]), Nill])])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Conss([Atom(["q","u","o","t","i","e","n","t"]), Conss([Atom(["y"]), Conss([Atom(["2"]), Nill])])]), Nill])])]), Nill])])])]], Empty])]), [["r","e","m","a","i","n","d","e","r"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["r","e","m","a","i","n","d","e","r"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["y"]), Conss([Atom(["x"]), Nill])])]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["r","e","m","a","i","n","d","e","r"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Atom(["z"]), Nill])])]), Conss([Atom(["z"]), Nill])])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["r","e","m","a","i","n","d","e","r"]), Conss([Atom(["x"]), Conss([Atom(["x"]), Nill])])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["r","e","m","a","i","n","d","e","r"]), Conss([Atom(["y"]), Conss([Atom(["1"]), Nill])])]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])])]], Empty]), [["r","e","v","e","r","s","e"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["r","e","v","e","r","s","e"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["a"]), Conss([Atom(["b"]), Nill])])]), Nill])]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Conss([Atom(["r","e","v","e","r","s","e"]), Conss([Atom(["b"]), Nill])]), Conss([Conss([Atom(["r","e","v","e","r","s","e"]), Conss([Atom(["a"]), Nill])]), Nill])])]), Nill])])])]], Empty])]), [["r","e","v","e","r","s","e","-"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["r","e","v","e","r","s","e","-"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["r","e","v","e","r","s","e","-","l","o","o","p"]), Conss([Atom(["x"]), Conss([Conss([Atom(["N","i","l","l"]), Nill]), Nill])])]), Nill])])])]], Node([Node([Empty, [["r","e","v","e","r","s","e","-","l","o","o","p"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["r","e","v","e","r","s","e","-","l","o","o","p"]), Conss([Atom(["x"]), Conss([Conss([Atom(["N","i","l","l"]), Nill]), Nill])])]), Conss([Conss([Atom(["r","e","v","e","r","s","e"]), Conss([Atom(["x"]), Nill])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["r","e","v","e","r","s","e","-","l","o","o","p"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Conss([Atom(["r","e","v","e","r","s","e"]), Conss([Atom(["x"]), Nill])]), Conss([Atom(["y"]), Nill])])]), Nill])])])]], Node([Empty, [["s","a","m","e","f","r","i","n","g","e"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["s","a","m","e","f","r","i","n","g","e"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["f","l","a","t","t","e","n"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["f","l","a","t","t","e","n"]), Conss([Atom(["y"]), Nill])]), Nill])])]), Nill])])])]], Node([Node([Empty, [["s","i","g","m","a"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["s","i","g","m","a"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Conss([Atom(["i"]), Nill])])]), Conss([Conss([Atom(["q","u","o","t","i","e","n","t"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["i"]), Conss([Conss([Atom(["a","d","d","1"]), Conss([Atom(["i"]), Nill])]), Nill])])]), Conss([Atom(["2"]), Nill])])]), Nill])])])]], Empty]), [["s","o","r","t","2"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["s","o","r","t","2"]), Conss([Conss([Atom(["d","e","l","e","t","e"]), Conss([Atom(["x"]), Conss([Atom(["l"]), Nill])])]), Nill])]), Conss([Conss([Atom(["d","e","l","e","t","e"]), Conss([Atom(["x"]), Conss([Conss([Atom(["s","o","r","t","2"]), Conss([Atom(["l"]), Nill])]), Nill])])]), Nill])])])]], Empty])])]), [["t","a","u","t","o","l","o","g","y","-","c","h","e","c","k","e","r"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["t","a","u","t","o","l","o","g","y","-","c","h","e","c","k","e","r"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["t","a","u","t","o","l","o","g","y","p"]), Conss([Conss([Atom(["n","o","r","m","a","l","i","z","e"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["N","i","l","l"]), Nill]), Nill])])]), Nill])])])]], Node([Node([Empty, [["t","i","m","e","s"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Conss([Atom(["a","d","d","1"]), Conss([Atom(["y"]), Nill])]), Nill])])]), Conss([Conss([Atom(["i","f"]), Conss([Conss([Atom(["n","u","m","b","e","r","p"]), Conss([Atom(["y"]), Nill])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["x"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["f","i","x"]), Conss([Atom(["x"]), Nill])]), Nill])])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Atom(["c"]), Conss([Atom(["w"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["d","i","f","f","e","r","e","n","c","e"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["c"]), Conss([Atom(["x"]), Nill])])]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["w"]), Conss([Atom(["x"]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Atom(["z"]), Nill])])]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["y"]), Conss([Atom(["z"]), Nill])])]), Nill])])]), Nill])])]),Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Atom(["y"]), Conss([Atom(["z"]), Nill])])]), Nill])])]), Conss([Conss([Atom(["p","l","u","s"]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Atom(["x"]), Conss([Atom(["z"]), Nill])])]), Nill])])]), Nill])])])]], Node([Node([Empty, [["t","i","m","e","s","-","l","i","s","t"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["t","i","m","e","s","-","l","i","s","t"]), Conss([Conss([Atom(["a","p","p","e","n","d"]), Conss([Atom(["x"]), Conss([Atom(["y"]), Nill])])]), Nill])]), Conss([Conss([Atom(["t","i","m","e","s"]), Conss([Conss([Atom(["t","i","m","e","s","-","l","i","s","t"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["t","i","m","e","s","-","l","i","s","t"]), Conss([Atom(["y"]), Nill])]), Nill])])]), Nill])])])]], Empty]), [["v","a","l","u","e"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["v","a","l","u","e"]), Conss([Conss([Atom(["n","o","r","m","a","l","i","z","e"]), Conss([Atom(["x"]), Nill])]), Conss([Atom(["a"]), Nill])])]), Conss([Conss([Atom(["v","a","l","u","e"]), Conss([Atom(["x"]), Conss([Atom(["a"]), Nill])])]), Nill])])])]], Empty])]), [["z","e","r","o","p"], [Conss([Atom(["e","q","u","a","l"]), Conss([Conss([Atom(["z","e","r","o","p"]), Conss([Atom(["x"]), Nill])]), Conss([Conss([Atom(["o","r"]), Conss([Conss([Atom(["e","q","u","a","l"]), Conss([Atom(["x"]), Conss([Conss([Atom(["z","e","r","o"]), Nill]), Nill])])]), Conss([Conss([Atom(["n","o","t"]), Conss([Conss([Atom(["n","u","m","b","e","r","p"]), Conss([Atom(["x"]), Nill])]), Nill])]), Nill])])]), Nill])])])]], Empty])])])])])])]) fun tautp(term) = tautologyp([rewrite(term, lemmas), Nill, Nill]) -//│ FAILURE: Unexpected exception -//│ /!!!\ Uncaught error: hkmc2.InternalError: Not in scope: lemmas (class hkmc2.semantics.VarSymbol) -//│ at: hkmc2.InternalError$.apply(Diagnostic.scala:60) -//│ at: hkmc2.InternalError$.apply(Diagnostic.scala:71) -//│ at: hkmc2.utils.Scope.lookup_$bang$$anonfun$1(Scope.scala:93) -//│ at: scala.Option.getOrElse(Option.scala:201) -//│ at: hkmc2.utils.Scope.lookup_$bang(Scope.scala:94) -//│ at: hkmc2.codegen.js.JSBuilder.getVar(JSBuilder.scala:77) -//│ at: hkmc2.codegen.js.JSBuilder.result(JSBuilder.scala:96) -//│ at: hkmc2.codegen.js.JSBuilder.argument(JSBuilder.scala:80) -//│ at: hkmc2.codegen.js.JSBuilder.$anonfun$2(JSBuilder.scala:122) -//│ at: scala.collection.immutable.List.map(List.scala:251) fun teststatement(i) = applysubst(subterm(i), statement) @@ -366,22 +337,7 @@ fun testBoyer2_nofib(n) = report(testresult(n)) :expect "The term is a tautology" testBoyer2_nofib(3) -//│ FAILURE: Unexpected runtime error -//│ FAILURE LOCATION: mkQuery (JSBackendDiffMaker.scala:146) -//│ ═══[RUNTIME ERROR] ReferenceError: tautp is not defined -//│ at testresult (REPL122:1:227) -//│ at testBoyer2_nofib (REPL125:1:215) -//│ at REPL128:1:39 -//│ at ContextifyScript.runInThisContext (node:vm:137:12) -//│ at REPLServer.defaultEval (node:repl:597:22) -//│ at bound (node:domain:433:15) -//│ at REPLServer.runBound [as eval] (node:domain:444:12) -//│ at REPLServer.onLine (node:repl:926:10) -//│ at REPLServer.emit (node:events:524:28) -//│ at REPLServer.emit (node:domain:489:12) -//│ FAILURE: Unexpected runtime error -//│ FAILURE LOCATION: processTerm (JSBackendDiffMaker.scala:192) -//│ ═══[RUNTIME ERROR] Expected: '"The term is a tautology"', got: 'undefined' +//│ = "The term is a tautology" diff --git a/hkmc2/shared/src/test/mlscript/nofib/mate.mls b/hkmc2/shared/src/test/mlscript/nofib/mate.mls index ad5e4adbb7..78751a0563 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/mate.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/mate.mls @@ -557,16 +557,22 @@ fun testMate_nofib(dummy) = solve(bd, c, n) print(nofibListToString(testMate_nofib(0))) -//│ FAILURE: Unexpected runtime error -//│ FAILURE LOCATION: mkQuery (JSBackendDiffMaker.scala:146) -//│ ═══[RUNTIME ERROR] Error: ENOENT: no such file or directory, open 'hkmc2/shared/src/test/mlscript/nofib/input/heathcote3.prob' -//│ at Object.openSync (node:fs:562:18) -//│ at Object.readFileSync (node:fs:446:35) -//│ at testMate_nofib (REPL226:1:388) -//│ at REPL229:1:47 -//│ at ContextifyScript.runInThisContext (node:vm:137:12) -//│ at REPLServer.defaultEval (node:repl:597:22) -//│ at bound (node:domain:433:15) -//│ at REPLServer.runBound [as eval] (node:domain:444:12) -//│ at REPLServer.onLine (node:repl:926:10) -//│ at REPLServer.emit (node:events:524:28) +//│ > - - - - - - - - +//│ > - - - - - - - - +//│ > - - - - - - - - +//│ > - - - - P - - - +//│ > - - - - p - k b +//│ > - P n - K - - - +//│ > - P - - - - - - +//│ > - q - - - - - - +//│ > +//│ > White to move and mate in 3 +//│ > +//│ > 1. N/QB3-QR2, +//│ > if K-Q5; 2. B/KR4-KB2, K-QB5; 3. Q/QN1-KB1++ +//│ > if K-Q7; 2. K-KB3, P/QN6xN/QR7; 3. B/KR4-K1++ +//│ > if K-K7; 2. N/QR2-QN4, +//│ > if K-Q7; 3. Q/QN1-K1++ +//│ > if K-K6; 3. Q/QN1-Q3++ +//│ > if P/QN6xN/QR7; 2. Q/QN1-QB2, ...; 3. B/KR4-KB2++ +//│ > diff --git a/hkmc2/shared/src/test/mlscript/nofib/sorting.mls b/hkmc2/shared/src/test/mlscript/nofib/sorting.mls index 7eacb33060..58ff7ef631 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/sorting.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/sorting.mls @@ -216,16 +216,4 @@ fun testSorting_nofib(d) = hash(mangle(f)) testSorting_nofib(0) -//│ FAILURE: Unexpected runtime error -//│ FAILURE LOCATION: mkQuery (JSBackendDiffMaker.scala:146) -//│ ═══[RUNTIME ERROR] Error: ENOENT: no such file or directory, open 'hkmc2/shared/src/test/mlscript/nofib/input/Main.hs' -//│ at Object.openSync (node:fs:562:18) -//│ at Object.readFileSync (node:fs:446:35) -//│ at testSorting_nofib (REPL108:1:240) -//│ at REPL111:1:39 -//│ at ContextifyScript.runInThisContext (node:vm:137:12) -//│ at REPLServer.defaultEval (node:repl:597:22) -//│ at bound (node:domain:433:15) -//│ at REPLServer.runBound [as eval] (node:domain:444:12) -//│ at REPLServer.onLine (node:repl:926:10) -//│ at REPLServer.emit (node:events:524:28) +//│ = 51324117188054929115411819706576305711291550658570113274291768822777898552447837804420193403034280334581113235670099168108057310001444698188883902000871912629747889286942274533143362191347715770581074120684028066661549409447053566864805982796651442411825424058139343253169753750307013113236996387277789074623630137288987589869641913268610508598505040964906263227437054452571059796961267985287441539342423613634888118731387934522320394294636575704912348025851038478882488022787377510287490741895262233989080994241592338442788051616303082788441666485156091668196999668892850523930511918729736856089560984406499736606084171798216360770991023233180481976810767432750226966921480421914178641779179040473344962763594357880599983085435482161632405644389584578524102239884780307588440751057343783694537559222924711205140877849398042544407611747227163056408231621727687968160470282720794027470616537695447289808133239223198869 diff --git a/hkmc2/shared/src/test/mlscript/nofib/treejoin.mls b/hkmc2/shared/src/test/mlscript/nofib/treejoin.mls index c4cc838e62..68bcd0f539 100644 --- a/hkmc2/shared/src/test/mlscript/nofib/treejoin.mls +++ b/hkmc2/shared/src/test/mlscript/nofib/treejoin.mls @@ -76,7 +76,7 @@ fun testTreejoin_nofib(n) = :re // nodejs stack size 8192 can handle this testTreejoin_nofib(0).toString() -//│ ═══[RUNTIME ERROR] Error: ENOENT: no such file or directory, open 'hkmc2/shared/src/test/mlscript/nofib/input/1500.1' +//│ ═══[RUNTIME ERROR] RangeError: Maximum call stack size exceeded // //│ = 'Node(26790, Node(25449, Node(24977, Node(24359, Node(24314, Leaf(24314, (9658,1890,24314,24314,7755)), Leaf(24359, (17282,5066,24359,24359,134))), Node(24452, Leaf(24452, (13985,4700,24452,24452,8400)), Node(24776, Leaf(24776, (9392,18824,24776,24776,25492)), Leaf(24977, (21044,6260,24977,24977,3296))))), Node(25347, Node(25087, Leaf(25087, (9226,22666,25087,25087,19595)), Leaf(25347, (9331,1734,25347,25347,12071))), Leaf(25449, (24361,14401,25449,25449,5552)))), Node(26770, Node(26207, Node(25780, Node(25457, Leaf(25457, (5457,5273,25457,25457,5149)), Leaf(25780, (21801,92,25780,25780,2781))), Leaf(26207, (22839,18759,26207,26207,20366))), Node(26436, Node(26274, Node(26222, Leaf(26222, (11315,3470,26222,26222,23055)), Leaf(26274, (19231,20706,26274,26274,24107))), Node(26276, Leaf(26276, (3545,169,26276,26276,7584)), Leaf(26436, (22148,24244,26436,26436,2448)))), Node(26473, Leaf(26473, (13180,15097,26473,26473,16469)), Leaf(26770, (23746,15943,26770,26770,1467))))), Leaf(26790, (25643,16230,26790,26790,970)))), Leaf(26932, (24868,11500,26932,26932,3741)))' From d4a3071a3e167175175318d7f2ddcfbaeb272d31 Mon Sep 17 00:00:00 2001 From: Flandia Yingman Date: Mon, 10 Mar 2025 15:24:34 +0800 Subject: [PATCH 08/14] Revert HKScratch.mls --- hkmc2/shared/src/test/mlscript/HkScratch.mls | 1 + 1 file changed, 1 insertion(+) diff --git a/hkmc2/shared/src/test/mlscript/HkScratch.mls b/hkmc2/shared/src/test/mlscript/HkScratch.mls index f46025be79..446cd427b0 100644 --- a/hkmc2/shared/src/test/mlscript/HkScratch.mls +++ b/hkmc2/shared/src/test/mlscript/HkScratch.mls @@ -6,6 +6,7 @@ :global :d +:todo From 1339e21aa00348ca98ee1aaf59ba5054cc2edf36 Mon Sep 17 00:00:00 2001 From: Flandia Yingman Date: Mon, 10 Mar 2025 15:25:58 +0800 Subject: [PATCH 09/14] Remove sjs from ClassInFun.mls --- .../src/test/mlscript/lifter/ClassInFun.mls | 406 +----------------- 1 file changed, 10 insertions(+), 396 deletions(-) diff --git a/hkmc2/shared/src/test/mlscript/lifter/ClassInFun.mls b/hkmc2/shared/src/test/mlscript/lifter/ClassInFun.mls index 7a5a080646..4ea20794e7 100644 --- a/hkmc2/shared/src/test/mlscript/lifter/ClassInFun.mls +++ b/hkmc2/shared/src/test/mlscript/lifter/ClassInFun.mls @@ -1,9 +1,6 @@ :lift :js -:sjs -//│ JS (unsanitized): -//│ import Predef from "./../../mlscript-compile/Predef.mjs"; // make sure class fields are discriminated properly for immutable captures when supported :effectHandlers :sjs @@ -16,7 +13,7 @@ fun f() = 1 f() + f() + f() //│ JS (unsanitized): -//│ let f, Effect1, tmp, handleBlock$, Cont$func$f$ClassInFun$_mls_L10_95_118$1, Cont$handleBlock$h$1, Handler$h$1, lambda, f$, Cont$func$f$ClassInFun$_mls_L10_95_118$$ctor, Cont$func$f$ClassInFun$_mls_L10_95_118$$, Cont$handleBlock$h$$ctor, Cont$handleBlock$h$$, lambda$; +//│ let f, Effect1, tmp, handleBlock$, Cont$func$f$ClassInFun$_mls_L9_95_118$1, Cont$handleBlock$h$1, Handler$h$1, lambda, f$, Cont$func$f$ClassInFun$_mls_L9_95_118$$ctor, Cont$func$f$ClassInFun$_mls_L9_95_118$$, Cont$handleBlock$h$$ctor, Cont$handleBlock$h$$, lambda$; //│ Effect1 = class Effect { //│ constructor() {} //│ toString() { return "Effect"; } @@ -126,24 +123,24 @@ f() + f() + f() //│ } //│ toString() { return "Cont$handleBlock$h$(" + globalThis.Predef.render(this.pc) + ")"; } //│ }; -//│ Cont$func$f$ClassInFun$_mls_L10_95_118$$ = function Cont$func$f$ClassInFun$_mls_L10_95_118$$(h$0, tmp$1, pc) { +//│ Cont$func$f$ClassInFun$_mls_L9_95_118$$ = function Cont$func$f$ClassInFun$_mls_L9_95_118$$(h$0, tmp$1, pc) { //│ let tmp1; -//│ tmp1 = new Cont$func$f$ClassInFun$_mls_L10_95_118$1.class(pc); +//│ tmp1 = new Cont$func$f$ClassInFun$_mls_L9_95_118$1.class(pc); //│ return tmp1(h$0, tmp$1) //│ }; -//│ Cont$func$f$ClassInFun$_mls_L10_95_118$$ctor = function Cont$func$f$ClassInFun$_mls_L10_95_118$$ctor(h$0, tmp$1) { +//│ Cont$func$f$ClassInFun$_mls_L9_95_118$$ctor = function Cont$func$f$ClassInFun$_mls_L9_95_118$$ctor(h$0, tmp$1) { //│ return (pc) => { //│ let tmp1; -//│ tmp1 = new Cont$func$f$ClassInFun$_mls_L10_95_118$1.class(pc); +//│ tmp1 = new Cont$func$f$ClassInFun$_mls_L9_95_118$1.class(pc); //│ return tmp1(h$0, tmp$1) //│ } //│ }; -//│ Cont$func$f$ClassInFun$_mls_L10_95_118$1 = function Cont$func$f$ClassInFun$_mls_L10_95_118$(pc1) { +//│ Cont$func$f$ClassInFun$_mls_L9_95_118$1 = function Cont$func$f$ClassInFun$_mls_L9_95_118$(pc1) { //│ return (h$01, tmp$11) => { -//│ return new Cont$func$f$ClassInFun$_mls_L10_95_118$.class(pc1)(h$01, tmp$11); +//│ return new Cont$func$f$ClassInFun$_mls_L9_95_118$.class(pc1)(h$01, tmp$11); //│ } //│ }; -//│ Cont$func$f$ClassInFun$_mls_L10_95_118$1.class = class Cont$func$f$ClassInFun$_mls_L10_95_118$ extends runtime.FunctionContFrame.class { +//│ Cont$func$f$ClassInFun$_mls_L9_95_118$1.class = class Cont$func$f$ClassInFun$_mls_L9_95_118$ extends runtime.FunctionContFrame.class { //│ constructor(pc) { //│ return (h$0, tmp$1) => { //│ let tmp1; @@ -175,13 +172,13 @@ f() + f() + f() //│ break; //│ } //│ } -//│ toString() { return "Cont$func$f$ClassInFun$_mls_L10_95_118$(" + globalThis.Predef.render(this.pc) + ")"; } +//│ toString() { return "Cont$func$f$ClassInFun$_mls_L9_95_118$(" + globalThis.Predef.render(this.pc) + ")"; } //│ }; //│ f$ = function f$(h) { //│ let tmp1; //│ tmp1 = runtime.safeCall(h.perform()); //│ if (tmp1 instanceof runtime.EffectSig.class) { -//│ tmp1.contTrace.last.next = Cont$func$f$ClassInFun$_mls_L10_95_118$$(h, tmp1, 0); +//│ tmp1.contTrace.last.next = Cont$func$f$ClassInFun$_mls_L9_95_118$$(h, tmp1, 0); //│ tmp1.contTrace.last = tmp1.contTrace.last.next; //│ return tmp1 //│ } @@ -349,65 +346,6 @@ fun f(used1, unused1) = fun get() = used1 new Test(unused1) f(1, 2).get() -//│ JS (unsanitized): -//│ let h1, Test5, g1, f3, tmp3, Test$ctor2, Test$2, g$1, h$1; -//│ h$1 = function h$(used3) { -//│ return used3 -//│ }; -//│ h1 = function h(used3) { -//│ return () => { -//│ return h$1(used3) -//│ } -//│ }; -//│ g$1 = function g$(used1, g_arg) { -//│ let used3, tmp4; -//│ used3 = 2; -//│ tmp4 = h$1(used3); -//│ return used1 + tmp4 -//│ }; -//│ g1 = function g(used1) { -//│ return (g_arg) => { -//│ return g$1(used1, g_arg) -//│ } -//│ }; -//│ Test$2 = function Test$(used1$0, a) { -//│ let tmp4; -//│ tmp4 = new Test5.class(a); -//│ return tmp4(used1$0) -//│ }; -//│ Test$ctor2 = function Test$ctor(used1$0) { -//│ return (a) => { -//│ let tmp4; -//│ tmp4 = new Test5.class(a); -//│ return tmp4(used1$0) -//│ } -//│ }; -//│ Test5 = function Test(a1) { -//│ return (used1$01) => { -//│ return new Test.class(a1)(used1$01); -//│ } -//│ }; -//│ Test5.class = class Test4 { -//│ #a; -//│ constructor(a) { -//│ return (used1$0) => { -//│ this.used1$0 = used1$0; -//│ this.#a = a; -//│ return this; -//│ } -//│ } -//│ get() { -//│ return this.used1$0 -//│ } -//│ toString() { return "Test(" + "" + ")"; } -//│ }; -//│ f3 = function f(used1, unused1) { -//│ let unused2; -//│ unused2 = 2; -//│ return Test$2(used1, unused1) -//│ }; -//│ tmp3 = f3(1, 2); -//│ runtime.safeCall(tmp3.get()) //│ = 1 :sjs @@ -656,33 +594,6 @@ class A(a) with fun g() = x g() A(2).f() -//│ JS (unsanitized): -//│ let g3, A3, tmp6, g$3; -//│ g$3 = function g$(A$instance) { -//│ return A$instance.x -//│ }; -//│ g3 = function g(A$instance) { -//│ return () => { -//│ return g$3(A$instance) -//│ } -//│ }; -//│ A3 = function A(a1) { -//│ return new A.class(a1); -//│ }; -//│ A3.class = class A2 { -//│ #a; -//│ #x; -//│ constructor(a) { -//│ this.#a = a; -//│ this.#x = 2; -//│ } -//│ f() { -//│ return g$3(this) -//│ } -//│ toString() { return "A(" + "" + ")"; } -//│ }; -//│ tmp6 = A3(2); -//│ runtime.safeCall(tmp6.f()) //│ ═══[RUNTIME ERROR] Error: MLscript call unexpectedly returned `undefined`, the forbidden value. //│ ═══[RUNTIME ERROR] Expected: '2', got: 'undefined' @@ -700,67 +611,6 @@ a.foo() let b = a.newA() b.foo() a.getX() -//│ JS (unsanitized): -//│ let A5, f7, a, b, tmp7, tmp8, tmp9, tmp10, A$ctor1, A$1, f$capture5; -//│ A$1 = function A$(f$capture$0) { -//│ let tmp11; -//│ tmp11 = new A5.class(); -//│ return tmp11(f$capture$0) -//│ }; -//│ A$ctor1 = function A$ctor(f$capture$0) { -//│ return () => { -//│ let tmp11; -//│ tmp11 = new A5.class(); -//│ return tmp11(f$capture$0) -//│ } -//│ }; -//│ A5 = function A() { -//│ return (f$capture$01) => { -//│ return new A.class()(f$capture$01); -//│ } -//│ }; -//│ A5.class = class A4 { -//│ constructor() { -//│ return (f$capture$0) => { -//│ this.f$capture$0 = f$capture$0; -//│ return this; -//│ } -//│ } -//│ newA() { -//│ return A$1(this.f$capture$0) -//│ } -//│ foo() { -//│ let tmp11; -//│ tmp11 = this.f$capture$0.x0$ + 1; -//│ this.f$capture$0.x0$ = tmp11; -//│ return this.f$capture$0.x0$ -//│ } -//│ getX() { -//│ return this.f$capture$0.x0$ -//│ } -//│ toString() { return "A(" + "" + ")"; } -//│ }; -//│ f$capture5 = function f$capture(x0$1) { -//│ return new f$capture.class(x0$1); -//│ }; -//│ f$capture5.class = class f$capture4 { -//│ constructor(x0$) { -//│ this.x0$ = x0$; -//│ } -//│ toString() { return "f$capture(" + globalThis.Predef.render(this.x0$) + ")"; } -//│ }; -//│ f7 = function f(x) { -//│ let capture; -//│ capture = new f$capture5(x); -//│ return A$1(capture) -//│ }; -//│ tmp7 = f7(0); -//│ a = tmp7; -//│ tmp8 = runtime.safeCall(a.foo()); -//│ tmp9 = runtime.safeCall(a.newA()); -//│ b = tmp9; -//│ tmp10 = runtime.safeCall(b.foo()); -//│ runtime.safeCall(a.getX()) //│ = 2 //│ a = A() //│ b = A() @@ -774,187 +624,6 @@ fun sum(n) = else n + sum(n - 1) sum(100) -//│ JS (unsanitized): -//│ let sum, res, Cont$func$sum$ClassInFun$_mls_L772_4_57$1, handleBlock$1, Cont$handleBlock$stackHandler$1, StackDelay$1, lambda1, Cont$func$sum$ClassInFun$_mls_L772_4_57$$ctor, Cont$func$sum$ClassInFun$_mls_L772_4_57$$, Cont$handleBlock$stackHandler$$ctor, Cont$handleBlock$stackHandler$$, lambda$1; -//│ Cont$func$sum$ClassInFun$_mls_L772_4_57$$ = function Cont$func$sum$ClassInFun$_mls_L772_4_57$$(n$0, scrut$1, tmp$2, tmp$3, curDepth$4, stackDelayRes$5, pc) { -//│ let tmp11; -//│ tmp11 = new Cont$func$sum$ClassInFun$_mls_L772_4_57$1.class(pc); -//│ return tmp11(n$0, scrut$1, tmp$2, tmp$3, curDepth$4, stackDelayRes$5) -//│ }; -//│ Cont$func$sum$ClassInFun$_mls_L772_4_57$$ctor = function Cont$func$sum$ClassInFun$_mls_L772_4_57$$ctor(n$0, scrut$1, tmp$2, tmp$3, curDepth$4, stackDelayRes$5) { -//│ return (pc) => { -//│ let tmp11; -//│ tmp11 = new Cont$func$sum$ClassInFun$_mls_L772_4_57$1.class(pc); -//│ return tmp11(n$0, scrut$1, tmp$2, tmp$3, curDepth$4, stackDelayRes$5) -//│ } -//│ }; -//│ Cont$func$sum$ClassInFun$_mls_L772_4_57$1 = function Cont$func$sum$ClassInFun$_mls_L772_4_57$(pc1) { -//│ return (n$01, scrut$11, tmp$21, tmp$31, curDepth$41, stackDelayRes$51) => { -//│ return new Cont$func$sum$ClassInFun$_mls_L772_4_57$.class(pc1)(n$01, scrut$11, tmp$21, tmp$31, curDepth$41, stackDelayRes$51); -//│ } -//│ }; -//│ Cont$func$sum$ClassInFun$_mls_L772_4_57$1.class = class Cont$func$sum$ClassInFun$_mls_L772_4_57$ extends runtime.FunctionContFrame.class { -//│ constructor(pc) { -//│ return (n$0, scrut$1, tmp$2, tmp$3, curDepth$4, stackDelayRes$5) => { -//│ let tmp11; -//│ tmp11 = super(null); -//│ this.n$0 = n$0; -//│ this.scrut$1 = scrut$1; -//│ this.tmp$2 = tmp$2; -//│ this.tmp$3 = tmp$3; -//│ this.curDepth$4 = curDepth$4; -//│ this.stackDelayRes$5 = stackDelayRes$5; -//│ this.pc = pc; -//│ return this; -//│ } -//│ } -//│ resume(value$) { -//│ if (this.pc === 0) { -//│ this.stackDelayRes$5 = value$; -//│ } else if (this.pc === 1) { -//│ this.tmp$3 = value$; -//│ } -//│ contLoop: while (true) { -//│ if (this.pc === 0) { -//│ this.scrut$1 = this.n$0 == 0; -//│ if (this.scrut$1 === true) { -//│ return 0 -//│ } else { -//│ this.tmp$2 = this.n$0 - 1; -//│ this.pc = 3; -//│ continue contLoop; -//│ } -//│ this.pc = 2; -//│ continue contLoop; -//│ } else if (this.pc === 2) { -//│ break contLoop; -//│ } else if (this.pc === 3) { -//│ runtime.stackDepth = runtime.stackDepth + 1; -//│ this.tmp$3 = sum(this.tmp$2); -//│ if (this.tmp$3 instanceof runtime.EffectSig.class) { -//│ this.pc = 1; -//│ this.tmp$3.contTrace.last.next = this; -//│ this.tmp$3.contTrace.last = this; -//│ return this.tmp$3 -//│ } -//│ this.pc = 1; -//│ continue contLoop; -//│ } else if (this.pc === 1) { -//│ this.tmp$3 = runtime.resetDepth(this.tmp$3, this.curDepth$4); -//│ return this.n$0 + this.tmp$3 -//│ } -//│ break; -//│ } -//│ } -//│ toString() { return "Cont$func$sum$ClassInFun$_mls_L772_4_57$(" + globalThis.Predef.render(this.pc) + ")"; } -//│ }; -//│ sum = function sum(n) { -//│ let scrut, tmp11, tmp12, curDepth, stackDelayRes; -//│ curDepth = runtime.stackDepth; -//│ stackDelayRes = runtime.checkDepth(); -//│ if (stackDelayRes instanceof runtime.EffectSig.class) { -//│ stackDelayRes.contTrace.last.next = Cont$func$sum$ClassInFun$_mls_L772_4_57$$(n, scrut, tmp11, tmp12, curDepth, stackDelayRes, 0); -//│ stackDelayRes.contTrace.last = stackDelayRes.contTrace.last.next; -//│ return stackDelayRes -//│ } -//│ scrut = n == 0; -//│ if (scrut === true) { -//│ return 0 -//│ } else { -//│ tmp11 = n - 1; -//│ runtime.stackDepth = runtime.stackDepth + 1; -//│ tmp12 = sum(tmp11); -//│ if (tmp12 instanceof runtime.EffectSig.class) { -//│ tmp12.contTrace.last.next = Cont$func$sum$ClassInFun$_mls_L772_4_57$$(n, scrut, tmp11, tmp12, curDepth, stackDelayRes, 1); -//│ tmp12.contTrace.last = tmp12.contTrace.last.next; -//│ return tmp12 -//│ } -//│ tmp12 = runtime.resetDepth(tmp12, curDepth); -//│ return n + tmp12 -//│ } -//│ }; -//│ lambda$1 = function lambda$(StackDelay$$instance, resume) { -//│ runtime.stackOffset = runtime.stackDepth; -//│ return resume() -//│ }; -//│ lambda1 = (undefined, function (StackDelay$$instance) { -//│ return (resume) => { -//│ return lambda$1(StackDelay$$instance, resume) -//│ } -//│ }); -//│ StackDelay$1 = class StackDelay$ extends runtime.StackDelay { -//│ constructor() { -//│ let tmp11; -//│ tmp11 = super(); -//│ } -//│ perform() { -//│ let lambda$this; -//│ lambda$this = runtime.safeCall(lambda1(this)); -//│ return runtime.mkEffect(this, lambda$this) -//│ } -//│ toString() { return "StackDelay$"; } -//│ }; -//│ Cont$handleBlock$stackHandler$$ = function Cont$handleBlock$stackHandler$$(res$0, pc) { -//│ let tmp11; -//│ tmp11 = new Cont$handleBlock$stackHandler$1.class(pc); -//│ return tmp11(res$0) -//│ }; -//│ Cont$handleBlock$stackHandler$$ctor = function Cont$handleBlock$stackHandler$$ctor(res$0) { -//│ return (pc) => { -//│ let tmp11; -//│ tmp11 = new Cont$handleBlock$stackHandler$1.class(pc); -//│ return tmp11(res$0) -//│ } -//│ }; -//│ Cont$handleBlock$stackHandler$1 = function Cont$handleBlock$stackHandler$(pc1) { -//│ return (res$01) => { -//│ return new Cont$handleBlock$stackHandler$.class(pc1)(res$01); -//│ } -//│ }; -//│ Cont$handleBlock$stackHandler$1.class = class Cont$handleBlock$stackHandler$ extends runtime.FunctionContFrame.class { -//│ constructor(pc) { -//│ return (res$0) => { -//│ let tmp11; -//│ tmp11 = super(null); -//│ this.res$0 = res$0; -//│ this.pc = pc; -//│ return this; -//│ } -//│ } -//│ resume(value$) { -//│ if (this.pc === 4) { -//│ this.res$0 = value$; -//│ } -//│ contLoop: while (true) { -//│ if (this.pc === 4) { -//│ return this.res$0 -//│ } -//│ break; -//│ } -//│ } -//│ toString() { return "Cont$handleBlock$stackHandler$(" + globalThis.Predef.render(this.pc) + ")"; } -//│ }; -//│ handleBlock$1 = function handleBlock$() { -//│ let stackHandler, res1; -//│ stackHandler = new StackDelay$1(); -//│ runtime.stackLimit = 10; -//│ runtime.stackOffset = 0; -//│ runtime.stackDepth = 1; -//│ runtime.stackHandler = stackHandler; -//│ res1 = sum(100); -//│ if (res1 instanceof runtime.EffectSig.class) { -//│ res1.contTrace.last.next = Cont$handleBlock$stackHandler$$(res1, 4); -//│ return runtime.handleBlockImpl(res1, stackHandler) -//│ } -//│ return res1 -//│ }; -//│ res = handleBlock$1(); -//│ if (res instanceof runtime.EffectSig.class) { -//│ throw new this.Error("Unhandled effects"); -//│ } -//│ runtime.stackDepth = 0; -//│ runtime.stackHandler = null; -//│ res //│ = 5050 // instance checks @@ -967,37 +636,6 @@ fun f() = foo()(0) f().get() //│ ═══[WARNING] Cannot yet lift class `Test` as it is used as a first-class class. -//│ JS (unsanitized): -//│ let foo, f8, tmp11, foo$; -//│ foo$ = function foo$(Test$member) { -//│ return Test$member -//│ }; -//│ foo = function foo(Test$member) { -//│ return () => { -//│ return foo$(Test$member) -//│ } -//│ }; -//│ f8 = function f() { -//│ let Test9, tmp12; -//│ Test9 = function Test(a2) { -//│ return new Test.class(a2); -//│ }; -//│ Test9.class = class Test8 { -//│ #a; -//│ constructor(a1) { -//│ this.#a = a1; -//│ } -//│ get() { -//│ return this.a -//│ } -//│ toString() { return "Test(" + "" + ")"; } -//│ }; -//│ tmp12 = foo$(Test9); -//│ return runtime.safeCall(tmp12(0)) -//│ }; -//│ tmp11 = f8(); -//│ runtime.safeCall(tmp11.get()) -//│ ═══[WARNING] Cannot yet lift class `Test` as it is used as a first-class class. :sjs :lift @@ -1048,28 +686,4 @@ fun test() = class B() extends A B().get test() -//│ JS (unsanitized): -//│ let A7, B1, test; -//│ A7 = class A6 { -//│ constructor() {} -//│ get get() { -//│ return 2; -//│ } -//│ toString() { return "A"; } -//│ }; -//│ B1 = function B() { -//│ return new B.class(); -//│ }; -//│ B1.class = class B extends A7 { -//│ constructor() { -//│ super(); -//│ } -//│ toString() { return "B(" + "" + ")"; } -//│ }; -//│ test = function test() { -//│ let tmp13; -//│ tmp13 = B1(); -//│ return tmp13.get -//│ }; -//│ test() //│ = 2 From 61297e594bffe7e8f4e30d23f9a9f801ffb182b2 Mon Sep 17 00:00:00 2001 From: Flandia Yingman Date: Mon, 10 Mar 2025 15:42:00 +0800 Subject: [PATCH 10/14] Update Lifter.scala documentation and type definitions for local capture symbols --- .../src/main/scala/hkmc2/codegen/Lifter.scala | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/hkmc2/shared/src/main/scala/hkmc2/codegen/Lifter.scala b/hkmc2/shared/src/main/scala/hkmc2/codegen/Lifter.scala index 0085eeda42..fc5d35f71f 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/codegen/Lifter.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/codegen/Lifter.scala @@ -132,7 +132,8 @@ class Lifter(handlerPaths: Opt[HandlerPaths])(using State, Raise): * @param ignoredDefns The definitions which must not be lifted. * @param inScopeDefns Definitions which are in scope to another definition (excluding itself and its nested definitions). * @param modLocals A map from the modules and objects to the local to which it is instantiated after lifting. - * @param localCaptureSyms The symbols in a capture corresponding to a particular local + * @param localCaptureSyms The symbols in a capture corresponding to a particular local. + * The `VarSymbol` is the parameter in the capture class, and the `BlockMemberSymbol` is the field in the class. * @param prevFnLocals Locals belonging to function definitions that have already been traversed * @param prevClsDefns Class definitions that have already been traversed, excluding modules * @param curModules Modules that that we are currently nested in (cleared if we are lifted out) @@ -152,7 +153,7 @@ class Lifter(handlerPaths: Opt[HandlerPaths])(using State, Raise): val ignoredDefns: Set[BlockMemberSymbol] = Set.empty, val inScopeDefns: Map[BlockMemberSymbol, Set[BlockMemberSymbol]] = Map.empty, val modLocals: Map[BlockMemberSymbol, Local] = Map.empty, - val localCaptureSyms: Map[Local, (VarSymbol, TermDefinition)] = Map.empty, + val localCaptureSyms: Map[Local, (VarSymbol, BlockMemberSymbol)] = Map.empty, val prevFnLocals: FreeVars = FreeVars.empty, val prevClsDefns: List[ClsLikeDefn] = Nil, val curModules: List[ClsLikeDefn] = Nil, @@ -186,7 +187,7 @@ class Lifter(handlerPaths: Opt[HandlerPaths])(using State, Raise): def withInScopes(mp: Map[BlockMemberSymbol, Set[BlockMemberSymbol]]) = copy(inScopeDefns = mp) def addFnLocals(f: FreeVars) = copy(prevFnLocals = prevFnLocals ++ f) def addClsDefn(c: ClsLikeDefn) = copy(prevClsDefns = c :: prevClsDefns) - def addLocalCaptureSyms(m: Map[Local, (VarSymbol, TermDefinition)]) = copy(localCaptureSyms = localCaptureSyms ++ m) + def addLocalCaptureSyms(m: Map[Local, (VarSymbol, BlockMemberSymbol)]) = copy(localCaptureSyms = localCaptureSyms ++ m) def getBmsReqdInfo(sym: BlockMemberSymbol) = bmsReqdInfo.get(sym) def replCapturePaths(paths: Map[BlockMemberSymbol, Path]) = copy(capturePaths = paths) def addCapturePath(src: BlockMemberSymbol, path: Path) = copy(capturePaths = capturePaths + (src -> path)) @@ -218,7 +219,8 @@ class Lifter(handlerPaths: Opt[HandlerPaths])(using State, Raise): * @param f The function to create the capture class for. * @param ctx The lifter context. Determines which variables will be captured. * @return The triple (defn, varsMap, varsList), where `defn` is the capture class's definition, - * `varsMap` maps the function's locals to the correpsonding `VarSymbol` in the class, and + * `varsMap` maps the function's locals to the correpsonding `VarSymbol` (for the class parameters) + * and `BlockLocalSymbol` (for the class fields) in the class, and * `varsList` specifies the order of these variables in the class's constructor. */ def createCaptureCls(f: FunDefn, ctx: LifterCtx) = @@ -267,7 +269,7 @@ class Lifter(handlerPaths: Opt[HandlerPaths])(using State, Raise): p )), Nil, None, Nil, Nil, - varsList.map(varsMap(_)._2), + varsList.map(varsMap(_)._2), // varsList.map(varsMap(_)).foldLeft[Block](End()): case (acc, (varSym, fldDef)) => AssignField( @@ -280,7 +282,7 @@ class Lifter(handlerPaths: Opt[HandlerPaths])(using State, Raise): End() ) - (defn, varsMap, varsList) + (defn, varsMap.mapValues(_.mapSecond(_.sym)).toMap, varsList) private val innerSymCache: MutMap[Local, Set[Local]] = MutMap.empty From f20ca699b34ae05eba3b1c3c7b57c99fb45d56e2 Mon Sep 17 00:00:00 2001 From: Flandia Yingman Date: Mon, 10 Mar 2025 15:45:15 +0800 Subject: [PATCH 11/14] Add one more data class in ClassInFun.mls --- hkmc2/shared/src/test/mlscript/lifter/ClassInFun.mls | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/hkmc2/shared/src/test/mlscript/lifter/ClassInFun.mls b/hkmc2/shared/src/test/mlscript/lifter/ClassInFun.mls index d43d7b739b..37bd126bd6 100644 --- a/hkmc2/shared/src/test/mlscript/lifter/ClassInFun.mls +++ b/hkmc2/shared/src/test/mlscript/lifter/ClassInFun.mls @@ -270,7 +270,7 @@ fun f(used1, unused1) = fun h = used3 used1 + h let unused2 = 2 - class Test(a) with + data class Test(a) with fun get() = used1 Test(unused1) f(1, 2).get() @@ -313,18 +313,17 @@ f(1, 2).get() //│ } //│ }; //│ Test3.class = class Test2 { -//│ #a; //│ constructor(a) { //│ return (used1$0) => { //│ this.used1$0 = used1$0; -//│ this.#a = a; +//│ this.a = a; //│ return this; //│ } //│ } //│ get() { //│ return this.used1$0 //│ } -//│ toString() { return "Test(" + "" + ")"; } +//│ toString() { return "Test(" + globalThis.Predef.render(this.a) + ")"; } //│ }; //│ f2 = function f(used1, unused1) { //│ let unused2; From 865486ae32e600ce23afc4777cb93dda1cf977b6 Mon Sep 17 00:00:00 2001 From: Flandia Yingman Date: Mon, 10 Mar 2025 15:46:37 +0800 Subject: [PATCH 12/14] Remove unused statement --- hkmc2/shared/src/main/scala/hkmc2/semantics/Elaborator.scala | 1 - 1 file changed, 1 deletion(-) diff --git a/hkmc2/shared/src/main/scala/hkmc2/semantics/Elaborator.scala b/hkmc2/shared/src/main/scala/hkmc2/semantics/Elaborator.scala index 7fe5b3e4e5..239871ddb8 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/semantics/Elaborator.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/semantics/Elaborator.scala @@ -1160,7 +1160,6 @@ extends Importer: ) ++ fields.fold(Nil)(_.collect: case d: LetDecl => d.sym.nme -> d.sym // class params ) - val ctxWithLets = ctx val (blk, c) = fn(using ctxWithFields) val blkWithFields = fields.fold[Term.Blk](blk)(fs => blk.copy(stats = fs ::: blk.stats)) (blkWithFields, c) From 9431b9e70fc285d889bef04a862cd70a361cecd1 Mon Sep 17 00:00:00 2001 From: Flandia Yingman Date: Mon, 10 Mar 2025 16:16:34 +0800 Subject: [PATCH 13/14] Remove funny characters --- hkmc2/shared/src/main/scala/hkmc2/codegen/Lifter.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hkmc2/shared/src/main/scala/hkmc2/codegen/Lifter.scala b/hkmc2/shared/src/main/scala/hkmc2/codegen/Lifter.scala index fc5d35f71f..ccf2d7f432 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/codegen/Lifter.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/codegen/Lifter.scala @@ -269,7 +269,7 @@ class Lifter(handlerPaths: Opt[HandlerPaths])(using State, Raise): p )), Nil, None, Nil, Nil, - varsList.map(varsMap(_)._2), // + varsList.map(varsMap(_)._2), varsList.map(varsMap(_)).foldLeft[Block](End()): case (acc, (varSym, fldDef)) => AssignField( From 7dfbd5d3ec57b28d363ec9b830eaed480fe793b5 Mon Sep 17 00:00:00 2001 From: Flandia Yingman Date: Mon, 10 Mar 2025 16:17:44 +0800 Subject: [PATCH 14/14] Change funny method call of `Map` --- hkmc2/shared/src/main/scala/hkmc2/codegen/Lifter.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hkmc2/shared/src/main/scala/hkmc2/codegen/Lifter.scala b/hkmc2/shared/src/main/scala/hkmc2/codegen/Lifter.scala index ccf2d7f432..df585c1e53 100644 --- a/hkmc2/shared/src/main/scala/hkmc2/codegen/Lifter.scala +++ b/hkmc2/shared/src/main/scala/hkmc2/codegen/Lifter.scala @@ -282,7 +282,7 @@ class Lifter(handlerPaths: Opt[HandlerPaths])(using State, Raise): End() ) - (defn, varsMap.mapValues(_.mapSecond(_.sym)).toMap, varsList) + (defn, varsMap.view.mapValues(_.mapSecond(_.sym)).toMap, varsList) private val innerSymCache: MutMap[Local, Set[Local]] = MutMap.empty