diff --git a/Nix/Eval.hs b/Nix/Eval.hs
--- a/Nix/Eval.hs
+++ b/Nix/Eval.hs
@@ -29,6 +29,7 @@
     | NVList [r]
     | NVSet (Map.Map Text r)
     | NVFunction (Params r) (NValue m -> m r)
+    | NVLiteralPath FilePath
     deriving (Generic, Typeable, Functor)
 
 instance Show f => Show (NValueF m f) where
@@ -38,6 +39,7 @@
       go (NVList     list) = showsCon1 "NVList"     list
       go (NVSet     attrs) = showsCon1 "NVSet"      attrs
       go (NVFunction r _)  = showsCon1 "NVFunction" r
+      go (NVLiteralPath p) = showsCon1 "NVLiteralPath" p
 
       showsCon1 :: Show a => String -> a -> Int -> String -> String
       showsCon1 con a d = showParen (d > 10) $ showString (con ++ " ") . showsPrec 11 a
@@ -46,11 +48,12 @@
 
 valueText :: Functor m => NValue m -> Text
 valueText = cata phi where
-    phi (NVConstant a)   = atomText a
-    phi (NVStr t)        = t
-    phi (NVList _)       = error "Cannot coerce a list to a string"
-    phi (NVSet _)        = error "Cannot coerce a set to a string"
-    phi (NVFunction _ _) = error "Cannot coerce a function to a string"
+    phi (NVConstant a)    = atomText a
+    phi (NVStr t)         = t
+    phi (NVList _)        = error "Cannot coerce a list to a string"
+    phi (NVSet _)         = error "Cannot coerce a set to a string"
+    phi (NVFunction _ _)  = error "Cannot coerce a function to a string"
+    phi (NVLiteralPath p) = Text.pack p
 
 buildArgument :: Params (NValue m) -> NValue m -> NValue m
 buildArgument paramSpec arg = either error (Fix . NVSet) $ case paramSpec of
@@ -75,7 +78,7 @@
      where err = error ("Undefined variable: " ++ show var)
     phi (NConstant x) = const $ return $ Fix $ NVConstant x
     phi (NStr str) = fmap (Fix . NVStr) . flip evalString str
-    phi (NLiteralPath _) = error "Path expressions are not yet supported"
+    phi (NLiteralPath p) = const $ return $ Fix $ NVLiteralPath p
     phi (NEnvPath _) = error "Path expressions are not yet supported"
 
     phi (NUnary op arg) = \env -> arg env >>= \case
diff --git a/hnix.cabal b/hnix.cabal
--- a/hnix.cabal
+++ b/hnix.cabal
@@ -1,5 +1,5 @@
 Name:                hnix
-Version:             0.3.3
+Version:             0.3.4
 Synopsis:            Haskell implementation of the Nix language
 Description:
   Haskell implementation of the Nix language.
@@ -104,6 +104,7 @@
   Main-is: Main.hs
   Other-modules:
     ParserTests
+    EvalTests
   Build-depends:
       base >= 4.3 && < 5
     , containers
diff --git a/tests/EvalTests.hs b/tests/EvalTests.hs
new file mode 100644
--- /dev/null
+++ b/tests/EvalTests.hs
@@ -0,0 +1,51 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE OverloadedStrings #-}
+module EvalTests (tests) where
+
+import Data.Fix
+
+import Test.Tasty
+import Test.Tasty.HUnit
+import Test.Tasty.TH
+
+import Nix.Eval
+import Nix.Parser
+import Nix.Expr
+
+import Data.Monoid (Monoid(..))
+import Prelude (String)
+
+case_basic_sum :: Assertion
+case_basic_sum = constantEqualStr "2" "1 + 1"
+
+case_basic_function :: Assertion
+case_basic_function = constantEqualStr "2" "(a: a) 2"
+
+case_set_attr :: Assertion
+case_set_attr = constantEqualStr "2" "{ a = 2; }.a"
+
+case_function_set_arg :: Assertion
+case_function_set_arg = constantEqualStr "2" "({ a }: 2) { a = 1; }"
+
+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, b ? a * 3 }: b - a) { a = 1; }"
+
+tests :: TestTree
+tests = $testGroupGenerator
+
+-----------------------
+
+constantEqual :: NExpr -> NExpr -> Assertion
+constantEqual a b = do
+    Fix (NVConstant a') <- evalExpr a (Fix (NVSet mempty))
+    Fix (NVConstant b') <- evalExpr b (Fix (NVSet mempty))
+    assertEqual "" a' b'
+
+constantEqualStr :: String -> String -> Assertion
+constantEqualStr a b =
+  let Success a' = parseNixString a
+      Success b' = parseNixString b
+  in constantEqual a' b'
