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"

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.


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.