Login
7 branches 0 tags
Ben (X13/Arch) WIP a25bc3e 3 years ago 651 Commits
nujel / tools / bootstrap.nuj
#!/usr/bin/env nujel
#| In here we use our bootstrap runtime to load, eval and finally precompile
 | the Nujel standard library, the eval is necessary so we can make use of macros
 | that are not within our bootstrap runtime (which is just using an old
 | precompiled stdlib).
 |#

[defn file/compile [path environment]
  "Compile a Nujel source file into optimized object code"
  [def source [cons 'do [read [file/read path]]]]
  [def object-code [-> [macroexpand/forms source environment]
                       bytecompile
                       assemble*]]
  [file/write [if object-code [str/write object-code] ""]
              [cat [path/without-extension path] ".no"]]
  object-code]

[def environment [environment*]]
[def ext-nuj? [path/ext?! "nuj"]]
[def stdlib-files [-> [directory/read-recursive "stdlib"]
                      [append [directory/read-recursive "binlib"]]
                      [flatten]
                      [filter ext-nuj?]
                      [sort]]]

#| If something happens, we just print the responsible error and exit immediately,
 | since we can't really fix things, we could only make things worse.
 |#
[try [fn [err]
         [println "Exception during stdlib compilation"]
         [display/error err]
         [exit 2]]
     [for-in [cur-path stdlib-files]
             [println [cat [ansi-green " [NUJ]  "] cur-path]]
             [file/compile cur-path environment]]]