Библиотека внешних манипуляций со строками s.el
имеет s-uppercase?
:
(s-uppercase "GOT TO. THIS AMERICA, MAN.") ; t
(s-uppercase "You cannot lose if you do not play.") ; nil
Это реализовано так:
(defun s-uppercase? (s)
(let ((case-fold-search nil))
(not (string-match-p "[[:lower:]]" s))))
[[:lower:]]
- это регулярное выражение, специфичное для Emacs , соответствующее строчному символу. string-match-p
принимает регулярное выражение и возвращает индекс, начиная с которого сопоставляется регулярное выражение, или возвращает nil
, если совпадения нет. Идея состоит в том, чтобы искать строчные символы в строке, и если ничего не найдено, вернуть t
. Однако string-match-p
игнорирует регистр по умолчанию, поэтому вам следует временно отключить case-fold-search
.
Emacs по умолчанию использует динамическое связывание , поэтому вы можете временно устанавливать глобальные переменные в различные значения внутри выражения let
. Если вы установите привязку к лексическому, пусть введет локальную копию case-fold-search
, скрывая глобальную переменную, поэтому приведенный выше код не будет работать.