Interpolare argomento nullo in `formattazione` come stringa vuota?


9

Capisco che questo è banale con un if, ma esiste un'opzione, like %So %sche interpola zero come nessuna stringa?

Esempio:

(format "%?.el" nil) ; ".el"
(format "%?.el" "beginner") ; "beginner.el"

Ps. interpolationtag richiesto .
The Unfun Cat

1
Sì, l'interpolazione di stringhe è il termine giusto da usare. È una variazione in materia di quotazioni / macro, in cui le stringhe vengono generate utilizzando i modelli.
wvxvw,

1
È una buona domanda Prendi in considerazione la possibilità di richiedere un formatindicatore per questo (utilizzare M-x report-emacs-bugper quello). Il resto di noi si è abituato a utilizzare concatper questo, a volte in combinazione con format(per altre conversioni). Oppure passare un argomento a formattale (if something "foobar" ""), corrispondente formatall'indicatore "%s".
Estratto il

2
Cordiali saluti - Ho appena presentato una richiesta di miglioramento (n. 19975), quindi non è necessario. (Avrebbe dovuto farlo anni fa.)
Ha

1
Sembra un modo piuttosto discutibile per costruire una regexp (forse considera l'uso della rxmacro in uno scenario del genere. Almeno assicurati di essere regexp-quoteil più appropriato), ma a parte questo se hai un gran numero di forse-stringhe in ELENCO potresti fai sempre qualcosa del genere (apply 'format "%s%s%s%s" (mapcar (lambda (x) (or x "")) LIST)). Naturalmente se la stringa del tuo formato è letteralmente simile "%s%s%s", allora concatha davvero più senso.
phils,

Risposte:


8

A seconda dell'applicazione, concatpotrebbe essere utile:

(concat "live long " nil "and prosper")
;; => "live long and prosper"

Questo funziona perché concat agisce sulle sequenze e zero è un elenco vuoto.


6

Il modulo speciale orè utile qui. Questa macro restituisce il valore del primo argomento, a meno che non sia nulla, nel qual caso restituisce il secondo. Quindi, supponendo che la variabile che si desidera controllare sia foo, ciò che segue farà ciò che si desidera:

(format "%s.el" (or foo ""))

In un certo senso è meglio di un tag magico poiché chiarisce quale valore deve essere restituito se l'argomento è zero.


1
Una piccola cosa: o non è una macro
Malabarba

1
Giusto. Il punto importante qui è che non è una funzione però (cioè è in corto circuito). Il mio esempio è abbastanza semplice da non fare alcuna differenza, ma se il secondo argomento ha effetti collaterali, è diverso.
Elias Mårtenson

Sì, è una forma speciale. :-)
Malabarba
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.