In version 1.366 I see the following:
(do-dep (op dep) (cond ((eq op 'feature) (or (member (car dep) *features*) (error 'missing-dependency :required-by c :requires (car dep)))) (t (dolist (d dep) (cond ((consp d) (cond ((string-equal (symbol-name (first d)) "VERSION") (appendf forced (do-one-dep op (second d) (third d)))) ((and (string-equal (symbol-name (first d)) "FEATURE") (find (second d) *features* :test 'string-equal)) (appendf forced (do-one-dep op (second d) (third d)))) (t (error "Bad dependency ~a. Dependencies must be (:version <version>), (:feature <feature>), or a name" d)))) (t (appendf forced (do-one-dep op d nil))))))))
I really wish there was a comment here, since I don't know why there are two branches that seem to handle feature, and that handle it differently (why does the former just eq match and the latter do the more careful string-equal testing?).
Looks like there might be two ways that :feature is trying to be handled --- one where it's (feature <feat>) and one where it's (feature <feat> <dep>).
Alas, the manual does not seem to clarify this. This, I think is a problem with the manual's design. In the discussion of DEFSYSTEM we have two example pages, and then we have the grammar. The grammar specifies the /syntax/ of defsystem, but there really isn't any way to specify the /semantics/ of bits of defsystem. Note that the operations (object model) bit of the manual does /not/ serve this purpose. It would be OK for us to specify the semantics in terms of those operations, but we do not do so. If we were to do so we would need to add a section that bridges from the syntax to the object model by specifying how the syntax gets rewritten into the object model.
I would not favor defining the semantics in terms of the object model, although this would be a principled thing to do. I believe that ASDF users should be able to use ASDF at some limited level without having to fully understand the object model.
Proposal: In my copious free time, I will work to add a page to the manual that comes /after/ the defsystem grammar and that describes the semantics of the defsystem form. Please jump in and object now if you think that this would be A Bad Idea, as I'd rather not waste my time if the community thinks this would not be worth doing.
Best, Robert