Подтвердить что ты не робот

Как проверить, доступна ли функция (например, server-running-p) в Emacs?

Я пытаюсь проверить, доступен ли 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.

4b9b3361

Ответ 1

boundp проверяет, связана ли переменная. Поскольку server-running-p - это функция, которую вы хотите использовать fboundp. Например:

(if (and (fboundp 'server-running-p) 
         (not (server-running-p)))
   (server-start))

Ответ 2

Более простой способ - использовать "require", чтобы убедиться, что загружен код сервера. Вот что я использую:

(require 'server)
(unless (server-running-p)
    (server-start))

Ответ 3

Предложение ryuslashs было действительно полезно, но я изменил его для своих .emacs:

(unless (and (fboundp 'server-running-p)
             (server-running-p))
  (server-start))

Это приводит к запуску сервера, даже если server.el не был загружен. server-running-p определяется только при загрузке server.el и server-start автоматически загружается.