packages feed

atomo-0.3: src/Atomo/Core.hs

module Atomo.Core where

import Control.Concurrent
import Control.Monad.State

import Atomo.Types
import Atomo.Method
import Atomo.Environment


-- | Defines all primitive objects, including the Lobby.
initCore :: VM ()
initCore = do
    -- the very root object
    object <- newObject [] noMethods

    -- top scope is a proto delegating to the root object
    topObj <- newObject [object] noMethods

    modify $ \e -> e { top = topObj }

    -- Lobby is the very bottom scope object
    define (single "Lobby" (PMatch topObj)) (Primitive Nothing topObj)

    -- define Object as the root object
    define (single "Object" (PMatch topObj)) (Primitive Nothing object)

    -- create parser environment
    parserEnv <- newObject [topObj] noMethods

    modify $ \e -> e
        { primitives = (primitives e) { idObject = object }
        , parserState = (parserState e) { psEnvironment = parserEnv }
        }

    -- this thread's channel
    chan <- liftIO newChan
    modify $ \e -> e { channel = chan }

    -- Numeric object; Integer and Double
    number <- newObject [object] noMethods

    -- define Object as the root object
    define (single "Number" (PMatch topObj)) (Primitive Nothing number)

    -- define primitive objects
    forM_ primObjs $ \(n, f) -> do
        o <-
            if n `elem` ["Integer", "Double"]
                then newObject [number] noMethods
                else newObject [object] noMethods

        define (single n (PMatch topObj)) (Primitive Nothing o)
        modify $ \e -> e { primitives = f (primitives e) o }
  where
    primObjs =
        [ ("Block", \is r -> is { idBlock = r })
        , ("Boolean", \is r -> is { idBoolean = r })
        , ("Char", \is r -> is { idChar = r })
        , ("Continuation", \is r -> is { idContinuation = r })
        , ("Double", \is r -> is { idDouble = r })
        , ("Expression", \is r -> is { idExpression = r })
        , ("Haskell", \is r -> is { idHaskell = r })
        , ("Integer", \is r -> is { idInteger = r })
        , ("List", \is r -> is { idList = r })
        , ("Message", \is r -> is { idMessage = r })
        , ("Method", \is r -> is { idMethod = r })
        , ("Particle", \is r -> is { idParticle = r })
        , ("Process", \is r -> is { idProcess = r })
        , ("Pattern", \is r -> is { idPattern = r })
        , ("Rational", \is r -> is { idRational = r })
        , ("String", \is r -> is { idString = r })
        ]