core AST
This commit is contained in:
@@ -7,7 +7,8 @@ project(
|
||||
|
||||
rlpc_jar = jar(
|
||||
'rlpc',
|
||||
'src/RLPC.java',
|
||||
main_class: 'RLPC'
|
||||
'rlp/RLPC.java',
|
||||
'rlp/Core.java',
|
||||
main_class: 'rlp.rlpc.RLPC'
|
||||
)
|
||||
|
||||
|
||||
88
rlp/Core.java
Normal file
88
rlp/Core.java
Normal file
@@ -0,0 +1,88 @@
|
||||
package rlp;
|
||||
/*------------------------------------------------------------------------------*/
|
||||
import java.util.function.BiFunction;
|
||||
/*------------------------------------------------------------------------------*/
|
||||
|
||||
public class Core
|
||||
{
|
||||
/* day 1: boy do i miss Haskell */
|
||||
public sealed interface Expr permits App, TyApp, Abs, TyAbs, Var {}
|
||||
public record App(Expr f, Expr x) implements Expr {}
|
||||
public record TyApp(Expr f, Ty x) implements Expr {}
|
||||
public record Abs(Name n, Ty t, Expr m) implements Expr {}
|
||||
public record TyAbs(Name n, Expr m) implements Expr {}
|
||||
public record Var(Name n) implements Expr {}
|
||||
|
||||
sealed interface Ty permits TyVar, Forall, TyFunc {}
|
||||
public record TyVar(Name n) implements Ty {}
|
||||
public record Forall(Name n, Ty t) implements Ty {}
|
||||
public record TyFunc(Ty a, Ty b) implements Ty {}
|
||||
|
||||
public final static class Name
|
||||
{
|
||||
public final String s;
|
||||
public Name(String s)
|
||||
{
|
||||
// TODO: verify that `s` is a valid identifier
|
||||
this.s = s;
|
||||
}
|
||||
}
|
||||
|
||||
public static String showExpr(Expr e)
|
||||
{
|
||||
return showExprP(0, e);
|
||||
}
|
||||
|
||||
static String showExprP(int p, Expr e)
|
||||
{
|
||||
return switch(e)
|
||||
{
|
||||
/* prec: 1 */
|
||||
case App a ->
|
||||
wrap(p, 1, showExprP(2, a.f) + " " + showExprP(2, a.x));
|
||||
|
||||
/* prec: 1 */
|
||||
case TyApp a ->
|
||||
wrap(p, 1, showExprP(2, a.f) + " " + showTyP(2, a.x));
|
||||
|
||||
/* prec: 0 */
|
||||
case Abs a ->
|
||||
wrap(p, 0, String.format
|
||||
( "λ(%s:%s).%s"
|
||||
, a.n.s
|
||||
, showTyP(0, a.t)
|
||||
, showExprP(0, a.m)));
|
||||
|
||||
/* prec: 0 */
|
||||
case TyAbs a ->
|
||||
wrap(p, 0, String.format
|
||||
( "Λ%s.%s"
|
||||
, a.n.s
|
||||
, showExprP(0, a.m)));
|
||||
|
||||
case Var a ->
|
||||
a.n.s;
|
||||
};
|
||||
}
|
||||
|
||||
static String showTy(Ty t)
|
||||
{
|
||||
return showTyP(0, t);
|
||||
}
|
||||
|
||||
static String showTyP(int p, Ty t)
|
||||
{
|
||||
return switch(t)
|
||||
{
|
||||
case TyVar a -> a.n.s;
|
||||
case Forall a -> "";
|
||||
case TyFunc a -> "";
|
||||
};
|
||||
}
|
||||
|
||||
static String wrap(int p, int n, String s)
|
||||
{
|
||||
return (p <= n) ? s : "(" + s + ")";
|
||||
}
|
||||
}
|
||||
|
||||
22
rlp/RLPC.java
Normal file
22
rlp/RLPC.java
Normal file
@@ -0,0 +1,22 @@
|
||||
package rlp.rlpc;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
import rlp.Core;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
class RLPC
|
||||
{
|
||||
public static void main(String[] argv)
|
||||
{
|
||||
// final Core.Expr e = new Core.App(new Core.Var(new Core.Name("f")), new Core.Var(new Core.Name("x")));
|
||||
final Core.Expr e =
|
||||
new Core.App
|
||||
( new Core.Abs
|
||||
( new Core.Name("x")
|
||||
, new Core.TyVar(new Core.Name("α"))
|
||||
, new Core.Var(new Core.Name("x"))
|
||||
)
|
||||
, new Core.Var(new Core.Name("y")));
|
||||
System.out.println(Core.showExpr(e));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
class RLPC
|
||||
{
|
||||
public static void main(String[] argv)
|
||||
{
|
||||
System.out.println("hello worms");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user