Да, конечно, и не требует каких-либо особых маги c.
Просто определите одно, а затем другое. Если вы сделаете это в REPL, или выборочно оценив отдельные определения из файла, или загрузив источник файла, то вы можете получить предупреждение при определении первой функции, пока не будет определена вторая функция (так что вы ' Я получу это только в первый раз, когда вы определите первую функцию):
cl-user> (defun foo (x)
(if (null x)
1
(bar (rest x))))
; in: defun foo
; (BAR (REST X))
;
; caught style-warning:
; undefined function: common-lisp-user::bar
;
; compilation unit finished
; Undefined function:
; bar
; caught 1 STYLE-WARNING condition
foo
cl-user> (defun bar (x)
(foo x))
bar
cl-user> (foo '(1 2 3))
1
cl-user>
На практике вы, вероятно, будете получать подобные предупреждения только в реализациях только для компилятора, таких как SBCL и CMUCL. Нет причин, по которым другие реализации также не должны предупреждать: они обычно этого не делают, потому что такие предупреждения обычно раздражают. Их просто нелегко избежать в реализациях только для компилятора, если вы хотите видеть предупреждения, когда действительно является отсутствующим определением.
Если вы просто поместите две функции в файл и скомпилируйте их:
cl-user> (compile-file "/tmp/x.lisp" :load t)
; Evaluation aborted on #<unknown-keyword-argument {100219F653}>.
cl-user> (load (compile-file "/tmp/x.lisp"))
; compiling file "/tmp/x.lisp" (written 21 APR 2020 04:35:27 PM):
; compiling (defun foo ...)
; compiling (defun bar ...)
; wrote /tmp/x.fasl
; compilation finished in 0:00:00.002
t
cl-user> (foo '(1 2 3 4))
1
Вы не получите никаких предупреждений.
В частности, в SBCL (и, вероятно, CMUCL) вы можете предотвратить предупреждения при загрузке исходных файлов, используя with-compilation-unit
:
cl-user> (with-compilation-unit ()
(load "/tmp/x.lisp"))
t
Это откладывает предупреждения от компилятора до конца формы, после чего все они отсутствуют. Я не думаю, что на это можно положиться (я думаю, что это безопасно для других реализаций, но они все равно могут предупредить).
(Обратите внимание, что каждый приведенный выше отрывок взят из fre sh SBCL.)