[1] This function uses a feature of JavaScript called backquote (or quasiquote) that is handy for constructing lists. Preceding a list with a backquote symbol is much like quoting it, except that anything in the list that is flagged with a comma is evaluated.
[2] We can't just use the labels true_branch, false_branch, and after_if as shown above, because there might be more than one if in the program. The compiler uses the function make_label to generate labels. Make_label takes a symbol as argument and returns a new symbol that begins with the given symbol. For example, successive calls to make_label("a") would return a1, a2, and so on. Make_label can be implemented similarly to the generation of unique variable names in the query language, as follows:
let label_counter = 0;

        function new_label_number() {
            label_counter = label_counter + 1;
            return label-counter;

        function make_label(name) {
            return name + stringify(new_label_number());
[3] We need machine operations to implement a data structure for representing compiled functions, analogous to the structure for compound functions described in section 4.1.3:
function make_compiled_procedure(entry, env) {
            return list("compiled_procedure", entry, env);

        function is_compiled_procedure(proc) {
            return is_tagged_list(proc, "compiled_procedure");

        function compiled_procedure_entry(c_proc) {
            return head(tail(c_proc));

        function compiled_procedure_env(c_proc) {
            return head(tail(tail(c_proc)));
5.5.2 Compiling Expressions