diff --git a/asdf.asd b/asdf.asd
index 9d7c0bc46f9c1771b28f1b38c821dc2b7d00197d..e2c183602d80c7cc85b3a680b4c6663e8b36a8ec 100644
--- a/asdf.asd
+++ b/asdf.asd
@@ -14,7 +14,7 @@
   :licence "MIT"
   :description "Another System Definition Facility"
   :long-description "ASDF builds Common Lisp software organized into defined systems."
-  :version "2.018.11" ;; to be automatically updated by bin/bump-revision
+  :version "2.018.12" ;; to be automatically updated by bin/bump-revision
   :depends-on ()
   :components
   ((:file "asdf")
diff --git a/asdf.lisp b/asdf.lisp
index f38c2efd1ba635c4206fa1aad99190dbf1b8e16d..4c4bded603aca4eb72254d18daf0a6d1e324a13f 100644
--- a/asdf.lisp
+++ b/asdf.lisp
@@ -1,5 +1,5 @@
 ;;; -*- mode: Common-Lisp; Base: 10 ; Syntax: ANSI-Common-Lisp -*-
-;;; This is ASDF 2.018.11: Another System Definition Facility.
+;;; This is ASDF 2.018.12: Another System Definition Facility.
 ;;;
 ;;; Feedback, bug reports, and patches are all welcome:
 ;;; please mail to <asdf-devel@common-lisp.net>.
@@ -107,7 +107,7 @@
          ;; "2.345.6" would be a development version in the official upstream
          ;; "2.345.0.7" would be your seventh local modification of official release 2.345
          ;; "2.345.6.7" would be your seventh local modification of development version 2.345.6
-         (asdf-version "2.018.11")
+         (asdf-version "2.018.12")
          (existing-asdf (find-class 'component nil))
          (existing-version *asdf-version*)
          (already-there (equal asdf-version existing-version)))
@@ -2377,6 +2377,7 @@ recursive calls to traverse.")
 (defun ensure-function (fun &key (package :asdf))
   (etypecase fun
     ((or symbol function) fun)
+    (cons (eval `(function ,fun)))
     (string (eval `(function ,(with-standard-io-syntax
                                (let ((*package* (find-package package)))
                                  (read-from-string fun))))))))
diff --git a/doc/asdf.texinfo b/doc/asdf.texinfo
index c1a4f59400341570bc7bf347682e575d34da379f..315a8646debf88b9387b642631471888e9189bef 100644
--- a/doc/asdf.texinfo
+++ b/doc/asdf.texinfo
@@ -2836,15 +2836,23 @@ the value will be inherited from the parent component if any,
 or with a default of @code{nil}
 if no value is specified in any transitive parent.
 
-The argument must be a either @code{nil}, a function, a fbound symbol,
+The argument must be a either @code{nil}, a fbound symbol,
+a lambda-expression (e.g. @code{(lambda (thunk) ...(funcall thunk) ...)})
+a function object (e.g. using @code{#.#'} but that's discouraged
+because it prevents the introspection done by e.g. asdf-dependency-grovel),
 or a string that when read yields a symbol or a lambda-expression.
 @code{nil} means the normal compile-file function will be called.
 A non-nil value designates a function of one argument
 that will be called with a thunk for calling
 the compile-file function with proper arguments.
-Note that by using a string, you may reference a symbol and/or package
+
+Note that by using a string, you may reference
+a function, symbol and/or package
 that will only be created later during the build, but
-isn't present at the time the defsystem form is evaluated.
+isn't yet present at the time the defsystem form is evaluated.
+However, if your entire system is using such a hook, you may have to
+explicitly override the hook with @code{nil} for all the modules and files
+that are compiled before the hook is defined.
 
 Using this hook, you may achieve such effects as:
 locally renaming packages,