A reflective programming language provides means to render explicit what is typically abstracted away in its language constructs in an on-demand style. In the early 1980’s, Brian Smith introduced a gen- eral recipe for building reflective programming languages with the notion of procedural reflection. It is an excellent framework for understanding and comparing various metaprogramming and reflective approaches, in- cluding macro programming, first-class environments, first-class contin- uations, metaob ject protocols, aspect-oriented programming, and so on. Unfortunately, the existing literature of Brian Smith’s original account of procedural reflection is hard to understand: It is based on terminology derived from philosophy rather than computer science, and takes con- cepts for granted that are hard to reconstruct without intimate knowl- edge of historical Lisp dialects from the 1960’s and 1970’s. We attempt to untangle Smith’s original account of procedural reflection and make it accessible to a new and wider audience. On the other hand, we then use its terminological framework to analyze other metaprogramming and reflective approaches, especially those that came afterwards.