aboutsummaryrefslogtreecommitdiff
path: root/src/boot/ast.boot
diff options
context:
space:
mode:
Diffstat (limited to 'src/boot/ast.boot')
-rw-r--r--src/boot/ast.boot18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/boot/ast.boot b/src/boot/ast.boot
index 467caa3f..b3c568b4 100644
--- a/src/boot/ast.boot
+++ b/src/boot/ast.boot
@@ -62,6 +62,8 @@ structure %Ast ==
%Namespace(%Symbol) -- namespace AxiomCore
%Import(%Ast) -- import module; import namespace foo
%ImportSignature(%Symbol,%Signature) -- import function declaration
+ %Record(%List,%List) -- Record(num: %Short, den: %Short)
+ %AccessorDef(%Symbol,%Ast) -- numerator == (.num)
%TypeAlias(%Head, %List) -- type alias definition
%Signature(%Symbol,%Mapping) -- op: S -> T
%Mapping(%Ast, %List) -- (S1, S2) -> T
@@ -1336,6 +1338,22 @@ bfDs n ==
bfEnum(t,csts) ==
['DEFTYPE,t,nil,backquote(['MEMBER,:csts],nil)]
+bfRecordDef(s,fields,accessors) ==
+ parms := [x for f in fields | f is ['%Signature,x,.]]
+ fun := makeSymbol strconc('"mk",symbolName s)
+ ctor := makeSymbol strconc('"MAKE-",symbolName s)
+ recDef := ["DEFSTRUCT",s,:[x for ['%Signature,x,.] in fields]]
+ ctorDef :=
+ args := [:[bfColonColon("KEYWORD",p),p] for p in parms]
+ ["DEFMACRO",fun,parms,["LIST",quote ctor,:args]]
+ accDefs :=
+ accessors = nil => nil
+ x := bfGenSymbol()
+ [["DEFMACRO",acc,[x],
+ ["LIST",quote makeSymbol strconc(symbolName s,'"-",symbolName f),x]]
+ for ['%AccessorDef,acc,f] in accessors]
+ [recDef,ctorDef,:accDefs]
+
bfHandlers(n,e,hs) == main(n,e,hs,nil) where
main(n,e,hs,xs) ==
hs = nil =>