This commit is contained in:
voidlizard 2025-03-03 10:18:14 +03:00
parent f96f37f9d1
commit d00df68334
1 changed files with 58 additions and 5 deletions

View File

@ -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)