Emacs Lisp tidak memiliki dukungan sintaksis untuk parameter opsional opsional yang tidak nol. Apa idiom yang disarankan untuk memasok parameter ini?
Untuk memperjelas poin saya, berikut ini adalah satu cara yang terlalu eksplisit untuk melakukannya.
(defun command (a &optional supplied-b)
(let ((b (or supplied-b default-b)))
(command-body a b)))
Apa, jika ada, gaya yang disarankan?
setq
dalam bentuk boolean "murni" sepertior
. Menurut pendapat sayawhen
sudah pasti lebih tepat di sini, tetapi umumnyalet
adalah ekspresi pilihan untuk membangun atau mengubah binding lokal. TKI, kode aslinya terlihat jauh lebih bagus untuk saya.(unless b (setq b default)
mungkin lebih baik. Secara pribadi, saya pikirlet
berlebihan di sini karenab
sudah lokal ke Internetdefun
.let
lebih dari bentuk efek samping sepertisetq
. Ini kode untuk parameter default, tetapi penggunaan liberalsetq
untuk mengubah variabel lokal membuat kode sulit dibaca dan diikuti. Saya pikir yang terbaik adalah menganggap semua ikatan lokal tidak berubah, dan hanya membuat ikatan baru denganlet
. TKI, lebih memilih gaya fungsional daripada yang imperatif.Anda dapat menggunakan
cl-defun
, yang memungkinkan Anda menentukan nilai default untuk argumen opsional:Nilai default, dalam hal ini
default-b
, akan dievaluasi setiap kali fungsi dipanggil.sumber