ยกเว้นว่าคุณใช้ส่วนขยาย Lisp ทั่วไปตามที่แนะนำโดย @legoscia คุณจะต้องตรวจสอบว่ามีการระบุอาร์กิวเมนต์เพิ่มเติมหรือไม่ โปรดทราบว่าคุณไม่จำเป็นต้องใช้let
ที่นี่ ดูเหมือนว่าฉันจะสำนึกผิดมากกว่านี้:
(defun command (a &optional b)
(or b (setq b default))
(command-body a b))
ตามที่แนะนำในความคิดเห็นการใช้unless
อาจจะดีกว่าor
:
(defun command (a &optional b)
(unless b (setq b default))
(command-body a b))
นอกจากนี้จากความคิดเห็น: สไตล์การทำงานที่บริสุทธิ์มากขึ้นจะใช้let
เช่นเดียวกับในคำถามเดิม แต่คุณไม่ต้องการชื่อตัวแปรแยกต่างหาก:
(defun my-command (a &optional b)
(let ((b (or b default)))
(command-body a b)))
แน่นอนถ้าพารามิเตอร์ทางเลือกจำเป็นเมื่อคุณควรทำสิ่งนี้:
(defun my-command (a &optional b)
(command-body a (or b default)))
setq
ใน“บริสุทธิ์”or
รูปแบบบูลเช่น ในความคิดของฉันมีความwhen
เหมาะสมมากกว่าที่นี่แน่นอน แต่โดยทั่วไปแล้วlet
การแสดงออกของทางเลือกในการสร้างหรือเปลี่ยนแปลงการเชื่อมโยงท้องถิ่น IOW รหัสต้นฉบับดูดีกว่าฉันมาก