diff options
| author | Jan Tuomi <jans.tuomi@gmail.com> | 2022-12-06 11:44:31 +0200 |
|---|---|---|
| committer | Jan Tuomi <jans.tuomi@gmail.com> | 2022-12-06 11:52:57 +0200 |
| commit | 75dd3bb463b427d733eb368a8c176c1e04e9c26e (patch) | |
| tree | f6371ce0dafaf44d764da6a55bcc7e03ba3589cd /src/Interpreter.hs | |
| parent | 36d664319b20ad18bcee6a46fe9943c4434848e1 (diff) | |
Implement set functions on records
Diffstat (limited to 'src/Interpreter.hs')
| -rw-r--r-- | src/Interpreter.hs | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/src/Interpreter.hs b/src/Interpreter.hs index 8c9178d..6e9e770 100644 --- a/src/Interpreter.hs +++ b/src/Interpreter.hs @@ -261,7 +261,6 @@ evaluateRecord asts = do makeFnCreate _ _ = error $ "unreachable: makeFnCreate " ++ fnCreateName - let namespacedFields = map (\name -> ns ++ "/" ++ name) fields let createFn = makeFnCreate fields [] insertThisEnv fnCreateName $ recordAst { astNode = ASTFunction True createFn } @@ -274,6 +273,17 @@ evaluateRecord asts = do makeGetFns restParams makeGetFns fields + + let makeSetFns [] = return $ () + makeSetFns (param:restParams) = do + let fnSetName = ns ++ "/" ++ "set-" ++ param + let fn = setFn fnSetName + let fnAST = makeNonsenseAST $ ASTFunction True $ fn + insertThisEnv fnSetName fnAST + makeSetFns restParams + + makeSetFns fields + return $ recordAst { astNode = ASTUnit } _ -> throwL (astPos recordAst) $ "invalid arguments passed to import!: " ++ show args @@ -292,6 +302,16 @@ evaluateRecord asts = do Just value -> return $ value Nothing -> error $ "unreachable: getFn " ++ fnName getFn fnName ast = throwL (astPos ast) $ "invalid argument passed to " ++ fnName ++ ": " ++ (show ast) + setFn fnName ast1 = do + return $ makeNonsenseAST $ ASTFunction True $ fn where + fn ast2@AST { astNode = ASTRecord identifier record } = do + when (not $ identifier `L.isPrefixOf` fnName) $ + throwL (astPos ast2) $ "invalid argument: " ++ fnName ++ " cannot operate on record " ++ identifier + let (_, fnId) = separateNsIdPart fnName + let fieldId = drop 4 fnId + let newRecord = M.insert fieldId ast1 record + return $ makeNonsenseAST $ ASTRecord identifier newRecord + fn ast2 = throwL (astPos ast2) $ "invalid argument passed to " ++ fnName ++ ": " ++ (show ast2) evaluateUserFunction :: [AST] -> LContext AST evaluateUserFunction children = do |
