mirror of https://github.com/voidlizard/hbs2
wip
This commit is contained in:
parent
f96f37f9d1
commit
d00df68334
|
@ -32,6 +32,7 @@ import Data.ByteString.Lazy qualified as LBS
|
||||||
import Data.ByteString.Lazy.Char8 qualified as LBS8
|
import Data.ByteString.Lazy.Char8 qualified as LBS8
|
||||||
import Data.Data
|
import Data.Data
|
||||||
import Data.Coerce
|
import Data.Coerce
|
||||||
|
import Data.Foldable
|
||||||
import Data.Function as Export
|
import Data.Function as Export
|
||||||
import Data.Functor as Export
|
import Data.Functor as Export
|
||||||
import Data.Hashable
|
import Data.Hashable
|
||||||
|
@ -527,6 +528,10 @@ apply_ :: forall c m . ( IsContext c
|
||||||
|
|
||||||
apply_ s args = case s of
|
apply_ s args = case s of
|
||||||
ListVal [SymbolVal "builtin:lambda", SymbolVal n] -> apply n args
|
ListVal [SymbolVal "builtin:lambda", SymbolVal n] -> apply n args
|
||||||
|
|
||||||
|
ListVal (SymbolVal "builtin:closure" : what@(SymbolVal _) : free) -> do
|
||||||
|
apply_ what (free <> args)
|
||||||
|
|
||||||
SymbolVal "quasiquot" -> mkList <$> mapM (evalQQ mempty) args
|
SymbolVal "quasiquot" -> mkList <$> mapM (evalQQ mempty) args
|
||||||
SymbolVal "quasiquote" -> mkList <$> mapM (evalQQ mempty) args
|
SymbolVal "quasiquote" -> mkList <$> mapM (evalQQ mempty) args
|
||||||
SymbolVal what -> apply what args
|
SymbolVal what -> apply what args
|
||||||
|
@ -1073,11 +1078,6 @@ internalEntries = do
|
||||||
z ->
|
z ->
|
||||||
throwIO (BadFormException @C nil)
|
throwIO (BadFormException @C nil)
|
||||||
|
|
||||||
entry $ bindMatch "bound?" $ \case
|
|
||||||
[ SymbolVal x ] -> do
|
|
||||||
error "DONT KNOW"
|
|
||||||
_ -> pure $ mkBool False
|
|
||||||
|
|
||||||
entry $ bindMatch "apply" $ \case
|
entry $ bindMatch "apply" $ \case
|
||||||
[e, ListVal es] -> apply_ e es
|
[e, ListVal es] -> apply_ e es
|
||||||
|
|
||||||
|
@ -1629,6 +1629,29 @@ internalEntries = do
|
||||||
pure $ if a == b then mkBool True else mkBool False
|
pure $ if a == b then mkBool True else mkBool False
|
||||||
_ -> throwIO (BadFormException @c nil)
|
_ -> throwIO (BadFormException @c nil)
|
||||||
|
|
||||||
|
entry $ bindMatch "int?" \case
|
||||||
|
[p,e] -> pure $ mkList (termMatches (mkList [mkSym "int?", p]) e)
|
||||||
|
e -> throwIO (BadFormException @c (mkList e))
|
||||||
|
|
||||||
|
entry $ bindMatch "sym?" \case
|
||||||
|
[p, e] -> pure $ mkList (termMatches (mkList [mkSym "sym?", p]) e)
|
||||||
|
e -> throwIO (BadFormException @c (mkList e))
|
||||||
|
|
||||||
|
entry $ bindMatch "str?" \case
|
||||||
|
[p, e] -> pure $ mkList (termMatches (mkList [mkSym "str?", p]) e)
|
||||||
|
e -> throwIO (BadFormException @c (mkList e))
|
||||||
|
|
||||||
|
entry $ bindMatch "real?" \case
|
||||||
|
[p, e] -> pure $ mkList (termMatches (mkList [mkSym "real?", p]) e)
|
||||||
|
e -> throwIO (BadFormException @c (mkList e))
|
||||||
|
|
||||||
|
entry $ bindMatch "bool?" \case
|
||||||
|
[p, e] -> pure $ mkList (termMatches (mkList [mkSym "bool?", p]) e)
|
||||||
|
e -> throwIO (BadFormException @c (mkList e))
|
||||||
|
|
||||||
|
entry $ bindMatch "list?" \case
|
||||||
|
[p, e] -> pure $ mkList (termMatches (mkList [mkSym "list?", p]) e)
|
||||||
|
e -> throwIO (BadFormException @c (mkList e))
|
||||||
|
|
||||||
entry $ bindMatch "le?" $ \case
|
entry $ bindMatch "le?" $ \case
|
||||||
[a, b] -> pure $ mkBool (compareSyn a b == LT)
|
[a, b] -> pure $ mkBool (compareSyn a b == LT)
|
||||||
|
@ -2129,6 +2152,36 @@ concatTerms s = \case
|
||||||
|
|
||||||
xs -> mkStr ( show $ s (fmap fmt xs) )
|
xs -> mkStr ( show $ s (fmap fmt xs) )
|
||||||
|
|
||||||
|
termMatches :: forall c . IsContext c => Syntax c -> Syntax c -> [Syntax c]
|
||||||
|
|
||||||
|
termMatches pred what = case (pred, what) of
|
||||||
|
(SymbolVal "_", a) -> [a]
|
||||||
|
(ListVal [SymbolVal "int?", SymbolVal "_"], LitIntVal n) -> [mkInt n]
|
||||||
|
(ListVal [SymbolVal "int?", LitIntVal a], LitIntVal b) -> [mkInt b]
|
||||||
|
|
||||||
|
-- String matching
|
||||||
|
(ListVal [SymbolVal "sym?", SymbolVal "_"], SymbolVal s) -> [mkSym s]
|
||||||
|
(ListVal [SymbolVal "sym?", SymbolVal a], SymbolVal b) | a == b -> [mkSym b]
|
||||||
|
|
||||||
|
-- String matching
|
||||||
|
(ListVal [SymbolVal "str?", SymbolVal "_"], LitStrVal s) -> [mkStr s]
|
||||||
|
(ListVal [SymbolVal "str?", LitStrVal a], LitStrVal b) | a == b -> [mkStr b]
|
||||||
|
|
||||||
|
-- Real number matching
|
||||||
|
(ListVal [SymbolVal "real?", SymbolVal "_"], LitScientificVal r) -> [mkDouble r]
|
||||||
|
(ListVal [SymbolVal "real?", LitScientificVal a], LitScientificVal b) | a == b -> [mkDouble b]
|
||||||
|
|
||||||
|
-- Boolean matching
|
||||||
|
(ListVal [SymbolVal "bool?", SymbolVal "_"], LitBoolVal b) -> [mkBool b]
|
||||||
|
(ListVal [SymbolVal "bool?", LitBoolVal a], LitBoolVal b) | a == b -> [mkBool b]
|
||||||
|
|
||||||
|
-- ListMatch
|
||||||
|
(ListVal [SymbolVal "list?", SymbolVal "_"], b@ListVal{}) -> [b]
|
||||||
|
(ListVal [SymbolVal "list?", a@(ListVal as)], b@(ListVal bs)) -> do
|
||||||
|
foldMap (uncurry termMatches) (zip as bs)
|
||||||
|
|
||||||
|
(_,_) -> mempty
|
||||||
|
|
||||||
asSym :: forall ann c . IsContext c => Syntax c -> Doc ann
|
asSym :: forall ann c . IsContext c => Syntax c -> Doc ann
|
||||||
asSym = \case
|
asSym = \case
|
||||||
TextLike s -> pretty (mkSym @c s)
|
TextLike s -> pretty (mkSym @c s)
|
||||||
|
|
Loading…
Reference in New Issue