LVAL xatom() { LVAL arg; arg = xlgetarg(); xllastarg(); return (atom(arg) ? true : NIL); } /* xsymbolp - is this an symbol? */ LVAL xsymbolp() { LVAL arg; arg = xlgetarg(); xllastarg(); return (arg == NIL || symbolp(arg) ? true : NIL); } /* xnumberp - is this a number? */ LVAL xnumberp() { LVAL arg; arg = xlgetarg(); xllastarg(); return (fixp(arg) || floatp(arg) ? true : NIL); }型の比較,引数のチェックなどはxlisp.hなどにマクロとして定義されています.
/* type predicates */ #define atom(x) ((x) == NIL || ntype(x) != CONS) #define null(x) ((x) == NIL) #define listp(x) ((x) == NIL || ntype(x) == CONS) #define consp(x) ((x) && ntype(x) == CONS) #define subrp(x) ((x) && ntype(x) == SUBR) #define fsubrp(x) ((x) && ntype(x) == FSUBR) #define stringp(x) ((x) && ntype(x) == STRING) #define symbolp(x) ((x) && ntype(x) == SYMBOL) #define streamp(x) ((x) && ntype(x) == STREAM) #define objectp(x) ((x) && ntype(x) == OBJECT) #define fixp(x) ((x) && ntype(x) == FIXNUM) #define floatp(x) ((x) && ntype(x) == FLONUM) #define vectorp(x) ((x) && ntype(x) == VECTOR) #define closurep(x) ((x) && ntype(x) == CLOSURE) #define charp(x) ((x) && ntype(x) == CHAR) #define ustreamp(x) ((x) && ntype(x) == USTREAM) #define structp(x) ((x) && ntype(x) == STRUCT) #define boundp(x) (getvalue(x) != s_unbound) #define fboundp(x) (getfunction(x) != s_unbound) /* argument list parsing macros */ #define xlgetarg() (testarg(nextarg())) #define xllastarg() {if (xlargc != 0) xltoomany();} #define testarg(e) (moreargs() ? (e) : xltoofew()) #define typearg(tp) (tp(*xlargv) ? nextarg() : xlbadtype(*xlargv)) #define nextarg() (--xlargc, *xlargv++) #define moreargs() (xlargc > 0)