Skip to content

Commit e129a83

Browse files
committed
Ponder compilation a bit
1 parent 457f25f commit e129a83

File tree

1 file changed

+90
-0
lines changed

1 file changed

+90
-0
lines changed

experiments/idris/src/Playground/OpenType/InductiveRecursive.idr

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,3 +90,93 @@ namespace FormatOf
9090
simple_glyph = FormatOf.do
9191
flag <- flag
9292
pure (flag.repeat + 1)
93+
94+
95+
-- Thinking about compilation
96+
97+
namespace Rust
98+
99+
data RType : Type where
100+
Var : String -> RType
101+
U8 : RType
102+
U16 : RType
103+
U32 : RType
104+
U64 : RType
105+
I8 : RType
106+
I16 : RType
107+
I32 : RType
108+
I64 : RType
109+
Never : RType
110+
Tuple : List RType -> RType
111+
Vec : RType -> RType
112+
113+
data Item : Type where
114+
Struct : List (String, RType) -> Item
115+
Enum : List (String, RType) -> Item
116+
DecodeFn : () -> Item
117+
EncodeFn : () -> Item
118+
119+
record Module where
120+
constructor MkModule
121+
items : List (String, Item)
122+
123+
124+
namespace Compile
125+
126+
-- TODO: Cache compilations of definitions
127+
-- eg. of structs, enums, endocers and decoders
128+
129+
130+
compileFormat : Format -> (Rust.Module -> Maybe Rust.Module)
131+
compileFormat f =
132+
-- compile rep
133+
-- compile decode
134+
-- compile encode
135+
?todo_compileFormat
136+
137+
138+
compileRep : (f : Format) -> Maybe Rust.RType
139+
compileRep End = Just (Rust.Tuple [])
140+
compileRep Fail = Just (Rust.Never)
141+
compileRep (Ignore _ _) = Just (Rust.Tuple [])
142+
compileRep (Repeat _ f) =
143+
Just (Rust.Vec !(compileRep f)) -- TODO: Compile to a contract? Or maybe a
144+
-- fixed size array if the length is known
145+
-- or just throw away the info
146+
compileRep (Pure x) =
147+
?todo_compileSingRep -- TODO: interpret an Idris type as a Rust type??
148+
-- perhaps we need to restrict this?
149+
compileRep (Bind f1 f2) =
150+
Just (Tuple
151+
[ !(compileRep f1)
152+
, !(compileRep (f2 ?todo_compileBind_x)) -- TODO: how to bind the output?
153+
-- enum based on the values of `x : Rep f1`?
154+
-- depends on how `x` is used inside `f2`
155+
])
156+
compileRep (Custom f) =
157+
-- TODO: f.RustRep
158+
Nothing
159+
160+
161+
compileDecode : Format -> (Rust.Module -> Maybe Rust.Module)
162+
compileDecode End = ?todo_compileDecodeEnd
163+
compileDecode Fail = ?todo_compileDecodeFail
164+
compileDecode (Pure x) = ?todo_compileDecodePure
165+
compileDecode (Ignore f _) = ?todo_compileDecodeIgnore
166+
compileDecode (Repeat len f) = ?todo_compileDecodeRepeat
167+
compileDecode (Bind f1 f2) = ?todo_compileDecodeBind
168+
compileDecode (Custom f) =
169+
-- TODO: f.rustDecode
170+
?todo_compileDecodeCustom
171+
172+
173+
compileEncode : Format -> (Rust.Module -> Maybe Rust.Module)
174+
compileEncode End = ?todo_compileEncodeEnd
175+
compileEncode Fail = ?todo_compileEncodeFail
176+
compileEncode (Pure x) = ?todo_compileEncodePure
177+
compileEncode (Ignore f def) = ?todo_compileEncodeIgnore
178+
compileEncode (Repeat len f) = ?todo_compileEncodeRepeat
179+
compileEncode (Bind f1 f2) = ?todo_compileEncodeBind
180+
compileEncode (Custom f) =
181+
-- TODO: f.rustEncode
182+
?todo_compileEncodeCustom

0 commit comments

Comments
 (0)