From e73fc5d19660fad23e6af5fb3bd1442fc2414fef Mon Sep 17 00:00:00 2001 From: Georges Dubus Date: Tue, 13 Feb 2018 15:49:46 +0100 Subject: [PATCH] More WIP --- Nix/Eval.hs | 15 +++++++++++---- tests/EvalTests.hs | 2 +- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/Nix/Eval.hs b/Nix/Eval.hs index eff7f7c..6066a0e 100644 --- a/Nix/Eval.hs +++ b/Nix/Eval.hs @@ -21,6 +21,8 @@ import Nix.Atoms import Nix.Expr import Prelude hiding (mapM, sequence) +import Nix.Parser +import Data.Maybe (isJust) import Debug.Trace -- | An 'NValue' is the most reduced form of an 'NExpr' after evaluation @@ -69,6 +71,12 @@ atomText (NBool b) = if b then "true" else "false" atomText NNull = "null" atomText (NUri uri) = uri +expr = let Success x = parseNixString "({ x ? 1, y ? x * 3 }: y - x) {}" + in x +goeval :: MonadFix m => m (NValue m) +goeval = evalExpr expr mempty + + buildArgument :: MonadFix m => Params (ValueSet m -> m (NValue m)) -> NValue m -> m (ValueSet m) buildArgument paramSpec arg = case paramSpec of Param name -> return $ Map.singleton name arg @@ -77,17 +85,16 @@ buildArgument paramSpec arg = case paramSpec of Map.insert name arg <$> lookupParamSet s ParamSet _ _ -> error "Can't yet handle variadic param sets" where - go env envAndArgs k def = maybe (error err) id $ mvalueFromEnv <|> mvalueFromDef + go env evaledArgs k def = maybe (error err) id $ (mvalueFromEnv <|> mvalueFromDef) where mvalueFromEnv = return <$> Map.lookup k env - mvalueFromDef = ($ Map.delete k envAndArgs) <$> def + mvalueFromDef = ($ evaledArgs) <$> def err = "Could not find " ++ show k lookupParamSet s = case arg of Fix (NVSet env) -> do rec - evaledArgs <- Map.traverseWithKey (\k v -> traceShow k $ go env envAndArgs k v) s - let envAndArgs = env `Map.union` evaledArgs + evaledArgs <- Map.traverseWithKey (go env evaledArgs) s return evaledArgs _ -> error "Unexpected function environment" diff --git a/tests/EvalTests.hs b/tests/EvalTests.hs index 043ca35..d70e31d 100644 --- a/tests/EvalTests.hs +++ b/tests/EvalTests.hs @@ -31,7 +31,7 @@ case_function_set_two_arg :: Assertion case_function_set_two_arg = constantEqualStr "2" "({ a, b ? 3 }: b - a) { a = 1; }" case_function_set_two_arg_default_scope :: Assertion -case_function_set_two_arg_default_scope = constantEqualStr "2" "({ a ? 1, b ? a * 3 }: b - a) {}" +case_function_set_two_arg_default_scope = constantEqualStr "2" "({ x ? 1, y ? x * 3 }: y - x) {}" case_function_default_env :: Assertion case_function_default_env = constantEqualStr "2" "let default = 2; in ({ a ? default }: a) {}"