atomo programming language — http://atomo-lang.org/
{-# 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)
|