@@ -26,6 +26,12 @@ makeExportedFunction name args expr = do
2626 modify_ $ Array.cons $ ExportIdentifier name
2727 pure $ Define name $ S.mkCurriedFn args expr
2828
29+makeExportedValue
30+ :: forall m. Monad m => MonadState (Array ChezExport) m => String -> ChezExpr -> m ChezDefinition
31+makeExportedValue name value = do
32+ modify_ $ Array.cons $ ExportIdentifier name
33+ pure $ S.Define name $ value
34+
2935makeBooleanComparison
3036 :: forall m. Monad m => MonadState (Array ChezExport) m => String -> m ChezDefinition
3137makeBooleanComparison suffix =
@@ -36,6 +42,47 @@ makeBooleanComparison suffix =
3642 , S.List [ S.Identifier "boolean->integer", S.Identifier "y" ]
3743 ]
3844
45+createMakeArrayFn :: forall m. Monad m => MonadState (Array ChezExport) m => m ChezDefinition
46+createMakeArrayFn = makeExportedValue "make-array" $ S.Identifier "srfi:214:flexvector"
47+
48+createArrayRefFn :: forall m. Monad m => MonadState (Array ChezExport) m => m ChezDefinition
49+createArrayRefFn = makeExportedValue "array-ref" $ S.Identifier "srfi:214:flexvector-ref"
50+
51+createMakeObjectFn :: forall m. Monad m => MonadState (Array ChezExport) m => m ChezDefinition
52+createMakeObjectFn = makeExportedValue "make-object" $ S.List
53+ [ S.Identifier $ scmPrefixed "lambda"
54+ , S.Identifier "args"
55+ , S.List
56+ [ S.Identifier $ scmPrefixed "apply"
57+ , S.Identifier "srfi:125:hash-table"
58+ , S.List
59+ [ S.Identifier $ scmPrefixed "cons"
60+ , S.Identifier "string-comparator"
61+ , S.Identifier "args"
62+ ]
63+ ]
64+ ]
65+
66+createObjectRefFn :: forall m. Monad m => MonadState (Array ChezExport) m => m ChezDefinition
67+createObjectRefFn = makeExportedValue "object-ref" $ S.Identifier "srfi:125:hash-table-ref"
68+
69+createObjectSetFn :: forall m. Monad m => MonadState (Array ChezExport) m => m ChezDefinition
70+createObjectSetFn = makeExportedValue "object-set!" $ S.Identifier "srfi:125:hash-table-set!"
71+
72+createObjectCopyFn :: forall m. Monad m => MonadState (Array ChezExport) m => m ChezDefinition
73+createObjectCopyFn = makeExportedFunction "object-copy" (NEA.singleton "v") $ S.List
74+ [ S.Identifier "srfi:125:hash-table-copy"
75+ , S.Identifier "v"
76+ , S.Bool true
77+ ]
78+
79+importSRFI :: String -> ChezImport
80+importSRFI srfi = ImportSet $ ImportPrefix
81+ ( ImportLibrary
82+ { identifiers: NEA.cons' "purs" [ "runtime", "srfi", ":" <> srfi ], version: Nothing }
83+ )
84+ ("srfi:" <> srfi <> ":")
85+
3986runtimeModule :: ChezLibrary
4087runtimeModule = do
4188 let
@@ -46,10 +93,23 @@ runtimeModule = do
4693 , S.Integer $ S.LiteralDigit "1"
4794 , S.Integer $ S.LiteralDigit "0"
4895 ]
96+ , pure $ S.Define "string-comparator" $ S.List
97+ [ S.Identifier "srfi:128:make-comparator"
98+ , S.Identifier $ scmPrefixed "string?"
99+ , S.Identifier $ scmPrefixed "string=?"
100+ , S.Identifier $ scmPrefixed "string<?"
101+ , S.Identifier $ scmPrefixed "string-hash"
102+ ]
49103 , makeBooleanComparison ">?"
50104 , makeBooleanComparison ">=?"
51105 , makeBooleanComparison "<=?"
52106 , makeBooleanComparison "<?"
107+ , createMakeArrayFn
108+ , createArrayRefFn
109+ , createMakeObjectFn
110+ , createObjectRefFn
111+ , createObjectSetFn
112+ , createObjectCopyFn
53113 ]
54114 { "#!chezscheme": true
55115 , "#!r6rs": true
@@ -62,6 +122,9 @@ runtimeModule = do
62122 [ ImportSet $ ImportPrefix
63123 (ImportLibrary { identifiers: NEA.singleton "chezscheme", version: Nothing })
64124 libChezSchemePrefix
125+ , importSRFI "125"
126+ , importSRFI "128"
127+ , importSRFI "214"
65128 ]
66129 , body:
67130 { definitions