Then we can safely define either
keyword → ⟨identifier⟩ :
(DSSSL style)
*or*
keyword → : ⟨identifier⟩
(Common Lisp style)
in Large, no? Assuming we choose to have some kind of lexical keyword type (which I think would be a good idea, notwithstanding programs that use them probably automatically lose small portability).
Yes, given that we are able to swallow that incompatibility. The WG2 charter says "Every program that conforms to the specifications produced by working group 1 (and relies on no features beyond those guaranteed by those specifications) must also be a program that conforms to the specifications produced by working group 2." This implies to me that we must maintain backward compatibility; it is not enough that ':foo is a program in both R7RS-small and R7RS-large; it must mean the same thing in both languages.
Okay, so there’s some internal magic going on here to detect which keywords were actually passed and supply the defaults, despite there being no defaults in the method signature? Or does CL have another way to do that detection?
What I gave you was the abbreviated form given in the spec, and the default values are in the prose. An actual lambda-list for make-array would be:
(dimensions &key
(element-type t) ; default is t
adjustable ; default is nil, could also be written (adjustable)
fill-pointer
displaced-to
(displaced-index-offset 0)
(initial-element nil initial-element-supplied-p)
(initial-contents nil initial-element-supplied-p))
In the last two cases, the default value is by convention nil, but the two -supplied-p identifiers ("-p" is how CL spells "?") are locally bound variables that are true if the corresponding keywords were passed by the caller and false otherwise. This allows a distinction between a missing keyword and a supplied keyword whose value is the default.
Like many CL things, it's heavyweight, but it does everything.