aboutsummaryrefslogtreecommitdiff
path: root/src/eval.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/eval.hh')
-rw-r--r--src/eval.hh71
1 files changed, 53 insertions, 18 deletions
diff --git a/src/eval.hh b/src/eval.hh
index c1b2f2139..807f98f85 100644
--- a/src/eval.hh
+++ b/src/eval.hh
@@ -10,14 +10,14 @@ extern "C" {
using namespace std;
-/* Abstract syntax of Nix expressions.
+/* \section{Abstract syntax of Nix expressions}
An expression describes a (partial) state of the file system in a
referentially transparent way. The operational effect of
evaluating an expression is that the state described by the
expression is realised.
- File : String * Content * [Expr] -> Expr
+ File : Path * Content * [Expr] -> Expr
File(path, content, refs) specifies a file object (its full path
and contents), along with all file objects referenced by it (that
@@ -25,12 +25,13 @@ using namespace std;
self-referential. This prevents us from having to deal with
cycles.
- Derive : String * Expr * [Expr] * [String] -> Expr
+ Derive : String * Path * [Expr] * [Expr] * [Expr] -> Expr
- Derive(platform, builder, ins, outs) specifies the creation of new
- file objects (in paths declared by `outs') by the execution of a
- program `builder' on a platform `platform'. This execution takes
- place in a file system state and in an environment given by `ins'.
+ Derive(platform, builder, ins, outs, env) specifies the creation of
+ new file objects (in paths declared by `outs') by the execution of
+ a program `builder' on a platform `platform'. This execution takes
+ place in a file system state given by `ins'. `env' specifies a
+ mapping of strings to strings.
Str : String -> Expr
@@ -40,39 +41,73 @@ using namespace std;
Tuples of expressions.
- Regular : String -> Content
- Directory : [(String, Content)] -> Content
- Hash : String -> Content
+ [ !!! NOT IMPLEMENTED
+ Regular : String -> Content
+ Directory : [(String, Content)] -> Content
+ (this complicates unambiguous normalisation)
+ ]
+ CHash : Hash -> Content
- File content, given either explicitly or implicitly through a cryptographic hash.
+ File content, given either in situ, or through an external reference
+ to the file system or url-space decorated with a hash to preserve purity.
- The set of expressions in {\em $f$-normal form} is as follows:
+ DISCUSSION: the idea is that a Regular/Directory is interchangeable
+ with its CHash. This would appear to break referential
+ transparency, e.g., Derive(..., ..., [...CHash(h)...], ...) can
+ only be reduced in a context were the Regular/Directory equivalent
+ of Hash(h) is known. However, CHash should be viewed strictly as a
+ shorthand; that is, when we export an expression containing a
+ CHash, we should also export the file object referenced by that
+ CHash.
- File : String * Content * [FExpr] -> FExpr
- These are completely evaluated Nix expressions.
+ \section{Reduction rules}
+
+ ...
+
- The set of expressions in {\em $d$-normal form} is as follows:
+ \section{Normals forms}
+
+ An expression is in {\em weak head normal form} if it is a lambda,
+ a string or boolean value, or a File or Derive value.
+
+ An expression is in {\em $d$-normal form} if it matches the
+ signature FExpr:
File : String * Content * [DExpr] -> DExpr
- Derive : String * DExpr * [Tup] * [String] -> DExpr
+ Derive : String * Path * [Tup] * [Tup2] -> DExpr
Tup : Str * DExpr -> Tup
Tup : Str * Str -> Tup
+ Tup : Str * Str -> Tup2
+
Str : String -> Str
These are Nix expressions in which the file system result of Derive
expressions has not yet been computed. This is useful for, e.g.,
querying dependencies.
+ An expression is in {\em $f$-normal form} if it matches the
+ signature FExpr:
+
+ File : String * Content * [FExpr] -> FExpr
+
+ These are completely evaluated Nix expressions.
+
*/
typedef ATerm Expr;
+typedef ATerm Content;
+
+/* Expression normalisation. */
+Expr whNormalise(Expr e);
+Expr dNormalise(Expr e);
+Expr fNormalise(Expr e);
-/* Evaluate an expression. */
-Expr evalValue(Expr e);
+/* Realise a $f$-normalised expression in the file system. */
+void realise(Expr e);
/* Return a canonical textual representation of an expression. */
string printExpr(Expr e);