From time to time I come across concepts in programming that take a certain number of exposures to grasp. Things like: tail calls, futures, monads, coroutines, closures, call/cc.
The common theme is that they cannot be explained in terms of the concepts I already know, so have to somehow develop a new vocabulary for them. But even once I think I understand a given concept I am still not really sure if I do.
I am wondering if you know of any effective ways to illustrate or explain such concepts graphically. I'm no good at following a formal mathematical exposition so that unfortunately doesn't help at all.