Interpolasi argumen nil ke `format` sebagai string kosong?

9

Saya mengerti bahwa ini sepele dengan if, tetapi apakah ada opsi, suka %Satau %sinterpolasi nil karena tidak ada string sama sekali?

Contoh:

(format "%?.el" nil) ; ".el"
(format "%?.el" "beginner") ; "beginner.el"
Kucing Unfun
sumber
Ps. meminta interpolationtag.
The Unfun Cat
1
Ya, interpolasi string adalah istilah yang tepat untuk digunakan. Ini adalah variasi pada subjek kutip / makro, di mana string dihasilkan menggunakan templat.
wvxvw
1
Itu pertanyaan yang bagus. Pertimbangkan untuk meminta formatindikator untuk ini (gunakan M-x report-emacs-buguntuk itu). Kita semua sudah terbiasa menggunakan concatini, kadang-kadang dalam kombinasi dengan format(untuk konversi lain). Atau memberikan argumen formatseperti (if something "foobar" ""), sesuai dengan formatindikator "%s".
Drew
2
FYI - Saya baru saja mengajukan permintaan peningkatan seperti itu (# 19975), jadi Anda tidak perlu melakukannya. (Seharusnya sudah dilakukan bertahun-tahun yang lalu.)
Drew
1
Kedengarannya seperti cara yang cukup meragukan untuk membangun regexp (mungkin pertimbangkan untuk menggunakan rxmakro dalam skenario seperti itu. Minimal pastikan Anda menggunakan yang regexp-quotesesuai), tetapi selain itu jika Anda memiliki sejumlah besar string-mungkin dalam DAFTAR Anda bisa selalu melakukan sesuatu seperti (apply 'format "%s%s%s%s" (mapcar (lambda (x) (or x "")) LIST)). Tentu saja jika string format Anda benar-benar seperti "%s%s%s", maka concatmemang lebih masuk akal.
phils

Jawaban:

8

Tergantung pada aplikasi Anda, concatmungkin bisa digunakan:

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

Ini berfungsi karena concat bertindak berdasarkan urutan, dan nihil adalah daftar kosong.

Malabarba
sumber
6

Bentuk khusus orberguna di sini. Makro ini mengembalikan nilai argumen pertama, kecuali nil dalam hal ini mengembalikan argumen kedua. Jadi, dengan asumsi variabel yang ingin Anda periksa adalah foo, berikut ini akan melakukan apa yang Anda inginkan:

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

Dalam beberapa hal, ini lebih baik daripada tag ajaib karena memperjelas nilai apa yang harus dikembalikan jika argumennya nol.

Elias Mårtenson
sumber
1
Satu hal kecil: atau bukan makro
Malabarba
1
Cukup adil. Poin penting di sini adalah bahwa itu bukan fungsi (yaitu hubungan arus pendek). Contoh saya cukup sime sehingga tidak akan membuat perbedaan, tetapi jika argumen kedua memiliki efek samping, itu berbeda.
Elias Mårtenson
Ya, ini bentuk khusus. :-)
Malabarba