Both the internal and external function are behaving the same - they receive a list.
The evaluation happens prior to invocation (so it's not "the function" that is doing the evaluation but the call site invoking it).
Here, the argument to
helper is the symbol
expr. Symbols are evaluated by resolving that "name" to a value in the current lexical context, here defined in the defmacro parameters. It resolves to a list
(+ 1 2). That list is passed to the function. Evaluating that list would require evaluating the argument twice!
Macro expansion is not evaluation and the arguments are not evaluated.