Das Argument nil auf `format` als leere Zeichenfolge interpolieren?


9

Ich verstehe, dass dies mit einem if trivial ist, aber gibt es eine Option, wie %Soder %sdie nil als überhaupt keine Zeichenfolge interpoliert?

Beispiel:

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

Ps. interpolationTag anfordern .
Die Unfun Cat

1
Ja, String-Interpolation ist der richtige Begriff. Es ist eine Variation zum Thema Anführungszeichen / Makros, bei der Zeichenfolgen mithilfe von Vorlagen generiert werden.
wvxvw

1
Das ist eine gute Frage. Ziehen Sie in Betracht, einen formatIndikator dafür anzufordern (verwenden Sie ihn M-x report-emacs-bugdafür). Der Rest von uns hat sich daran gewöhnt concat, manchmal in Kombination mit format(für andere Konvertierungen). Oder ein Argument an ein formatsolches übergeben (if something "foobar" ""), das dem formatIndikator entspricht "%s".
Drew

2
Zu Ihrer Information - Ich habe gerade einen solchen Verbesserungsantrag gestellt (# 19975), das brauchen Sie also nicht. (Hätte das schon vor Jahren tun sollen.)
Drew

1
Das klingt nach einer ziemlich zweifelhaften Methode, um einen regulären Ausdruck zu erstellen (vielleicht sollten Sie das rxMakro in einem solchen Szenario verwenden. Stellen Sie zumindest sicher, dass Sie regexp-quoteentsprechend sind), aber abgesehen davon, wenn Sie eine große Anzahl von Vielleicht-Zeichenfolgen in LIST haben, könnten Sie dies tun mach immer so etwas (apply 'format "%s%s%s%s" (mapcar (lambda (x) (or x "")) LIST)). Wenn Ihre Formatzeichenfolge buchstäblich so ist "%s%s%s", ist dies concatnatürlich sinnvoller.
Phils

Antworten:


8

Abhängig von Ihrer Anwendung kann concatFolgendes hilfreich sein:

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

Dies funktioniert, weil concat auf Sequenzen wirkt und nil eine leere Liste ist.


6

Das spezielle Formular orist hier nützlich. Dieses Makro gibt den Wert des ersten Arguments zurück, es sei denn, es ist null. In diesem Fall gibt es das zweite zurück. Angenommen, die Variable, die Sie überprüfen möchten, ist foodas Folgende, was Sie wollen:

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

In mancher Hinsicht ist es besser als ein magisches Tag, da es klar macht, welcher Wert zurückgegeben werden soll, wenn das Argument Null ist.


1
Eine kleine Sache: oder ist kein Makro
Malabarba

1
Meinetwegen. Der wichtige Punkt hierbei ist jedoch, dass es sich nicht um eine Funktion handelt (dh um einen Kurzschluss). Mein Beispiel ist so gut, dass es keinen Unterschied macht, aber wenn das zweite Argument Nebenwirkungen hat, ist es anders.
Elias Mårtenson

Ja, es ist eine spezielle Form. :-)
Malabarba
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.