Как проверить, пуста ли строка в Emacs Lisp?

Я хотел бы написать оператор if, который будет делать что-то в зависимости от того, пуста ли строка. Например:

(defun prepend-dot-if-not-empty (user-str)
   (interactive "s")
   (if (is-empty user-str)
     (setq user-str (concat "." user-str)))
   (message user-str))

В этом надуманном примере я использую (is-empty) вместо настоящего метода elisp. Как правильно это делать?

Спасибо


person oneself    schedule 19.06.2009    source источник
comment
Ваш код лучше переписать на (message "%s" (if (is-empty user-str) "." user-str)).   -  person Stefan    schedule 19.10.2018


Ответы (5)


Поскольку в elisp String является массивом int, вы можете использовать

(= (length user-str) 0)

Вы также можете использовать (string =), который обычно легче читать

(string= "" user-str)

Equal тоже работает, но немного медленнее:

(equal "" user-str)
person mihi    schedule 19.06.2009
comment
Вы уверены equal медленнее? В последний раз, когда я смотрел на это (много лет назад), он был где-то между идентичным и немного более быстрым. - person Stefan; 19.10.2018

Начиная с emacs 24.4, есть две разные функции, доступные для вызова, в зависимости от того, что вы подразумеваете под «пустым».

(string-empty-p " ")
nil

(string-blank-p " ")
0

Мне не удается найти документы для ссылки, но emacsredux.com содержит дополнительную информацию.

Если вы получили сообщение об ошибке Symbol's function definition is void., включите (require 'subr-x) в файл инициализации (это пакет для обрезки и обработки строк).

person Gina White    schedule 18.10.2018
comment
У меня есть Emacs 26.3, и оба вызова бросают Symbol's function definition is void. - person miguelmorin; 27.11.2019
comment
@miguelmorin: Попробуйте поместить (require 'subr-x) где-нибудь раньше в вашем файле. Это решило проблему для меня. - person Cadence; 28.09.2020

Если вы много работаете со строками в своем коде, я настоятельно рекомендую использовать библиотеку управления строками s.el от Magnar Sveen.

s-blank? проверяет, пуста ли строка:

(s-blank? "") ; => t
person Mirzhan Irkegulov    schedule 18.03.2014

Я храню это у себя в utils.lisp:

(defun empty-string-p (string)
  "Return true if the STRING is empty or nil. Expects string type."
  (or (null string)
      (zerop (length (string-trim string)))))

тогда я делаю:

(not (empty-string-p some-string))
person Joe    schedule 14.05.2015

Я не уверен, что это за канонический способ тестирования, но вы можете использовать функцию длины и проверить, больше ли длина вашей строки нуля:

(length "abc")  
=> 3
(length "")  
=> 0

В кулинарной книге EmacsWiki elisp есть пример функции обрезки, если вы хотите удалить пробелы перед тестированием.

person zimbu668    schedule 19.06.2009