Semantic late binding
Dynamic dispatch asks which implementation handles a known message. Semantic late binding asks what message the receiver believed it received.
The meaning is not fully fixed by the sender. It is resolved by the receiver, in context, at runtime.
Read the notes
Ruby and Smalltalk already bind late. bartender.send(:pour, :whiskey) works because the message names a method and lookup happens at runtime โ the receiver decides which implementation runs. That's dynamic dispatch, and it's why Ruby feels alive next to static OOP.
Now send bartender.send("I've had a day.") There is no method by that name. A prompt object doesn't raise NoMethodError โ it interprets. Pour a whiskey? Pour a water? Ask a question back? The receiver resolves what the message means before deciding what to do about it.
That's the shift: dynamic dispatch binds the implementation late; semantic late binding binds the meaning late. When you drive agents โ or prompt objects โ programmatically, you aren't calling functions with fixed contracts. You're passing messages whose meaning is resolved by the receiver, in context, at runtime. It's the extreme late binding Alan Kay wanted, one step further. Ruby was accidentally built for it.