1. I see why common lisp uses the &optional delimiter and parens around each optional arg: long lists of alternating vars and defaults are hard to read.
2. I see why racket asks for both keyword name and argument name when creating keyword args: otherwise you have to trade off readability within the function against readability of function calls.
Maybe some strategic whitespace could help:
(def accumulate (over ? starting nil taking car
next cdr until no)