Io has runtime macros. Messages are evaluated by the receiver and which can do whatever it wants with the message arguments (evaluate them, tear them apart and create new messages ... etc)
list(1, 2, 3, 4) select(isEven) map(+(1)) ==> list(3, 5)
isEven and +(1) are messages that select and map evaluate.
Also see: