Scheme macros are compile-time (or parse-time) transformations, transforming their arguments syntactically into Scheme code called the expansion of the macro. Here we concentrate on their expansions, thinking of them as special kinds of inlined functions.
Below, when we talk of calling and executing a macro, we mean executing the expansion code. When we talk of the effect of the arguments to a macro, we mean the effect at runtime (which comes from their effect on the expansion). When we talk about the value returned by a macro, we mean the value of the expansion, which is substituted in-place like any expression's value (including a function call expression).
A function gets values from the caller's environment through arguments computed by the caller. The caller's environment is unchanged (except if the function is defined in an overlapping scope). The caller receives a value back.
A macro also gets values from the caller's environment through arguments computed by the caller. Hygienic macros may also access and modify bindings in the caller's environment for identifiers included syntactically in the arguments. Non-hygienic macros may access and modify arbitrary bindings in the caller's environment. The caller also receives back the result of evaluating the expansion expression.
Arguments to a function are evaulated once before the function executes.
Arguments to a macro may be evaluated any number of times (including none), at any time during the duration of the macro call.
Arguments to a function are treated as Scheme code to be automatically evaluated. The caller can quote them so the evaluation produces s-expression data.
Arguments to macros are treated as Scheme code to be evaluated or s-expression data, with the macro deciding which.