Ответ 1
boundp
проверяет, связана ли переменная. Поскольку server-running-p
- это функция, которую вы хотите использовать fboundp
. Например:
(if (and (fboundp 'server-running-p)
(not (server-running-p)))
(server-start))
Я пытаюсь проверить, доступен ли server-running-p
в моем файле .emacs, прежде чем вызывать его. У меня уже есть следующее:
(if (not (server-running-p))
(server-start))
Но на некоторых компьютерах, где я использую Emacs, вызов (server-running-p)
дает ошибку, потому что указанный вызов недоступен. Поэтому я хочу проверить, доступен ли server-running-p
до его вызова. Я думал, что boundp
выполнит попытку, но вызовет (boundp 'server-running-p)
return nil
, хотя вызов (server-running-p)
завершается успешно. Правильный способ проверки того, что вызов server-running-p
не завершится неудачно... или, по крайней мере, подавить ошибку, если указанный вызов завершился с ошибкой. (И какой странный объект server-running-p
в любом случае boundp
возвращает nil
, но вызов его преуспевает?)
Это относится к Emacs 23.2.1, если это имеет значение.
Собственно нашел ответ. По этой причине вы должны использовать fboundp
вместо boundp
.
boundp
проверяет, связана ли переменная. Поскольку server-running-p
- это функция, которую вы хотите использовать fboundp
. Например:
(if (and (fboundp 'server-running-p)
(not (server-running-p)))
(server-start))
Более простой способ - использовать "require", чтобы убедиться, что загружен код сервера. Вот что я использую:
(require 'server)
(unless (server-running-p)
(server-start))
Предложение ryuslashs было действительно полезно, но я изменил его для своих .emacs:
(unless (and (fboundp 'server-running-p)
(server-running-p))
(server-start))
Это приводит к запуску сервера, даже если server.el не был загружен. server-running-p
определяется только при загрузке server.el и server-start
автоматически загружается.