“ let *” (let asterisk) หมายถึงอะไรใน elisp


คำตอบ:


20

หมายความว่าเมื่อมีการผูกมากกว่าหนึ่งตัวแปรตัวแปรจะถูกผูกไว้ตามลำดับเพื่อให้แต่ละสามารถขึ้นอยู่กับค่าที่ถูกผูกไว้กับสิ่งที่ถูกผูกไว้ก่อนหน้านั้นคือสิ่งที่มาก่อนมันในการ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]ในช่องค้นหา (ฉันจะทำตอนนี้เพื่อดูว่าคำถามนี้อาจซ้ำกันหรือไม่ ... )


มีการพิมพ์ผิดในตัวอย่างข้างต้นเมื่อbเท่ากับ 5 aเพราะมันถูกผูกไว้กับโลก ควรอ่านletแทนlet*
มิถุนายน

@jue: ถูกต้อง; ขอบคุณ.
ดึง

F1 fนอกจากนี้ยังเป็นไปได้ที่จะถามเกี่ยวกับฟังก์ชั่นที่มี
DoMiNeLa10

@ DoMiNeLa10: แน่นอน; จุดดี. เนื่องจากความคิดเห็นสามารถลบได้ทุกเมื่อที่ฉันได้อัปเดตคำตอบเพื่อพูดถึงเรื่องนี้ ขอบคุณ.
ดึง

5

let*เหมือนletความหมายแบบเรียกซ้ำ:

(let* ((var1 VAL1)
       (var2 VAL2))
  ...)

ก็เหมือน

(let ((var1 VAL1))
  (let ((var2 VAL2))
    ...))

ดังนั้นการใช้ตัวอักษรพิมพ์ใหญ่สำหรับVAL1และVAL2ระบุว่าสิ่งเหล่านั้นสามารถเป็นนิพจน์ได้เช่นกัน

recursive let-binding มีผลกระทบถ้าขึ้นจริงในVAL2 var1ผลที่ได้คืออธิบายไว้แล้วในคำตอบของ Drew

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