1. I have never understood why I can't write (f . args) in place of (apply f args). It's not as if there is some other, better way to interpret a literal pair. If I could do this, it would render apply superfluous. 2. By having def and =, we're probably multiplying entities unnecessarily. A single, smarter primitive, like PLT-style define, would be simpler: we could write something like
(= ((foo . args) (arg11 arg12 arg13) (arg21 arg22)) <code>)
and have a function that takes any number of arguments, and returns a function that takes as arguments one list of exactly three things and one list of exactly two things. 3. If we're Huffman coding the language, & and | have a clear advantage over and/or. If we're going to have bitwise operators, && and || ought to be bitwise and/or. (C gets this backwards---boolean operations are far more common than bitwise.) 4. Scheme has the naming convention that methods changing state end in !. It may be possible to auto-generate a state-changing method from a functional one, for example sort! from sort. It would be interesting if ! were dealt with syntactically in this way---if appending ! to a function set its first argument to the retval of the function. The conversion to S-expressions is of course (foo! x . args) -> (= x (foo x . args)) |