Why CMake functions can't return value?

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}!")