C++ has an attribute on functions called [[nodiscard]]
that instructs the compiler to make sure you do something with a result.
C++ attribute: nodiscard (since C++17) - cppreference.com
I've long wondered about whether there's some kind of discard-sensitivity that should/could be thrown in, e.g. for noticing when a stray value in evaluation doesn't do anything:
>> append [a b c] [d e] 2 print "Could we error?"
** Error: 2 was discarded
How much code would break if we didn't allow stray values like that in the evaluator? I could actually test that question.
Anyway, the mechanics behind RAISE means there's already a place to implement this. There's a spot where it is decided if a definitional error would be discarded, and if so it's escalated to an abrupt failure. It's only okay if it falls out of the evaluation to get picked up by someone else, and stays as a hot potato.
But could we have other hot potatoes? Results of functions that are marked NO-DISCARD? Plain values?
I can't offhand think of any important techniques this would break. But I'll have to try it and see.