A Lisp implemented in AWK
# SPDX-License-Identifier: BSD-2-Clause

BEGIN {
    # fix the symbol numbers of the special forms
    _symbol("quote")
    _symbol("atom")
    _symbol("eq")
    _symbol("car")
    _symbol("cdr")
    _symbol("cons")
    _symbol("cond")
    _symbol("label")
    _symbol("lambda")
    _symbol("not")
    _symbol("null")
    _symbol("equal")
    _symbol("caar")
    _symbol("cadr")
    # ^^ above here, we have specific cases in _eval3, because these
    # are expected to be the most-often-used functions.

    _symbol("memq")
    _symbol("member")
    _symbol("assoc")
    _symbol("setq")
    _symbol("caaar")
    _symbol("caadr")
    _symbol("cadar")
    _symbol("caddr")
    _symbol("cdaar")
    _symbol("cdadr")
    _symbol("cddar")
    _symbol("cdddr")
    _symbol("rplaca")
    _symbol("rplacd")
    _symbol("nreverse")
    _symbol("nconc")
    _symbol("append")
    _symbol("list-length")
    _symbol("print")
    _symbol("progn")
    _symbol("macro")
    _symbol("expand1")
    _symbol("eval")
    _symbol("%other-lispy%")

    _symbol("only2+")
    _symbol("only2*")
    _symbol("only2-")
    _symbol("only2/")
    _symbol("only2//")
    _symbol("only2%")
    _symbol("only2**")
    _symbol("atan2")
    _symbol("cos")
    _symbol("sin")
    _symbol("exp")
    _symbol("log")
    _symbol("sqrt")
    _symbol("rand")
    _symbol("srand")
    _symbol("int")
    _symbol("%math%")
    
    _symbol("system")
    _symbol("tolower")
    _symbol("toupper")
    _symbol("substr")
    _symbol("index")
    _symbol("match")
    _symbol("split")
    _symbol("sub")
    _symbol("gsub")
    _symbol("printf")
    _symbol("sprintf")
    _symbol("string-length")
    _symbol("strcat")
    _symbol("getline")
    _symbol("with-ors")
    _symbol("with-rs")
    _symbol("with-fs")
    _symbol("with-output-to")
    _symbol("with-input-from")
    _symbol("fflush")
    _symbol("close")
    _symbol("gc-dot")
    _symbol("gc")
    _symbol("dump")
    _symbol("dump-dot")
    _symbol("%last-special-form%")
    
    _symbol("mapcar")
    _symbol("let")
    _symbol("foldl")
    _symbol("reduce")
    _symbol("mappend")
    _symbol("quasiquote")
    _symbol("+")
    _symbol("*")
    _symbol("-")
    _symbol("/")
    _symbol("//")
    _symbol("%")
    _symbol("**")
    _symbol("%no-gc%")
    
    # make list of these percent symbols because _eval3 compares the
    # address of the operator being eval'd against them, in order to
    # reduce the number of if-elseif-elseif-elseif... cases if the
    # operator isn't one of the most common ones.
    _COMPARED_SYMBOLS = _cons(_symbol("%other-lispy%"),
                              _cons(_symbol("%math%"),
                                    _cons(_symbol("%last-special-form%"),
                                          _cons(_symbol("%no-gc%"),
                                                _nil()))))
                                                  
}