Previous page Table of Contents Next page
Everything about the language is to be defined in the language itself. The language is to be fully extensible by users, with no magic. Of course to be implementable this requires bootstrapping.
Anything that must be intrinsically known to the compiler is explicitly marked.
Define as much as possible by the binding of names to values.
Use naming conventions in place of Common Lisp's multiple name-binding spaces for functions, variables, types, and packages.
Discourage assignment, and make it syntactically obvious where it is allowed or occurs. But do not forbid it.
Discourage unnecessary type declarations, but allow them where needed.
Use hygienic macros pervasively.
Language-enforced access control is incompatible with macros and with debugging within the language, so do not attempt to provide that type of feature. Use naming conventions and social enforcement instead.
Arithmetic operations must always produce mathematically correct results. No insanity like (x + y) / 2 is sometimes a negative number when both x and y are positive.
Strive for programs to be readable yet concise. Hence use infix syntax, case-insensitive names, and nesting structure indicated by indentation rather than punctuation.
Minimize the use of punctuation and maximize the use of whitespace, for readability.
Avoid abbreviation, but when you must abbreviate, do it consistently.
Strive for simple concepts that combine in powerful ways. Keep removing unnecessary complex features until no more can be removed.
Take full advantage of classes and methods.
Do not conflate the concepts of class, module, scope, and encapsulation. Use simple concepts that combine in powerful ways instead of one overly powerful concept that tries to do everything.
Previous page Table of Contents Next page