Вы не должны поместить функции в тот же файл в Common Lisp для них, чтобы быть в одной и той же единице компиляции.
Выполнение этого анти-шаблона; большие программы, конечно, построены из модулей, большинство из которых вызывают функции, которые находятся в другом модуле. Вы не можете перевернуть всю программу в один физический модуль, чтобы избежать предупреждения об этом.
Лисп имеет механизм, с помощью которого кластер компилирует рассматривается как единое целое обобщение: with-compilation-unit
макрос:
(with-compilation-unit
(compile-file "file-f")
(compile-file "file-f2"))
Если вы используете систему ASDF сборки, я припоминаю, что делает with-compilation-unit
под капот для вас, вокруг всех файлов системы.
Этот подход поможет устранить те предупреждения, которые отложены. То есть, если реализация предупреждает о неопределенных идентификаторах, но откладывает до конца блока компиляции, тогда, если вы используете этот макрос, отсрочка расширяется до конца полного блока компиляции, охватывающего несколько файлов.
Когда предупреждения о неопределенных идентификаторах отложены, цель состоит в том, чтобы устранить эти предупреждения. Если определение ранее не заданной функции появляется до конца блока перевода, предупреждение может быть подавлено. Этот макрос позволяет определять в одном файле подавление отложенного предупреждения в другом файле.
Если реализация не откладывает предупреждения, макрос не поможет.
Очень ценный, я искал это в течение очень долгого времени. ;-) И это работает с декламацией. - Кстати, даже я поставил обе функции в один и тот же файл, sbcl по-прежнему дает неопределенное предупреждение о функции. –
@lll Возможно, вы просто загрузили файл, а не сначала его компилировали. Из repl используйте '(load (compile-file" file.lisp "))', или из Slime/Sly используйте 'C-c C-k'. – jkiiski
На самом деле я думаю, что блок компиляции стандартных вызовов не влияет на семантику компиляции. Семантика компилятора функции в файле, которая используется до того, как она будет определена в том же файле, не имеет ничего общего с «единицей компиляции» - она просто связана с идеей компиляции файлов, а не с концепцией «единицы компиляции» '- которые существуют только неопределенно, определяемые с помощью единицы компиляции. –