ISSUE: flush-symbols REVISION HISTORY: Rob MacLachlan, 1 February 94 STATUS: open RELATED ISSUES: consistent-character-escape-mechanism CATEGORY: change PROBLEM DESCRIPTION: Currently there are two similar notations: #`name` Represents a symbol literal, except when it appears inside of a list or vector literal, in which case the # is optional. name: Represents a keyword literal. The Dylan book explains the difference between symbols and keywords by saying that: "Symbols are used for creating named variables in Dylan. Keywords are not." But this is simply not true. There is no way to create a named variable from from a symbol in Dylan, and this is in fact incompatible with hygenic macros and a compile-time module system. The current infix lexical conventions use ``symbol'' as the name for the non-terminal associated with Dylan variable names, but this is gratuitous and confusing, as there is no need for any mention of objects in discussion of the semantics of Dylan variables. Given that objects do *not* name variables, what good are they? Symbols could serve the same role they serve in Scheme: naming discrete elements of a symbolic enumeration, like: #(`red`, `blue`, `green`). But why use symbols instead of keywords? The only reason is purely stylistic. Use of keywords for purposes other than naming keyword arguments could result in function calls that are visually somewhat hard to parse: file-position(stream, n, from: #`current`) file-position(stream, n, from: current:) Many people feel that #`name` is far too ugly and verbose for representing an element of an enumeration. PROPOSAL: Eliminate symbols: Remove the class. Remove the #` syntax. Remove the AS methods for (, ) and (, ) RATIONALE: Simplifies the language: -- Eliminates the need to explain the difference between keywords and symbols. -- Eliminates a class and a literal syntax. -- Eliminates the need for an exception to symbol literal syntax inside of list or vector literals. Eliminates the problem that #`name` is too ugly. EXAMPLES: Before: #`name` #(`red`, `blue`, `green`) file-position(stream, n, from: #`current`) After: name: #(red:, blue:, green:) file-position(stream, n, from: current:) COST TO IMPLEMENTORS: none COST TO USERS: The only known problem is the visual confusion that results when a keyword is passed as the value of a keyword argument. PERFORMANCE IMPACT: none BENEFITS: simplifies the language AESTHETICS: prettier enumeration values FUTURE FEATURES: Could conceivably conflict with a Lisp-like macro system, but hygenic macro systems tend to have their own identifier object anyway.