* AST for Nix expressions.
This commit is contained in:
parent
21fe717ce2
commit
b9f09b3268
70
src/nix.cc
70
src/nix.cc
|
@ -23,17 +23,81 @@ using namespace std;
|
||||||
|
|
||||||
|
|
||||||
/* Database names. */
|
/* Database names. */
|
||||||
|
|
||||||
|
/* dbRefs :: Hash -> FileName
|
||||||
|
|
||||||
|
Maintains a mapping from hashes to filenames within the NixValues
|
||||||
|
directory. This mapping is for performance only; it can be
|
||||||
|
reconstructed unambiguously from the nixValues directory. The
|
||||||
|
reason is that names in this directory are not printed hashes but
|
||||||
|
also might carry some descriptive element (e.g.,
|
||||||
|
"aterm-2.0-ae749a..."). Without this mapping, looking up a value
|
||||||
|
would take O(n) time because we would need to read the entire
|
||||||
|
directory. */
|
||||||
static string dbRefs = "refs";
|
static string dbRefs = "refs";
|
||||||
static string dbInstPkgs = "pkginst";
|
|
||||||
static string dbPrebuilts = "prebuilts";
|
/* dbNFs :: Hash -> Hash
|
||||||
|
|
||||||
|
Each pair (h1, h2) in this mapping records the fact that h2 is a
|
||||||
|
normal form obtained by evaluating the value h1.
|
||||||
|
|
||||||
|
We would really like to have h2 be the hash of the object
|
||||||
|
referenced by h2. However, that gives a cyclic dependency: to
|
||||||
|
compute the hash (and thus the file name) of the object, we need to
|
||||||
|
compute the object, but to do that, we need the file name of the
|
||||||
|
object.
|
||||||
|
|
||||||
|
So for now we abandon the requirement that
|
||||||
|
|
||||||
|
hashFile(dbRefs[h]) == h.
|
||||||
|
|
||||||
|
I.e., this property does not hold for computed normal forms.
|
||||||
|
Rather, we use h2 = hash(h1). This allows dbNFs to be
|
||||||
|
reconstructed. Perhaps using a pseudo random number would be
|
||||||
|
better to prevent the system from being subverted in some way.
|
||||||
|
*/
|
||||||
|
static string dbNFs = "nfs";
|
||||||
|
|
||||||
|
/* dbNetSources :: Hash -> URL
|
||||||
|
|
||||||
|
Each pair (hash, url) in this mapping states that the object
|
||||||
|
identified by hash can be obtained by fetching the object pointed
|
||||||
|
to by url.
|
||||||
|
|
||||||
|
TODO: this should be Hash -> [URL]
|
||||||
|
|
||||||
|
TODO: factor this out into a separate tool? */
|
||||||
static string dbNetSources = "netsources";
|
static string dbNetSources = "netsources";
|
||||||
|
|
||||||
|
|
||||||
static string nixSourcesDir;
|
/* Path names. */
|
||||||
|
|
||||||
|
/* nixValues is the directory where all Nix values (both files and
|
||||||
|
directories, and both normal and non-normal forms) live. */
|
||||||
|
static string nixValues;
|
||||||
|
|
||||||
|
/* nixLogDir is the directory where we log evaluations. */
|
||||||
static string nixLogDir;
|
static string nixLogDir;
|
||||||
|
|
||||||
|
/* nixDB is the file name of the Berkeley DB database where we
|
||||||
|
maintain the dbXXX mappings. */
|
||||||
static string nixDB;
|
static string nixDB;
|
||||||
|
|
||||||
|
|
||||||
|
/* Abstract syntax of Nix values:
|
||||||
|
|
||||||
|
e := Hash(h) -- external reference
|
||||||
|
| Str(s) -- string constant
|
||||||
|
| Bool(b) -- boolean constant
|
||||||
|
| Name(e) -- "&" operator; pointer (file name) formation
|
||||||
|
| App(e, e) -- application
|
||||||
|
| Lam(x, e) -- lambda abstraction
|
||||||
|
| Exec(platform, e, e*)
|
||||||
|
-- primitive; execute e with args e* on platform
|
||||||
|
;
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
/* Download object referenced by the given URL into the sources
|
/* Download object referenced by the given URL into the sources
|
||||||
directory. Return the file name it was downloaded to. */
|
directory. Return the file name it was downloaded to. */
|
||||||
string fetchURL(string url)
|
string fetchURL(string url)
|
||||||
|
|
Loading…
Reference in a new issue