Oh. See that's another game design decision.
Nothing prevents you from typing:
unlock @door, <action to get the key>
But when doing user testing, lots of non-coders got stuck at this point. It's clearer to them when things happen one after the other.
So, if I can find a good way to teach them that when you do a(b(c))) first, b is called first, then a with the return value of b - without making a lenghty tutorial-type explanation, I'll do it.
In the meantime, this'll do :)