From ec8f875ff70be5fcb7dc02d6babe644e8503bc96 Mon Sep 17 00:00:00 2001 From: Anders Papitto Date: Sun, 13 Dec 2015 21:41:23 -0800 Subject: [PATCH] implement recursive set binding --- Nix/Eval.hs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/Nix/Eval.hs b/Nix/Eval.hs index 0963c23..a8baf8b 100644 --- a/Nix/Eval.hs +++ b/Nix/Eval.hs @@ -1,5 +1,6 @@ {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE LambdaCase #-} +{-# LANGUAGE RecursiveDo #-} module Nix.Eval where import Control.Applicative @@ -98,9 +99,15 @@ evalExpr = cata phi phi (NList l) = \env -> Fix . NVList <$> mapM ($ env) l - -- TODO: recursive sets - phi (NSet _b binds) = \env -> - Fix . NVSet <$> evalBinds True env binds + phi (NSet recBind binds) = \env -> case env of + (Fix (NVSet env')) -> do + rec + mergedEnv <- pure $ case recBind of + Rec -> Fix $ NVSet $ evaledBinds `Map.union` env' + NonRec -> env + evaledBinds <- evalBinds True mergedEnv binds + pure mergedEnv + _ -> error "invalid evaluation environment" -- TODO: recursive binding phi (NLet binds e) = \env -> case env of @@ -181,8 +188,8 @@ evalBinds allowDynamic env xs = buildResult <$> sequence (concatMap go xs) where go _ = [] -- HACK! But who cares right now evalSelector :: Bool -> NValue -> NSelector (NValue -> IO NValue) -> IO [Text] -evalSelector dyn e = mapM evalKeyName where +evalSelector dyn env = mapM evalKeyName where evalKeyName (StaticKey k) = return k evalKeyName (DynamicKey k) - | dyn = runAntiquoted (evalString e) (fmap valueText . ($ e)) k + | dyn = runAntiquoted (evalString env) (fmap valueText . ($ env)) k | otherwise = error "dynamic attribute not allowed in this context"