Обработка возврата в спецификациях
Если спецификация не соответствует на каком-то этапе, это не обязательно означает, что будет сигнализировано синтаксическое сообщение об ошибке; вместо этого произойдёт обработка возврата до тех пор, пока не будут исчерпаны все альтернативы. В конечном итоге каждый элемент списка аргументов должен быть сопоставлен с каким-либо элементом в спецификации, и каждый необходимый элемент в спецификации должен соответствовать какому-либо аргументу.
Когда обнаруживается синтаксическая ошибка, она может быть сообщена не сразу, а значительно позже, после исчерпания альтернатив более высокого уровня, и с указанием позиции, удалённой от реальной ошибки. Но если отключение обработки возврата происходит при возникновении ошибки, то она может быть сообщена немедленно. Обратите внимание, что обработка возврата также автоматически включается в нескольких ситуациях; когда новая альтернатива устанавливается посредством &optional, &rest, или &or, или в начале обработки подсписка, группы или косвенной спецификации. Эффект включения или отключения обработки возврата ограничен остатком уровня, который в данный момент обрабатывается, и более низкими уровнями.
Обработка возврата отключена во время сопоставления любых спецификаций формы (то есть, form, body, def-form, и def-body). Эти спецификации будут соответствовать любой форме, поэтому любая ошибка должна быть в самой форме, а не на более высоком уровне.
Обработка возврата также отключена после успешного сопоставления цитированного символа, строковой спецификации или &define ключевого слова, поскольку это обычно указывает на распознанный конструкт. Но если у вас есть набор альтернативных конструктов, все из которых начинаются с одного и того же символа, вы, как правило, можете обойти это ограничение, вынося символ за пределы альтернатив, например, ["foo" &or [first case] [second case] ...].
Большинство потребностей удовлетворяются этими двумя способами автоматического отключения обработки возврата, но иногда бывает полезно явно отключить обработку возврата, используя спецификацию gate. Это полезно, когда вы знаете, что никакие более высокие альтернативы не могут применяться. См. пример спецификации let.
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Backtracking.html