[plt-scheme] keywords (a backward-incompatible change)
With version 299.403, we plan to add keywords to MzScheme. Keywords are
self-quoting, symbol-like values that can be used for keyword-based
optional arguments.
For now, we've settled on colon-prefixed keywords --- which means that
a symbol or identifier can't start with an unquoted colon:
(keyword? :a) ; => #t
(eq? :a ':a) ; => #t
(keyword? ':a) ; => #t
(keyword? 'a) ; => #f
(keyword? ':|a b|) ; => #t
(keyword? '|:a b|) ; => #f
(keyword? :) ; => #t
(symbol? :a) ; => #f
(symbol? :) ; => #f
(lambda (:x) 10) ; => syntax error: :x is not an identifier
Pros:
* Self-quoting keywords support keyword-based optional arguments with
a relatively standard syntax.
* Syntactic forms can also use keywords, and pattern matching "just
works". Using keywords can help clarify when a syntactic form
expects to match literals (e.g., the colon in a `compound-unit/sig'
form) versus bindings (e.g., `quasiquote' in a `match' pattern).
* Some people like the idea of keywords, and they'll put them to good
use.
Cons:
* R5RS allows a colon at the beginning of a symbol/identifier, and
some of our code uses identifiers that start with a colon. Adding
keywords of this form is a significant backward-incompatible change.
* Some people dislike the idea of keywords, and they'll be forced to
use libraries that depend on keywords.
To help port code, `#k-' can be used in front of an S-expression to
disable keywords, just like `#ci' selects case-insensitive parsing. For
example, if a module uses colon-prefixed identifiers/symbols and the
module does not need keywords, then it can be prefixed with `#k-'.
Naturally, `#k+' would enable keyword parsing, so `#k+:apple' is always
the keyword `:apple'.
Assuming that we add keywords to MzScheme, a MzLib library will quickly
follow for defining procedures with keyword-based arguments. MzScheme's
built-in `lambda' and `case-lambda' will not change.
Among the people that I've polled so far, this plan has been relatively
uncontroversial; discussion quickly turns to the best uses keywords,
instead of whether they should exist or how they should be written. So
I'm broadening the poll here...
Opinions?
Matthew