@@ -14,6 +14,10 @@ import Control.Monad.Cont qualified as Cont
|
||||
import Control.Lens
|
||||
import qualified Data.List.NonEmpty as NE
|
||||
import qualified Gyehoek.Sexp
|
||||
import Data.String.Interpolate (i)
|
||||
import Data.Functor (unzip)
|
||||
import Data.List (List)
|
||||
import Prelude hiding (unzip)
|
||||
|
||||
|
||||
-- 뻘짓이어라
|
||||
@@ -45,11 +49,10 @@ convert (Scm.ExpPrim p) k =
|
||||
|
||||
convert (Scm.ExpLambda xs e) k = do
|
||||
f <- gensym' "λ-body"
|
||||
ktail <- gensym' "λ-tail"
|
||||
m <- convert e $ \e' -> pure $ ExpContinue ktail [e']
|
||||
lam <- convertLambda xs e
|
||||
ke <- k $ ValVar f
|
||||
pure [cps|
|
||||
(letrec ((#{f} (λ (##{xs} #{ktail}) #{m})))
|
||||
(letrec ((#{f} #{lam}))
|
||||
#{ke})
|
||||
|]
|
||||
|
||||
@@ -80,7 +83,24 @@ convert (Scm.ExpLet bs e) k =
|
||||
(continue #{kbody} ##{rhss'}))
|
||||
|]
|
||||
|
||||
convert _ k = _
|
||||
convert (Scm.ExpLetRec bs m) k = do
|
||||
let bs' = bs & each . _2 %~ (^?! #ExpLambda)
|
||||
let conv = traverseOf _2 (uncurry $ convertLambda @es)
|
||||
bs'' <- traverse conv bs'
|
||||
m' <- convert m k
|
||||
pure [cps|
|
||||
(letrec #{bs''} #{m'})
|
||||
|]
|
||||
|
||||
-- convert e k = error [i|unimplemented expr: #{e}|]
|
||||
|
||||
convertLambda
|
||||
:: GenSym :> es
|
||||
=> List Name -> Scm.Exp -> Eff es Lambda
|
||||
convertLambda bs m = do
|
||||
ktail <- gensym' "lambda-tail"
|
||||
m' <- convert m $ pure . ExpContinue ktail . (:[])
|
||||
pure [cps|(λ (##{bs} #{ktail}) #{m'})|]
|
||||
|
||||
convertProgram :: forall es. (GenSym :> es) => Scm.Program -> Eff es Program
|
||||
convertProgram p =
|
||||
|
||||
Reference in New Issue
Block a user