That nasty example on p 22 of EOPL first edition
(apply apply (list procedure? (list apply)))

This gets evaluated from the inside out.

Let me show you the results of evaluating the individual parts, and I think it will make things much clearer. I added the comments after evaluating these things.

> list
#<procedure list>
> apply
#<procedure apply>
> (list apply)
(#<procedure apply>) ; a list containing one item, the apply procedure.
> procedure?         ; procedure? is a procedure.
#<procedure procedure?>
> (list procedure? (list apply))
(#<procedure procedure?> (#<procedure apply>)) ; a list of two items:
; (1) the procedure? procedure
; (2) a list containing the apply procedure.
;
; So the whole original expression is a call to apply, where the first argument
; (the function to be applied) is apply, and the second argument (the
; list of arguments to which the first argument is to be applied) is
; the list of two items described above.
> (trace procedure?)
(procedure?)
> (trace apply)
(apply)
> (apply apply (list procedure? (list apply)))
|(apply #<procedure> (#<procedure> (#<procedure>)))
; The three procedures in the above are apply, procedure?, and apply.
; When we apply the apply procedure to that list of two arguments,
; we get
|(apply #<procedure> (#<procedure>)) ; The procedures are procedure? and apply.
; Now we apply procedure? to the list containing apply:
|(procedure? #<procedure>) ; apply is a procedure, so
|#t
#t
>