Lisp functions are divided into two main classes. One includes functions defined as lambda expressions, which are interpreted, the other includes compiled functions and functions that are defined in the LISP system, which are accessed via function pointers. Arguments are passed to interpreted functions by lambda convention (saving the current value of the lambda dummy-argument-identifier onto an internal stack (the `alist' stack) and temporarily assigning the current argument to the dummy-argument-identifier, as value), to compiled functions the arguments are passed through the registers (internal defined static memory locations). Functions are further classified by the argument passing mechanism peculiar to them:
expr, fexpr, nexpr, and lexpr's are lambda expressions, subr, fsubr, nsubr, and lsubr's are function pointers.
In addition to these there is one more type: `macro'. A function of type macro has a single formal parameter which is bound to the entire expression invoking it, and the value returned by it is reevaluated.