Skip to content

Commit

Permalink
Enhance metalang module
Browse files Browse the repository at this point in the history
  • Loading branch information
julianpeeters committed Nov 22, 2024
1 parent 5d1f56a commit 64b9c89
Show file tree
Hide file tree
Showing 11 changed files with 480 additions and 90 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,42 @@ package dc10.scala.metalang

import cats.data.StateT
import dc10.scala.{ErrorF, LibDep, Statement, compiler}
import dc10.scala.Statement.TypeExpr.`Type`
import dc10.scala.Statement.TypeExpr.{`Type`, `Type[_]`, `Type[_[_], _]`}
import dc10.scala.Statement.ValueExpr.{`Value`, `Value[_[_], _]`}
import dc10.scala.Symbol.Term
// import dc10.scala.Symbol.Term.ValueLevel.Var.`UserDefinedValue[_[_], _]`

trait `dc10-scala`[F[_]]:
def TYPEEXPR[G[_], A](targ: F[`Type`[A]]): F[`Type`[G[A]]]
def ERRORF: F[`Type[_]`[ErrorF]]
def LIBDEP: F[`Type`[LibDep]]
def STATEMENT: F[`Type`[Statement]]
def `TYPEEXPR`[G[_], A](targ: F[`Type`[A]]): F[`Type`[G[A]]]
@scala.annotation.targetName("_[_[_], _]")
def `TYPEEXPR`[G[_[_[_], _]], H[_[_], _]](targ: F[`Type[_[_], _]`[H]]): F[`Type`[G[H]]]
// @scala.annotation.targetName("Value[_[_], _]")
// def `TYPEEXPR`[G[_[_[_], _]], T[_[_], _]](arg: F[`Value[_[_], _]`[T]]): F[`Value`[G[T]]]
def `TYPEEXPR[_]`[G[_[_]], H[_]](targ: F[`Type[_]`[H]]): F[`Type`[G[H]]]
def USERDEFINEDTYPE[T](nme: String): F[`Value`[T]]
@scala.annotation.targetName("UserDefinedType[_[_], _]")
def USERDEFINEDTYPE[G[_[_], _]](nme: String): F[`Value[_[_], _]`[G]]
def VALUEEXPR[G[_], A](targ: F[`Type`[A]]): F[`Type`[G[A]]]

object `dc10-scala`:

val lib: LibDep = LibDep(BuildInfo.organization, BuildInfo.name, BuildInfo.version)

trait Mixins extends `dc10-scala`[StateT[ErrorF, (Set[LibDep], List[Statement]), _]]:

def TYPEEXPR[G[_], A](
def ERRORF: StateT[ErrorF, (Set[LibDep], List[Statement]), `Type[_]`[ErrorF]] =
StateT.pure(`Type[_]`(Term.TypeLevel.Var.`UserDefinedType[_]`[ErrorF]("dc10.scala.ErrorF", None)))

def LIBDEP: StateT[ErrorF, (Set[LibDep], List[Statement]), `Type`[LibDep]] =
StateT.pure(`Type`(Term.TypeLevel.Var.`UserDefinedType`[LibDep]("dc10.scala.LibDep", None)))

def STATEMENT: StateT[ErrorF, (Set[LibDep], List[Statement]), `Type`[Statement]] =
StateT.pure(`Type`(Term.TypeLevel.Var.`UserDefinedType`[Statement]("dc10.scala.Statement", None)))

def `TYPEEXPR`[G[_], A](
targ: StateT[ErrorF, (Set[LibDep], List[Statement]), `Type`[A]]
): StateT[ErrorF, (Set[LibDep], List[Statement]), `Type`[G[A]]] =
for
Expand All @@ -26,4 +49,102 @@ object `dc10-scala`:
a.tpe
)
)

@scala.annotation.targetName("_[_[_], _]")
def `TYPEEXPR`[G[_[_[_], _]], H[_[_], _]](
targ: StateT[ErrorF, (Set[LibDep], List[Statement]), `Type[_[_], _]`[H]]
): StateT[ErrorF, (Set[LibDep], List[Statement]), `Type`[G[H]]] =
for
a <- targ
_ <- StateT.modifyF[ErrorF, (Set[LibDep], List[Statement])](ctx => ctx.dep(`dc10-scala`.lib))
yield Type(
Term.TypeLevel.App.`App[_[_[_], _]]`(
Term.TypeLevel.Var.`UserDefinedType[_[_[_], _]]`("dc10.scala.Statement.TypeExpr.`Type[_[_], _]`", None),
a.tpe
)
)

// @scala.annotation.targetName("Value[_[_], _]")
// def `TYPEEXPR`[G[_[_[_], _]], T[_[_], _]](
// arg: StateT[ErrorF, (Set[LibDep], List[Statement]), `Value[_[_], _]`[T]]
// ): StateT[ErrorF, (Set[LibDep], List[Statement]), `Value`[G[T]]] =
// for
// a <- arg
// // f <- a ==> a
// _ <- StateT.modifyF[ErrorF, (Set[LibDep], List[Statement])](ctx => ctx.dep(`dc10-scala`.lib))
// yield `Value`[G[T]](
// // Term.ValueLevel.App.`App1`(
// Term.ValueLevel.Var.`UserDefinedValue`[G[T]]("dc10.scala.Statement.TypeExpr.`Type[_[_], _]`",
// a.value match
// case `UserDefinedValue[_[_], _]`(nme, tpe, impl) => tpe
// , None)
// // )
// )



// @scala.annotation.targetName("[_[_], _]")
// def `TYPEEXPR`[G[_[_[_], _]], A[_[_], _]](targ: StateT[ErrorF, (Set[LibDep], List[Statement]), `Type[_[_], _]`[A]]): StateT[ErrorF, (Set[LibDep], List[Statement]), `Type`[G[A]]] =
// for
// a <- targ
// _ <- StateT.modifyF[ErrorF, (Set[LibDep], List[Statement])](ctx => ctx.dep(`dc10-scala`.lib))
// yield Type(
// Term.TypeLevel.App.`App[_[_[_], _]]`(
// Term.TypeLevel.Var.`UserDefinedType[_[_[_], _]]`("dc10.scala.Statement.TypeExpr.`Type`", None),
// a.tpe
// )
// )

// def `TYPEEXPR`[G[_[_], _]]: StateT[ErrorF, (Set[LibDep], List[Statement]), `Type[_[_], _]`[G]] =
// for
// _ <- StateT.modifyF[ErrorF, (Set[LibDep], List[Statement])](ctx => ctx.dep(`dc10-scala`.lib))
// yield `Type[_[_], _]`(
// Term.TypeLevel.Var.`UserDefinedType[_[_], _]`("dc10.scala.Statement.TypeExpr.`Type[_[_], _]`", None)

// )

def `TYPEEXPR[_]`[G[_[_]], H[_]](
targ: StateT[ErrorF, (Set[LibDep], List[Statement]), `Type[_]`[H]]
): StateT[ErrorF, (Set[LibDep], List[Statement]), `Type`[G[H]]] =
for
a <- targ
_ <- StateT.modifyF[ErrorF, (Set[LibDep], List[Statement])](ctx => ctx.dep(`dc10-scala`.lib))
yield Type(
Term.TypeLevel.App.`App[_[_]]`(
Term.TypeLevel.Var.`UserDefinedType[_[_]]`("dc10.scala.Statement.TypeExpr.`Type[_]`", None),
a.tpe
)
)

def USERDEFINEDTYPE[T](nme: String): StateT[ErrorF, (Set[LibDep], List[Statement]), `Value`[T]] =
StateT.pure(`Value`(
Term.ValueLevel.Var.UserDefinedValue(
nme,
Term.TypeLevel.Var.`UserDefinedType`[T](nme, None),
None
)
))

@scala.annotation.targetName("UserDefinedType[_[_], _]")
def USERDEFINEDTYPE[G[_[_], _]](nme: String): StateT[ErrorF, (Set[LibDep], List[Statement]), `Value[_[_], _]`[G]] =
StateT.pure(`Value[_[_], _]`(
Term.ValueLevel.Var.`UserDefinedValue[_[_], _]`[G](
nme,
Term.TypeLevel.Var.`UserDefinedType[_[_], _]`("dc10.scala.Symbol.Term.TypeLevel.Var.UserDefinedType[_[_], _]", None),
None
)
))

def VALUEEXPR[G[_], A](
targ: StateT[ErrorF, (Set[LibDep], List[Statement]), `Type`[A]]
): StateT[ErrorF, (Set[LibDep], List[Statement]), `Type`[G[A]]] =
for
a <- targ
_ <- StateT.modifyF[ErrorF, (Set[LibDep], List[Statement])](ctx => ctx.dep(`dc10-scala`.lib))
yield Type(
Term.TypeLevel.App.`App[_]`(
Term.TypeLevel.Var.`UserDefinedType[_]`("dc10.scala.Statement.ValueExpr.`Value`", None),
a.tpe
)
)

25 changes: 16 additions & 9 deletions modules/scala/shared/src/main/scala/dc10/scala/Statement.scala
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
package dc10.scala

import cats.data.NonEmptyList
import dc10.scala.Symbol.{CaseClass, Extension, Object, Package, Trait}
import dc10.scala.Symbol.{CaseClass, Extension, Package, Trait}
import dc10.scala.Symbol.Term.{TypeLevel, ValueLevel}
import dc10.scala.Statement.ValueExpr.Value
import dc10.scala.Statement.TypeExpr.Type

sealed trait Statement
object Statement:

case class `case class`[T](indent: Int, caseclass: CaseClass[T]) extends Statement
case class `extension`(indent: Int, extension: Extension) extends Statement
case class `object`[T](indent: Int, obj: Object[T]) extends Statement
case class `object`[T](indent: Int, obj: ValueLevel.Var.UserDefinedObject[T]) extends Statement
case class `package`(indent: Int, pkg: Package) extends Statement

sealed trait TraitDef extends Statement
Expand Down Expand Up @@ -101,7 +103,7 @@ object Statement:
impl: ValueLevel.`*`[G[A]]
) extends ValueDef

case class `val`[K, T](
case class `val`[T](
indent: Int,
value: ValueLevel.Var.`UserDefinedValue`[T],
tpe: TypeLevel.`*`[T]
Expand All @@ -114,22 +116,25 @@ object Statement:
case class `Type[_[_]]`[F[_[_]]](tpe: TypeLevel.`(*->*)->*`[F]) extends TypeExpr
case class `Type[_, _]`[F[_, _]](tpe: TypeLevel.`*->*->*`[F]) extends TypeExpr
case class `Type[_[_], _]`[F[_[_], _]](tpe: TypeLevel.`(*->*)->*->*`[F]) extends TypeExpr
case class `Type[_[_], _, _]`[F[_[_], _, _]](tpe: TypeLevel.`(*->*)->*->*->*`[F]) extends TypeExpr

sealed trait ValueExpr extends Statement
object ValueExpr:
case class Value[T](value: ValueLevel.`*`[T]) extends ValueExpr
case class Value[T](value: ValueLevel.`*`[T]) extends ValueExpr:
def `type`: Type[T] = Type(value.tpe)
case class `Value[_[_], _]`[T[_[_], _]](value: ValueLevel.`(*->*)->*->*`[T]) extends ValueExpr

extension (s: Statement)
def addIndent: Statement =
s match
case d@`case class`(i, c) => `case class`(i + 1, c)
case d@`extension`(i, e) => `extension`(i + 1, e)
case d@`object`(i, obj) => `object`(i + 1, obj)
case d@`object`(i, obj) => `object`(i + 1, obj.copy(body = obj.body.map(s => s.addIndent)))
case d@`package`(i, pkg) => `package`(i + 1, d.pkg)
case d@TraitDef.`trait`(i, t) => TraitDef.`trait`(i + 1, d.`trait`)
case d@TraitDef.`trait[_]`(i, p, t) => TraitDef.`trait[_]`(i + 1, p, t)
case d@TraitDef.`trait[_[_]]`(i, p, t) => TraitDef.`trait[_[_]]`(i + 1, p, d.`trait`)
case d@TraitDef.`trait[_[_], _]`(i, f, a, t) => TraitDef.`trait[_[_], _]`(i + 1, f, a, d.`trait`)
case d@TraitDef.`trait`(i, t) => TraitDef.`trait`(i + 1, d.`trait`.copy(body = d.`trait`.body.map(s => s.addIndent)))
case d@TraitDef.`trait[_]`(i, p, t) => TraitDef.`trait[_]`(i + 1, p, d.`trait`.copy(body = d.`trait`.body.map(s => s.addIndent)))
case d@TraitDef.`trait[_[_]]`(i, p, t) => TraitDef.`trait[_[_]]`(i + 1, p, d.`trait`.copy(body = d.`trait`.body.map(s => s.addIndent)))
case d@TraitDef.`trait[_[_], _]`(i, f, a, t) => TraitDef.`trait[_[_], _]`(i + 1, f, a, d.`trait`.copy(body = d.`trait`.body.map(s => s.addIndent)))
case d@TypeDef.`Alias`(i, tpe) => TypeDef.`Alias`(i + 1, d.tpe)
case d@TypeDef.`Alias[_]=>>`(i, tpe) => TypeDef.`Alias[_]=>>`(i + 1, d.tpe)
case d@TypeDef.`Alias[_]`(i, a, t) => TypeDef.`Alias[_]`(i + 1, d.tparam, d.tpe)
Expand All @@ -148,4 +153,6 @@ object Statement:
case d@TypeExpr.`Type[_[_]]`(_) => d
case d@TypeExpr.`Type[_, _]`(_) => d
case d@TypeExpr.`Type[_[_], _]`(_) => d
case d@TypeExpr.`Type[_[_], _, _]`(_) => d
case d@ValueExpr.`Value`(_) => d
case d@ValueExpr.`Value[_[_], _]`(_) => d
23 changes: 17 additions & 6 deletions modules/scala/shared/src/main/scala/dc10/scala/Symbol.scala
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ object Symbol:

case class CaseClass[T](nme: String, fields: List[Statement], body: List[Statement]) extends Symbol
case class Extension(field: Statement, body: List[Statement]) extends Symbol
case class Object[T](nme: String, parent: Option[TypeLevel.`*`[T]], body: List[Statement]) extends Symbol

sealed trait Package extends Symbol
object Package:
Expand All @@ -16,10 +15,10 @@ object Symbol:

sealed trait Trait extends Symbol
object Trait:
case class `*`[T](nme: String, body: List[Statement]) extends Trait
case class `*->*`[F[_]](nme: String, body: List[Statement]) extends Trait
case class `(*->*)->*`[F[_[_]]](nme: String, body: List[Statement]) extends Trait
case class `(*->*)->*->*`[F[_[_], _]](nme: String, body: List[Statement]) extends Trait
case class `*`[T](nme: String, parent: Option[Term.TypeLevel], body: List[Statement]) extends Trait
case class `*->*`[F[_]](nme: String, parent: Option[Term.TypeLevel], body: List[Statement]) extends Trait
case class `(*->*)->*`[F[_[_]]](nme: String, parent: Option[Term.TypeLevel], body: List[Statement]) extends Trait
case class `(*->*)->*->*`[F[_[_], _]](nme: String, parent: Option[Term.TypeLevel], body: List[Statement]) extends Trait

sealed trait Term extends Symbol
object Term:
Expand All @@ -34,12 +33,17 @@ object Symbol:
sealed trait `*->*->*->*`[T[_, _, _]] extends TypeLevel
sealed trait `(*->*)->*`[T[_[_]]] extends TypeLevel
sealed trait `(*->*)->*->*`[T[_[_], _]] extends TypeLevel
sealed trait `(*->*)->*->*->*`[T[_[_], _, _]] extends TypeLevel
sealed trait `((*->*)->*->*)->*`[T[_[_[_], _]]] extends TypeLevel

object App:
case class `App[_]`[T[_], A](tfun: `*->*`[T], aarg: `*`[A]) extends `*`[T[A]]
case class `App[_[_]]`[T[_[_]], F[_]](tfun: `(*->*)->*`[T], farg: `*->*`[F]) extends `*`[T[F]]
case class `App[_, _]`[T[_,_], A, B](tfun: `*->*->*`[T], ta: `*`[A], tb: `*`[B]) extends `*`[T[A, B]]
case class `App[_[_], _]`[T[_[_], _], F[_], A](tfun: `(*->*)->*->*`[T], farg: `*->*`[F], aarg: `*`[A]) extends `*`[T[F, A]]
case class `App[_, _, _]`[T[_,_,_], A, B, C](tfun: `*->*->*->*`[T], ta1: `*`[A], ta2: `*`[B], tb: `*`[C]) extends `*`[T[A, B, C]]
case class `App[_[_], _, _]`[T[_[_], _, _], F[_], A, B](tfun: `(*->*)->*->*->*`[T], farg: `*->*`[F], aarg: `*`[A], barg: `*`[B]) extends `*`[T[F, A, B]]
case class `App[_[_[_], _]]`[T[_[_[_], _]], F[_[_], _]](tfun: `((*->*)->*->*)->*`[T], arg: `(*->*)->*->*`[F]) extends `*`[T[F]]
case class Infix[T[_,_], A, B](tfun: `*->*->*`[T], ta: `*`[A], tb: `*`[B]) extends `*`[T[A, B]]
case class Infix2[T[_,_,_], A, B, C](tfun: `*->*->*->*`[T], ta: `*`[A], tb: `*`[B], tc: `*`[C]) extends `*`[T[A, B, C]]
object Lam:
Expand All @@ -51,12 +55,15 @@ object Symbol:
case class `UserDefinedType[_, _]`[T[_, _]](nme: String, impl: Option[`*->*->*`[T]]) extends `*->*->*`[T]
case class `UserDefinedType[_[_], _]`[T[_[_], _]](nme: String, impl: Option[`(*->*)->*->*`[T]]) extends `(*->*)->*->*`[T]
case class `UserDefinedType[_, _, _]`[T[_, _, _]](nme: String, impl: Option[`*->*->*->*`[T]]) extends `*->*->*->*`[T]
case class `UserDefinedType[_[_], _, _]`[T[_[_], _, _]](nme: String, impl: Option[`(*->*)->*->*->*`[T]]) extends `(*->*)->*->*->*`[T]
case class `UserDefinedType[_[_[_], _]]`[T[_[_[_], _]]](nme: String, impl: Option[`((*->*)->*->*)->*`[T]]) extends `((*->*)->*->*)->*`[T]

sealed trait ValueLevel extends Term
object ValueLevel:

sealed trait `*`[T] extends ValueLevel
sealed trait `*->*`[T[_]] extends ValueLevel
sealed trait `(*->*)->*->*`[T[_[_], _]] extends ValueLevel

object App:
case class App1[A, B](fun: ValueLevel.`*`[A => B], arg: ValueLevel.`*`[A], tpe: TypeLevel.`*`[B]) extends `*`[B]
Expand All @@ -75,8 +82,10 @@ object Symbol:
case class IntLiteral(tpe: TypeLevel.`*`[Int], i: Int) extends `*`[Int]
case class StringLiteral(tpe: TypeLevel.`*`[String], s: String) extends `*`[String]
case class UnitLiteral(tpe: TypeLevel.`*`[Unit], u: Unit) extends `*`[Unit]
case class `UserDefinedObject`[T](nme: String, tpe: TypeLevel.`*`[T], parent: Option[TypeLevel.`*`[T]], body: List[Statement]) extends `*`[T]
case class `UserDefinedValue`[T](nme: String, tpe: TypeLevel.`*`[T], impl: Option[ValueLevel.`*`[T]]) extends `*`[T]
case class `UserDefinedValue[_]`[T[_]](nme: String, tpe: TypeLevel.`*->*`[T], impl: Option[ValueLevel.`*->*`[T]]) extends `*->*`[T]
case class `UserDefinedValue[_[_], _]`[T[_[_], _]](nme: String, tpe: TypeLevel.`(*->*)->*->*`[T], impl: Option[ValueLevel.`(*->*)->*->*`[T]]) extends `(*->*)->*->*`[T]

extension [T] (v: ValueLevel.`*`[T])
def tpe: TypeLevel.`*`[T] =
Expand All @@ -95,7 +104,8 @@ object Symbol:
case ValueLevel.Var.IntLiteral(tpe, i) => tpe
case ValueLevel.Var.StringLiteral(tpe, s) => tpe
case ValueLevel.Var.UnitLiteral(tpe, u) => tpe
case ValueLevel.Var.`UserDefinedValue`(nme, tpe, impl) => tpe
case ValueLevel.Var.UserDefinedObject(nme, tpe, parent, impl) => parent.fold(tpe)(identity)
case ValueLevel.Var.UserDefinedValue(nme, tpe, impl) => tpe

extension [T] (v: ValueLevel.`*`[T])
def findImpl: Option[ValueLevel.`*`[T]] =
Expand All @@ -114,4 +124,5 @@ object Symbol:
case ValueLevel.Var.IntLiteral(tpe, i) => Some(v)
case ValueLevel.Var.StringLiteral(tpe, s) => Some(v)
case ValueLevel.Var.UnitLiteral(tpe, s) => Some(v)
case ValueLevel.Var.UserDefinedObject(nme, tpe, parent, impl) => Some(v)
case ValueLevel.Var.UserDefinedValue(nme, tpe, impl) => impl.fold(None)(i => i.findImpl)
Loading

0 comments on commit 64b9c89

Please sign in to comment.