ค่าเริ่มต้นของพารามิเตอร์ทางเลือก


26

Emacs Lisp ไม่ได้รับการสนับสนุนด้านการสร้างประโยคสำหรับพารามิเตอร์ที่เป็นตัวเลือก อะไรคือสำนวนที่แนะนำสำหรับการจัดหาพารามิเตอร์เหล่านี้?

เพื่อชี้แจงประเด็นของฉันนี่เป็นวิธีหนึ่งที่ชัดเจนเกินไปในการทำเช่นนั้น

(defun command (a &optional supplied-b)
  (let ((b (or supplied-b default-b)))
    (command-body a b)))

สไตล์ที่แนะนำคืออะไร?

คำตอบ:


24

ยกเว้นว่าคุณใช้ส่วนขยาย 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)))

7
-1: ผมไม่คิดว่ามันเป็นรูปแบบที่ดีที่จะใช้การแสดงออกที่มีผลข้างเคียงเช่นsetqใน“บริสุทธิ์” orรูปแบบบูลเช่น ในความคิดของฉันมีความwhenเหมาะสมมากกว่าที่นี่แน่นอน แต่โดยทั่วไปแล้วletการแสดงออกของทางเลือกในการสร้างหรือเปลี่ยนแปลงการเชื่อมโยงท้องถิ่น IOW รหัสต้นฉบับดูดีกว่าฉันมาก
Lunaryorn

3
ฉันเห็นด้วยว่าบางสิ่งบางอย่าง(unless b (setq b default)อาจดีกว่านี้ ส่วนตัวผมคิดว่าletจะซ้ำซ้อนที่นี่เพราะมีอยู่แล้วในท้องถิ่นไปb defun
ลูกัส

3
มันเป็นเรื่องของรสชาติ แต่ฉันชอบรหัสบริสุทธิ์และการผูกบริสุทธิ์คือมากกว่ารูปแบบที่มีผลข้างเคียงเช่นlet setqมันเป็นรหัสสำหรับพารามิเตอร์เริ่มต้น แต่การใช้setqการเปลี่ยนแปลงตัวแปรในเครื่องทำให้การอ่านและปฏิบัติตามนั้นทำได้ยาก letฉันคิดว่ามันเป็นที่ดีที่สุดที่จะต้องพิจารณาการผูกท้องถิ่นไม่เปลี่ยนรูปและมีเพียงสร้างใหม่ที่มีการผูก IOW ชอบสไตล์การใช้งานมากกว่าสไตล์ที่จำเป็น
Lunaryorn

22

คุณสามารถใช้cl-defunซึ่งช่วยให้คุณระบุค่าเริ่มต้นสำหรับอาร์กิวเมนต์ตัวเลือก:

(cl-defun command (a &optional (b default-b))
  (command-body a b))

ในกรณีนี้default-bจะมีการประเมินค่าเริ่มต้นทุกครั้งที่มีการเรียกใช้ฟังก์ชัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.