ผมเคยใช้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
และจากนั้น ได้รับการผูกไว้กับค่าของb
a
ดูคู่มือ 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*