空の文字列として `format`へのnil引数を補間しますか?


9

私は、これがあればと自明であることを理解しますが、オプションは次のように、そこにある%Sか、%s全く文字列としてゼロを補間することを?

例:

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

Ps。interpolationタグをリクエストします。
Unfun Cat、2015

1
はい、文字列の補間が適切な用語です。テンプレートを使用して文字列が生成される、引用/マクロの件名のバリエーションです。
wvxvw 2015年

1
いい質問ですね。formatこのためのインジケーターのリクエストを検討してください(そのために使用しますM-x report-emacs-bug)。私たちの残りはconcatこれに慣れており、時にはformat(他の変換のために)組み合わせて使用しています。または、インジケータに対応するformatなどのに引数を渡します。(if something "foobar" "")format"%s"
2015年

2
参考までに-私はそのような拡張リクエスト(#19975)を提出したばかりなので、あなたがする必要はありません。(それは何年も前に行われるべきでした。)
Drew

1
これは正規表現を作成するかなり疑わしい方法のように聞こえます(おそらくrx、このようなシナリオでマクロを使用することを検討してください。最低限regexp-quote、適切に実行していることを確認してください)。常に次のようなことをし(apply 'format "%s%s%s%s" (mapcar (lambda (x) (or x "")) LIST))ます。もちろん、フォーマット文字列が文字通りである場合"%s%s%s"concat実際にはもっと理にかなっています。
phils 2015年

回答:


8

アプリケーションによっては、concat役立つ場合があります。

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

これは、concatがシーケンスに作用し、nilが空のリストであるため機能します。


6

ここでは特別なフォームorが役立ちます。このマクロは、最初の引数の値を返します。ただし、nilの場合は2番目の引数を返します。したがって、チェックしたい変数がであるとするとfoo、次のようにすると期待どおりの結果が得られます。

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

いくつかの点では、引数がnilの場合に返される値が明確になるため、マジックタグよりも優れています。


1
小さなことの1つ:マクロではない
マラバルバ2015年

1
けっこうだ。ここで重要な点は、それが関数ではないということです(つまり、それは短絡です)。私の例は、それが何の違いももたらさないほど十分なものですが、2番目の引数に副作用がある場合、それは異なります。
エリアス・マーテンソン、2015年

はい、それは特別な形です。:-)
マラバルバ2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.