darcsden :: trevor -> atomo -> blob

atomo programming languagehttp://atomo-lang.org/

root / src / Atomo / Kernel / Pattern.hs

{-# LANGUAGE QuasiQuotes #-}
{-# OPTIONS -fno-warn-name-shadowing #-}
module Atomo.Kernel.Pattern (load) where

import Atomo


load :: VM ()
load = do
    [$p|(e: Expression) as: Pattern|] =: do
        Expression e <- here "e" >>= findExpression
        p <- toPattern e
        return (Pattern p)

    [$p|(p: Pattern) name|] =: do
        Pattern p <- here "p" >>= findPattern

        case p of
            PNamed n _ -> return (string n)
            PSingle { ppName = n } -> return (string n)
            _ -> raise ["no-name-for"] [Pattern p]

    [$p|(p: Pattern) names|] =: do
        Pattern p <- here "p" >>= findPattern

        case p of
            PKeyword { ppNames = ns } -> return $ list (map string ns)
            _ -> raise ["no-names-for"] [Pattern p]

    [$p|(p: Pattern) target|] =: do
        Pattern p <- here "p" >>= findPattern

        case p of
            PSingle { ppTarget = t } -> return (Pattern t)
            _ -> raise ["no-target-for"] [Pattern p]

    [$p|(p: Pattern) targets|] =: do
        Pattern p <- here "p" >>= findPattern

        case p of
            PKeyword { ppTargets = ts } -> return $ list (map Pattern ts)
            _ -> raise ["no-targets-for"] [Pattern p]

    [$p|(p: Pattern) matches?: v|] =: do
        Pattern p <- here "p" >>= findPattern
        v <- here "v"
        ids <- gets primitives

        if match ids p v
            then do
                bs <- eval [$e|Object clone|]
                withTop bs (set p v)
                return (keyParticle ["yes"] [Nothing, Just bs])
            else return (particle "no")

    [$p|top match: (p: Pattern) on: v|] =: do
        p <- here "p" >>= findPattern >>= matchable . fromPattern
        v <- here "v"
        t <- here "top"

        let isMethod (PSingle {}) = True
            isMethod (PKeyword {}) = True
            isMethod _ = False

        if isMethod p
            then define p (Primitive Nothing v) >> return v
            else withTop t (set p v)