// Code to initialize primitive functions. // // File: prims.cc // Author: course // Version: 3 #include "lisp.h" #include "prims.h" static void make_primitive (char * name, c_function cfun) { symbol * s = make_symbol (name); preserve (s); set_symbol_function (s, make_function (cfun, false)); release (); } static void make_special (char * name, c_function cfun) { symbol * s = make_symbol (name); preserve (s); set_symbol_function (s, make_function (cfun, true)); release (); } void initialize_primitive_functions () { // Arithmetic Functions // make_primitive ( "+", prim_plus ); make_primitive ( "-", prim_diff ); make_primitive ( "*", prim_times ); make_primitive ( "FLOOR", prim_floor ); make_primitive ( "MOD", prim_mod ); make_primitive ( "EXPT", prim_expt ); make_primitive ( "RANDOM", prim_random ); // Arithmetic Comparison Functions // make_primitive ( "=", prim_matheq ); make_primitive ( "<", prim_mathlt ); // List Manipulating Functions // make_primitive ( "CONS", prim_cons ); make_primitive ( "CAR", prim_car ); make_primitive ( "CDR", prim_cdr ); // Primitive Predicates // make_primitive ( "BOUNDP", prim_boundp ); make_primitive ( "SYMBOLP", prim_symbolp ); make_primitive ( "FIXNUMP", prim_fixnump ); make_primitive ( "PRIMITIVE-FUNCTIONP", prim_primitive_functionp ); make_primitive ( "SPECIAL-PRIMITIVEP", prim_special_primitivep ); make_primitive ( "CONSP", prim_consp ); make_primitive ( "EQL", prim_eql ); // Symbol Primitives // make_primitive ( "SYMBOL-VALUE", prim_symbol_value ); make_primitive ( "SYMBOL-FUNCTION", prim_symbol_function ); make_primitive ( "SYMBOL-PLIST", prim_symbol_plist ); // Mutators // make_primitive ( "RPLACA", prim_rplaca ); make_primitive ( "RPLACD", prim_rplacd ); make_primitive ( "SET", prim_set ); make_primitive ( "SET-SYMBOL-FUNCTION", prim_set_symbol_function ); make_primitive ( "SET-SYMBOL-PLIST", prim_set_symbol_plist ); make_special ( "SETQ", prim_setq ); // Input and Output Primitives // make_primitive ( "READ", prim_read ); make_primitive ( "PRINC", prim_princ ); make_primitive ( "TERPRI", prim_terpri ); make_primitive ( "LOAD", prim_load ); make_primitive ( "RUN", prim_run ); // Miscellaneous Primitives // make_primitive ( "FUNCALL", prim_funcall ); make_special ( "FUNCTION", prim_function ); make_special ( "QUOTE", prim_quote ); make_special ( "COND", prim_cond ); make_primitive ( "EVAL", prim_eval ); make_primitive ( "MACROEXPAND-1", prim_macroexpand_1 ); make_primitive ( "APPLY", prim_apply ); make_primitive ( "GC", prim_gc ); make_primitive ( "GC-LIMIT", prim_gc_limit ); make_primitive ( "SET-GC-LIMIT", prim_set_gc_limit ); make_primitive ( "ERROR", prim_error ); make_primitive ( "EXIT", prim_exit ); }