strict non-strict side-effect referential transparency manifest typing (or implicit typing) closures macros continuations functional programming logic programming LISP PROLOG Scheme Haskell ML Smalltalk lazy evaluation type systems formal languages and grammars bindings scope parameter passing type inference currying partial evaluation call/cc tail calls continuation-passing~style first-order predicate logic message passing control reflection dynamic binding Squeak homoiconic languages meta-circular interpreters interpreters compilers syntax semantics higher-order functions strong typing generative programming meta-programming aspect-oriented programming reification reify weak typing