@@ -28,7 +28,7 @@ import PureScript.Backend.Chez.Syntax as S
2828import PureScript.Backend.Optimizer.Convert (BackendModule, BackendBindingGroup)
2929import PureScript.Backend.Optimizer.CoreFn (Ident(..), Literal(..), ModuleName(..), Qualified(..))
3030import PureScript.Backend.Optimizer.Semantics (NeutralExpr)
31−import PureScript.Backend.Optimizer.Syntax (BackendAccessor(..), BackendOperator(..), BackendOperator1(..), BackendOperator2(..), BackendOperatorNum(..), BackendOperatorOrd(..), BackendSyntax(..), Level(..), Pair(..))
31+import PureScript.Backend.Optimizer.Syntax (BackendAccessor(..), BackendEffect(..), BackendOperator(..), BackendOperator1(..), BackendOperator2(..), BackendOperatorNum(..), BackendOperatorOrd(..), BackendSyntax(..), Level(..), Pair(..))
3232import Safe.Coerce (coerce)
3333
3434type CodegenEnv =
@@ -344,6 +344,8 @@ codegenChain chainMode codegenEnv = collect []
344344 -- `expression` has type `Effect ..`, so we can confidently unthunk here
345345 codegenEffectBind :: NeutralExpr -> ChezExpr
346346 codegenEffectBind expression = case unwrap expression of
347+ PrimEffect e' ->
348+ codegenPrimEffect codegenEnv e'
347349 UncurriedEffectApp f p ->
348350 S.runUncurriedFn (codegenExpr codegenEnv f) (codegenExpr codegenEnv <$> p)
349351 _ ->
@@ -364,6 +366,8 @@ codegenChain chainMode codegenEnv = collect []
364366 collect (Array.snoc bindings $ Tuple (toChezIdent i l) (codegenExpr codegenEnv v)) e'
365367 EffectPure e' | chainMode.effect ->
366368 finish false bindings (codegenExpr codegenEnv e')
369+ PrimEffect e' | chainMode.effect ->
370+ finish false bindings (codegenPrimEffect codegenEnv e')
367371 EffectBind i l v e' | chainMode.effect ->
368372 collect
369373 (Array.snoc bindings $ Tuple (toChezIdent i l) (codegenEffectBind v))
@@ -427,7 +431,6 @@ codegenPrimOp codegenEnv@{ currentModule } = case _ of
427431 OpGte -> comparisonExpression ">=?"
428432 OpLt -> comparisonExpression "<?"
429433 OpLte -> comparisonExpression "<=?"
430−
431434 in
432435 case o of
433436 OpArrayIndex ->
@@ -499,3 +502,20 @@ codegenPrimOp codegenEnv@{ currentModule } = case _ of
499502 OpLt -> comparisonExpression "<?"
500503 OpLte -> comparisonExpression "<=?"
501504 makeStringComparison o'
505+
506+codegenPrimEffect :: CodegenEnv -> BackendEffect NeutralExpr -> ChezExpr
507+codegenPrimEffect codegenEnv = case _ of
508+ EffectRefNew v ->
509+ S.app (S.Identifier $ scmPrefixed "box") (codegenExpr codegenEnv v)
510+ EffectRefRead r ->
511+ S.app (S.Identifier $ scmPrefixed "unbox") (codegenExpr codegenEnv r)
512+ EffectRefWrite r v ->
513+ S.List
514+ [ S.Identifier $ scmPrefixed "begin"
515+ , S.List
516+ [ S.Identifier $ scmPrefixed "set-box!"
517+ , codegenExpr codegenEnv r
518+ , codegenExpr codegenEnv v
519+ ]
520+ , S.List [ S.Identifier $ scmPrefixed "unbox", codegenExpr codegenEnv r ]
521+ ]