ความแตกต่างระหว่าง (วนซ้ำสำหรับ) และ (วนซ้ำ: สำหรับ) ใน Common Lisp [ซ้ำกัน]

ฉันเพิ่งเห็นคำตอบของ Sylwester สำหรับคำถามนี้ และฉันคิดว่าแปลกที่ ลูปมีโคลอนอยู่ทุกหนทุกแห่ง

ปกติผมจะเขียน

(loop for n below 10 do (princ n) (terpri))

แทน

(loop :for n :below 10 :do (princ n) (terpri))

หลังจากการทดสอบบางอย่าง ฉันเห็นว่าในการวนซ้ำแรก สัญลักษณ์ for, below และ do จะเป็นส่วนหนึ่งของ cl-user (แก้ไข : จริง ๆ แล้วไม่ใช่ do เพียงอีกสองอันเท่านั้น อาจเป็นเพราะ do เป็นเช่นกัน มาโครในแพ็คเกจ cl) ไม่ใช่มาโครตัวที่สอง ในทำนองเดียวกัน 'X เพียงอย่างเดียวจะเป็นส่วนหนึ่งของ cl-user ไม่ใช่ ':X ฟังก์ชัน symbol-package บอกฉันว่าอันหลังอยู่ในแพ็คเกจคำหลัก

ทีนี้ วงแรกที่ไม่มีเครื่องหมายทวิภาคดูสวยกว่ามากสำหรับฉัน เลยอยากทราบว่าคำพูดก่อนหน้าเป็นเหตุผลที่ดีที่จะใช้วงที่สองแทนหรือไม่ การที่สัญลักษณ์กลายเป็น "รวม" ในแพ็คเกจปัจจุบันดูค่อนข้างไม่น่ารังเกียจ แต่บางทีฉันอาจมองข้ามผลที่ตามมา

มีความคิดอะไรบ้าง?


person Community    schedule 13.02.2015    source แหล่งที่มา
comment
@Sylwester ใช่ซ้ำกันแน่นอน   -  person    schedule 13.02.2015
comment
ฉันเดาว่าฉันทำเพื่อแยกแยะคำหลักวนซ้ำจากตัวแปร/นิพจน์ (loop :for element :below below-average :counting (> element above-average)) อ่านถูกต้องง่ายกว่า (loop for element below below-average counting (> element above-average))   -  person Sylwester    schedule 13.02.2015
comment
@Sylwester ใช่และด้วยการระบายสีไวยากรณ์มันดูดีขึ้นมาก ฉันจะลองดู   -  person    schedule 13.02.2015


คำตอบ (2)


คุณตอบคำถามของคุณเองมากที่สุดแล้ว ความแตกต่างเป็นไปตามที่คุณอธิบายไว้ :some-symbol จะอยู่ในแพ็คเกจ :KEYWORD และ 'SOME-SYMBOL จะอยู่ในแพ็คเกจปัจจุบันของคุณ CL-USER โดยค่าเริ่มต้น ในมาโคร loop เป็นเพียงเรื่องของรสนิยม ตัวอย่างเช่น บางคนชอบใช้สัญลักษณ์ :for เพื่อให้เน้นไวยากรณ์ได้ดีขึ้นในโปรแกรมแก้ไขข้อความ

person coredump    schedule 13.02.2015
comment
ขอบคุณ ฉันไม่ทราบมาก่อนถึงตัวเลือกนี้ - person ; 13.02.2015
comment
คุณสามารถใช้สัญลักษณ์ในแพ็คเกจอื่นได้เช่นกัน ไม่ใช่แค่แพ็คเกจปัจจุบันหรือคีย์เวิร์ด ฉันคิดว่าคำตอบนี้จะได้รับการปรับปรุงโดยการอ้างอิงว่า ทำไม จึงได้รับอนุญาต (ไม่ใช่เรื่องยากเกินไปที่จะทราบว่าเกิดอะไรขึ้น แต่ถ้าไม่มีการอ้างอิง ก็ยากที่จะทราบว่านี่เป็นข้อบกพร่องหรือพฤติกรรมที่ตั้งใจไว้ (ฉันรู้ว่ามันตั้งใจ)) - person Joshua Taylor; 13.02.2015

CL-USER 23 > (find-symbol "LOOP" "CL")
LOOP
:EXTERNAL

CL-USER 24 > (find-symbol "FOR" "CL")
NIL
NIL

LOOP เป็นสัญลักษณ์ในแพ็คเกจ COMMON-LISP และจะถูกส่งออก FORก็ไม่ใช่เช่นกัน ดังนั้นในทุกแพ็คเกจที่ไม่มีสัญลักษณ์ FOR และไม่สืบทอดสัญลักษณ์ใดสัญลักษณ์หนึ่ง เราจะเพิ่มสัญลักษณ์ดังกล่าวเมื่อเขียนลูป LOOP FOR

แค่นั้นแหละ. ปกติไม่น่าจะมีปัญหาอะไร...

person Rainer Joswig    schedule 13.02.2015