Hi, this is a nifty blog. I just thought I'd make a slight nitpick, regarding the statement

"That approach, known as "calling by value," is inefficient. It is well-known that languages that implement call-by-value semantics suffer performance penalties."

This is a bit misleading. Modern languages can implement a form of call-by-reference behind the scenes, where rather than make a new copy of an argument, they keep track of whether its value is modified. If the argument doesn't change, a new copy is not made. Semantically speaking this is equivalent to call-by-value, but without the performance hit of copying everything.