packages feed

octopus-0.0.2.0: Language/Octopus/Libraries.hs

module Language.Octopus.Libraries where

import Import
import Language.Octopus.Data
import Language.Octopus.Data.Shortcut
import Language.Octopus.Basis

initialEnv = mkOb [
      (intern "__let__", letDef)
    , (intern "__open__", openDef)
    --- Exceptions --- TODO give builtin literals
    , (intern "TypeError",    exnTypeError)
    , (intern "MatchFailure", exnMatchFail)
    , (intern "DivZero",      exnDivZero)
    ]

letDef = Cl
    (mkSq [mkOb [], mkSy "x"])
    (mkCall (Pr Vau) (mkSq [mkSy "val",
        mkCall (Pr Vau) (mkSq [mkSq [mkSy "e", mkSy "body"],
            mkCall (Pr Eval) (mkSq
                [ mkCall (Pr Extends) (mkSq 
                    [ mkCall (Pr Match) (mkSq [mkSy "x", mkCall (Pr Eval) (mkSy "val")])
                    , mkSy "e"])
                , mkSy "body"])])]))
    (mkOb [])
openDef = Cl
    (mkSy "env")
    (mkCall (Pr Vau) (mkSq [mkSq [mkSy "static", mkSy "body"],
        mkCall (Pr Eval) (mkSq 
            [ mkCall (Pr Extends) (mkSq
                [ mkCall (Pr Eval) (mkSy "env")
                , mkSy "static"])
            , mkSy "body"])]))
    (mkOb [])