packages feed

octopus-0.0.1.0: Octopus/Libraries.hs

module Octopus.Libraries where

import Import
import Octopus.Data
import Octopus.Basis


startData = mkOb [
    --- Non-data ---
      (intern "__vau__",      Pr Vau)
    , (intern "__match__",    Pr Match)
    , (intern "__eval__",     Pr Eval)
    , (intern "__ifz!__",     Pr Ifz)
    , (intern "__import__",   Pr Imp)
    --- Relationals ---
    , (intern "__eq__",       Pr Eq)
    , (intern "__neq__",      Pr Neq)
    , (intern "__lt__",       Pr Lt)
    , (intern "__lte__",      Pr Lte)
    , (intern "__gt__",       Pr Gt)
    , (intern "__gte__",      Pr Gt)
    --- Arithmetic ---
    , (intern "__add__",      Pr Add)
    , (intern "__mul__",      Pr Mul)
    , (intern "__sub__",      Pr Sub)
    , (intern "__div__",      Pr Div)
    --- Numbers ---
    , (intern "__numer__",    Pr Numer)
    , (intern "__denom__",    Pr Denom)
    , (intern "__numparts__", Pr NumParts)
    --- Lists ---
    , (intern "__len__",      Pr Len)
    , (intern "__cat__",      Pr Cat)
    , (intern "__cut__",      Pr Cut)
    --- Xonses ---
    , (intern "__extends__",  Pr Extends)
    , (intern "__del__",      Pr Delete)
    , (intern "__keys__",     Pr Keys)
    --TODO __lookup__
    --- Niceties ---
    , (intern "vau",          vauDef)
    , (intern "__get__",      getDef)
    , (intern "__let__",      letDef)
    , (intern "__lambda__",   lambdaDef)
    , (intern "__quote__",    quoteDef)
    ]

vauDef = Cl
    (mkSq [mkOb [], mkSy "x"])
    (mkCall (Pr Vau) (mkSq [mkSq [mkSy "static", mkSy "body"],
        mkCall (Pr Vau) (mkSq [mkSy "arg",
            mkCall (Pr Eval) (mkSq [
                mkCall (Pr Extends) (mkSq [
                    mkCall (Pr Match) (mkSq [mkSy "x", mkSy "arg"]),
                    mkSy "static"]),
                mkSy "body"])])]))
    (mkOb [])


delDef = Cl 
    (mkSy "ob")
    (mkCall (Pr Vau) (mkSq [mkSq [mkOb [], mkSy "x"],
        mkCall (Pr Delete) (mkSq [mkCall (Pr Eval) (mkSy "ob"), mkSy "x"])]))
    (mkOb [])

getDef = Cl
    (mkSq [mkOb [], mkSy "x"])
    (mkCall (Pr Vau) (mkSq [mkSy "ob",
        mkCall (Pr Eval) (mkSq [mkCall (Pr Eval) (mkSy "ob"), mkSy "x"])]))
    (mkOb [])


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 [])

lambdaDef = Cl
    (mkSq [mkOb [], mkSy "var"])
    (mkCall (Pr Vau) (mkSq [mkSq [mkSy "static", mkSy "ast"],
        mkCall (Pr Vau) (mkSq [mkSy "arg",
            mkCall (Pr Eval) (mkSq
                [ mkCall (Pr Extends) (mkSq
                    [ mkCall (Pr Match) (mkSq [mkSy "var", mkCall (Pr Eval) (mkSy "arg")])
                    , mkSy "static"])
                , mkSy "ast"])])]))
    (mkOb [])
quoteDef = Cl (mkSq [mkOb [], mkSy "ast"]) (mkSy "ast") (mkOb [])