ImplicitLazyEvaluation occurs whenever a language provides a mechanism for lazy evaluation which requires no work on the code evaluating a lazy expression (it may require an explicit declaration of laziness/strictness at the point a function or a variable is defined, especially if laziness is not the default semantics). It is found in lazy functional languages like HaskellLanguage, as well as others which have lazy evaluation (or CallByName) as a declaration option (e.g., OzLanguage). In addition, many strict languages have lazy operators/special forms. The primary difference between explicit and implicit lazy evaluation is that the code ''performing'' the evaluation has to know the difference in explicit evaluation. If you want to use Smalltalk blocks to perform lazy evaluation, you must send them the "value" message when you want to retrieve the value. In SchemeLanguage, similarly, you must use (force x) to evaluate x when x is a lazy form. Contrast with Haskell or OzLanguage, where merely mentioning a lazy form in a context which requires its value forces evaluation. Examples: * Haskell and its cousins (MirandaLanguage, O'Haskell, etc.) are lazy by default. * Most imperative languages have lazy conditional and boolean operators. In C, C++, Java, C#, etc... the && and || operators are lazy in their second argument, the ? : operator is lazy in the second and third arguments. Similarly, the if/else and switch statements in these languages are also lazy. cond in LispLanguage is also lazy. VisualBasic has OrElse and AndThen which are lazy (it also has Or and And which are strict). Excluding macros, none of these languages provide ways for the user to write their own lazy forms, other than with ExplicitLazyEvaluation (though CommonLisp might... does it?). * Most macro systems implement NormalOrderEvaluation. * CeePlusPlus templates are notoriously lazy. (The C++ template system is a TuringComplete lazy FunctionalProgrammingLanguage in its own right, though not a very good one). * OzLanguage allows variables to be declared lazy. ---- See also ExplicitLazyEvaluation CategoryLazyPattern