Sorry, I thought you were talking about the ARGS
abuse-of-notation I was using to hide the out variable. With a standard return mechanism, you could hypothetically write it as:
NAME := fun_expr(format_name(get_first_and_last()))
message(${NAME})
which is cleaner, but does not avoid the name binding, true. On the other hand, the name binding seems less bad when the message is more complex…
NAME := fun_expr(format_name(get_first_and_last()))
message("Hello, ${NAME}!")