Domanda

Vorrei scrivere un'istruzione if che farà qualcosa in base al fatto che una stringa sia vuota. Ad esempio:

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

In questo esempio inventato, sto usando (is-empty) al posto del metodo elisp reale. Qual è il modo giusto di farlo?

Grazie

È stato utile?

Soluzione

Dato che in elisp, una stringa è un array int, è possibile utilizzare

(= (length user-str) 0)

Puoi anche usare (string =) che di solito è più facile da leggere

(string= "" user-str)

Anche Equal funziona, ma un po 'più lentamente:

(equal "" user-str)

Altri suggerimenti

Se lavori fortemente con le stringhe nel tuo codice, ti consiglio vivamente di usare s.el di Magnar Sveen libreria di manipolazione delle stringhe.

s-blank? assegni se la stringa è vuota:

(s-blank? "") ; => t

Tengo questo nel mio utils.lisp:

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

quindi lo faccio:

(not (empty-string-p some-string))

Non sono sicuro di quale sia il modo canonico di testarlo, ma potresti usare la funzione length e controllare se la lunghezza della tua stringa è maggiore di zero:

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

Il ricettario elisp EmacsWiki contiene un esempio di una funzione di taglio se si desidera rimuovere gli spazi bianchi prima del test.

A partire da emacs 24.4, ci sono due diverse funzioni disponibili che puoi chiamare, a seconda di cosa vuoi dire con 'vuoto'.

(string-empty-p " ")
nil

(string-blank-p " ")
0

Ho problemi a trovare documenti a cui collegarmi, ma emacsredux.com contiene ulteriori informazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top