wip, cons, top:stdin

This commit is contained in:
voidlizard 2025-01-24 17:49:17 +03:00
parent b4f8cd8354
commit 5df971bbac
1 changed files with 11 additions and 1 deletions

View File

@ -33,6 +33,7 @@ import Data.Kind
import Data.List (isPrefixOf) import Data.List (isPrefixOf)
import Data.List qualified as List import Data.List qualified as List
import Data.Maybe import Data.Maybe
import Data.Either
import Data.String import Data.String
import Data.Text.IO qualified as TIO import Data.Text.IO qualified as TIO
import Data.Text qualified as Text import Data.Text qualified as Text
@ -966,9 +967,13 @@ internalEntries = do
_ -> throwIO (TypeCheckError @C nil) _ -> throwIO (TypeCheckError @C nil)
entry $ bindMatch "head" $ \case entry $ bindMatch "head" $ \case
[ ListVal es ] -> pure (head es) [ ListVal es ] -> pure (headDef nil es)
_ -> throwIO (TypeCheckError @C nil) _ -> throwIO (TypeCheckError @C nil)
entry $ bindMatch "cons" $ \case
[ e, ListVal es ] -> pure (mkList (e:es))
_ -> throwIO (BadFormException @C nil)
brief "get tail of list" brief "get tail of list"
$ args [arg "list" "list"] $ args [arg "list" "list"]
$ desc "nil if the list is empty; error if not list" $ desc "nil if the list is empty; error if not list"
@ -1140,6 +1145,11 @@ internalEntries = do
e@(SymbolVal x) -> wrapWith e e@(SymbolVal x) -> wrapWith e
_ -> id _ -> id
entry $ bindMatch "top:stdin" $ const do
liftIO TIO.getContents
<&> either (const nil) (mkList . fmap fixContext) . parseTop
brief "parses string as toplevel and produces a form" brief "parses string as toplevel and produces a form"
$ desc "parse:top:string SYMBOL STRING-LIKE" $ desc "parse:top:string SYMBOL STRING-LIKE"
$ entry $ bindMatch "parse:top:string" $ \case $ entry $ bindMatch "parse:top:string" $ \case