  GNU Guix is a " functional " package manager that builds upon earlier work on
Nix. Guix implements high-level abstractions such as packages and operating
system services as domain-specic languages (DSLs) embedded in Scheme. It also
implements build actions and operating system orchestration in Scheme. This
leads to a multi-tier programming environment where embedded code snippets are
staged for eventual execution. This paper presents G-expressions or " gexps ",
the staging mechanism we devised for Guix. We explain our journey from
traditional Lisp S-expressions to G-expressions, which augment the former with
contextual information and ensure hygienic code staging. We discuss the
implementation of gexps and report on our experience using them in a variety of
operating system use cases-from package build processes to system services.
Gexps provide a novel way to cover many aspects of OS connguration in a single,
multi-tier language, while facilitating code reuse and code sharing .
