An extensive revision of ALGOL 60 by Adriaan van Wijngaarden et al. ALGOL 68 was discussed from 1963 by Working Group 2.1 of IFIP. Its definition was accepted in December 1968. ALGOL 68 was the first, and still one of very few, programming languages for which a complete formal specification was created before its implementation. However, this specification was hard to understand due to its formality, the fact that it used an unfamiliar metasyntax notation (not BNF) and its unconventional terminology. One of the singular features of ALGOL 68 was its orthogonal design, making for freedom from arbitrary rules (such as restrictions in other languages that arrays could only be used as parameters but not as results). It also allowed user defined data types, then an unheard-of feature. It featured structural equivalence; automatic type conversion ("coercion") including dereferencing; flexible arrays; generalised loops (for-from-by-to-while-do-od), if-then-else-elif-fi, an integer case statement with an 'out' clause (case-in-out-esac); skip and goto statements; blocks; procedures; user-defined operators; procedure parameters; concurrent execution (par-begin-end); semaphores; generators "heap" and "loc" for dynamic allocation. It had no abstract data types or separate compilation.