ผมเคยใช้letมาก่อน แต่ไม่เคยใช้let*
สิ่งที่ไม่let*(ขอดอกจัน) หมายถึงใน Elisp?
fyi อันนี้ยากที่ google เพราะดอกจัน
ผมเคยใช้letมาก่อน แต่ไม่เคยใช้let*
สิ่งที่ไม่let*(ขอดอกจัน) หมายถึงใน Elisp?
fyi อันนี้ยากที่ google เพราะดอกจัน
คำตอบ:
หมายความว่าเมื่อมีการผูกมากกว่าหนึ่งตัวแปรตัวแปรจะถูกผูกไว้ตามลำดับเพื่อให้แต่ละสามารถขึ้นอยู่กับค่าที่ถูกผูกไว้กับสิ่งที่ถูกผูกไว้ก่อนหน้านั้นคือสิ่งที่มาก่อนมันในการlet*ผูก
สำหรับlet(ไม่มีเครื่องหมายดอกจัน) ไม่สามารถสันนิษฐานได้ว่าจะเกิดการผูกมัดก่อนสิ่งอื่นใด (โดยหลักการแล้วตัวแปรสามารถทำได้ในแบบคู่ขนาน)
ดังนั้น(let ((a 42) (b a))...b)สามารถยกข้อผิดพลาดเพราะมันพยายามที่จะผูกbค่าของaและa(อย่างน้อยโดยเฉพาะอย่างยิ่งaที่ถูกผูกไว้ในนี้let) ไม่สามารถสันนิษฐานว่าจะได้รับการผูกไว้กับความคุ้มค่า
[หากตัวแปรอื่น ๆ (เช่นทั่วโลก) a ถูกผูกไว้กับค่าเช่น5จากนั้นletนิพจน์นั้นจะผูก (ท้องถิ่น) aกับ42และผูกbกับค่าของทั่วโลกaนั่นคือ5.]
แต่(let* ((a 42) (b a))...b)ผลตอบแทนที่ได้42เพราะaได้รับการผูกไว้กับ42 และจากนั้น ได้รับการผูกไว้กับค่าของba
ดูคู่มือ Elisp โหนดตัวแปรท้องถิ่น
อัพเดตจากตัวเตือนของ @ DoMiNeLa10 ในความคิดเห็น:
นอกจากคู่มือแล้วคุณยังสามารถใช้คำสั่งวิธีใช้ จากหลากหลายวิธีในการ"ถาม Emacs"พวกเขาเป็นคนแรกที่เรียนรู้และมีประโยชน์มากที่สุด
และสำหรับC-h f let*บอกเราอย่างชัดเจน:Each VALUEFORM can refer to the symbols already bound by this VARLIST.
แม้ว่าจะไม่มีอะไรผิดปกติกับการถามที่นี่คุณจะทำด้วยตัวเองชอบถ้าคุณถาม Emacsคำถามดังกล่าว เพียงใช้C-h iเพื่อเปิดเบราว์เซอร์ข้อมูลของคู่มือเลือกElispคู่มือและใช้i let*เพื่อค้นหาlet*ในดัชนี (พร้อมการดำเนินการ) ที่นำคุณไปยังโหนดที่ครอบคลุมสิ่งนี้โดยตรง
(และโดยปกติแล้วคู่มือจะครอบคลุมสิ่งที่ดีกว่าที่จะทำที่นี่โดยใช้เวลาและความพยายามโดยผู้มีส่วนร่วมนับพันได้เข้าสู่การทำให้ถูกต้อง: ถูกต้องและสมบูรณ์)
นอกจากนี้คุณยังสามารถค้นหาคำถามและคำตอบที่ใช้แท็กเว็บไซต์นี้let-binding: ใส่[let-binding]ในช่องค้นหา (ฉันจะทำตอนนี้เพื่อดูว่าคำถามนี้อาจซ้ำกันหรือไม่ ... )
F1 fนอกจากนี้ยังเป็นไปได้ที่จะถามเกี่ยวกับฟังก์ชั่นที่มี
let*เหมือนletความหมายแบบเรียกซ้ำ:
(let* ((var1 VAL1)
(var2 VAL2))
...)
ก็เหมือน
(let ((var1 VAL1))
(let ((var2 VAL2))
...))
ดังนั้นการใช้ตัวอักษรพิมพ์ใหญ่สำหรับVAL1และVAL2ระบุว่าสิ่งเหล่านั้นสามารถเป็นนิพจน์ได้เช่นกัน
recursive let-binding มีผลกระทบถ้าขึ้นจริงในVAL2 var1ผลที่ได้คืออธิบายไว้แล้วในคำตอบของ Drew
bเท่ากับ 5aเพราะมันถูกผูกไว้กับโลก ควรอ่านletแทนlet*