แอปพลิเคชันทั่วไปของ Lisp แมโครคืออะไร


19

ฉันกำลังพยายามเรียนรู้ LISP และฉันได้อ่านเกี่ยวกับความสำคัญของมาโคร LISP มากดังนั้นฉันจึงอยากได้ประสบการณ์การทำงานกับพวกเขา

คุณสามารถแนะนำพื้นที่แอปพลิเคชั่นที่ใช้งานได้จริงซึ่งช่วยให้ฉันใช้แมโครเพื่อแก้ปัญหาในโลกแห่งความเป็นจริงและทำความเข้าใจถึงประโยชน์ของการเขียนโปรแกรมนี้ได้หรือไม่?

บันทึก

นี่ไม่ใช่โครงการทั่วไปที่ฉันควรทำคำถามต่อไป ฉันสนใจที่จะเข้าใจว่าปัญหาประเภทใดที่แก้ไขได้ด้วยแมโคร LISP เช่นพวกเขาจะดีสำหรับการใช้ชนิดข้อมูลนามธรรม? ทำไมโครงสร้างนี้จึงถูกเพิ่มเข้าไปในภาษา มันแก้ปัญหาอะไรบ้างที่ไม่สามารถแก้ไขได้ด้วยฟังก์ชั่นพื้นฐาน


คำตอบ:


9

มาโคร Lisp รวมคุณสมบัติที่แตกต่างกันสองสามประการ:

  1. แมโครกำหนดไวยากรณ์ใหม่โดยใช้รหัสแหล่งที่มาเป็นอินพุต
  2. โดยปกติแล้วแมโครจะทำงานในเวลาคอมไพล์
  3. แมโครสร้างซอร์สโค้ด

แอปพลิเคชั่นที่ดีที่สุดใช้ประโยชน์จากทุกด้าน อาจเป็นตัวอย่างที่รู้จักกันดีที่สุดคือ(วน ... )ใน Common LISP มันจะไม่อยู่ใกล้กับประโยชน์ของมันหากไม่มีหนึ่งในคุณสมบัติเหล่านั้น หากไม่มีแหล่งที่มาเป็นอินพุตมันจะอึดอัดใจที่จะกำหนดการกระทำภายในลูป หากไม่มีการขยายเวลารวบรวมมันจะช้าเกินไป และหากไม่มีการสร้างรหัสจะไม่สามารถเรียกใช้งานได้

อีกตัวอย่างที่ดีคือบทซีเรียลไลซ์เซชั่นไบนารีในPractical Common LISP , Practical: Parsing Binary Files

มาโครแบบสอบถามที่ใช้สิ่งที่คล้ายกับ LINQ อาจเป็นแอปพลิเคชันอื่นที่ดี แต่มันจะขาดความสมบูรณ์แบบอัตโนมัติที่ทำให้ LINQ ดีเหมือนเดิม เกือบทุกอย่างที่วันนี้แก้ไขได้โดยผู้สร้างรหัสวัตถุประสงค์พิเศษที่มีอินพุต XML (เช่น XAML) ก็สามารถนำมาใช้งานได้ด้วย Lisp macros


ฉันเพิ่งซื้อหนังสือ "Common Common LISP" ฉันจะดูตัวอย่างที่คุณแนะนำ
Giorgio

2

วิธีที่ฉันชอบคิดเกี่ยวกับมาโครในเสียงกระเพื่อมทั่วไปก็คือพวกมันเป็นฟังก์ชันที่โค้ดส่งคืนที่จะถูกประเมิน แต่ 'ไม่' ประเมินอาร์กิวเมนต์ของพวกเขาก่อนที่จะส่งคืนรหัสนั้น ฟังก์ชั่นส่งคืนบางสิ่งเช่นกัน แต่พวกเขาประเมินแต่ละอาร์กิวเมนต์ก่อนที่จะประเมินร่างกายของพวกเขา มาโครทำอะไรไม่ได้

Paul Graham ใน 'On Lisp' ให้ (IMHO) หนึ่งในคำอธิบายที่ดีที่สุดของความแตกต่างระหว่างมาโครและฟังก์ชั่นและพูดคุยเกี่ยวกับการทับซ้อนและเอกลักษณ์ โค้ดจำนวนมากสามารถเขียนได้ทั้งฟังก์ชั่นหรือมาโคร แต่มีบางกรณีที่แมโครจะทำงานได้เท่านั้น เมื่อคุณห่อหัวของคุณรอบนี้ฉันคิดว่าคุณมีส่วนสำคัญของแมโครในเสียงกระเพื่อม

เป็นตัวอย่างของมาโครที่ฟังก์ชั่นใช้งานไม่ได้ให้ตรวจสอบ 'aif' (anaphoric if) มันเป็นโค้ดเพียงไม่กี่บรรทัดและคำแนะนำของฉันคือการเริ่มต้น

และทำการอ้างอิง anaphoric เวอร์ชัน Common LISP หากใช้ประโยชน์จากการดักจับตัวแปรโดยเจตนา เวอร์ชันที่ถูกสุขลักษณะโดยอัตโนมัติของ Scheme ไม่ใช่ IMO 'ข้อเสนอที่แท้จริง' การจับภาพตัวแปรเป็นส่วนสำคัญของมาโครวิทยาแบบ lisp และมาโครที่ทรงพลังและมีประโยชน์บางตัวใช้ประโยชน์จากมันอย่างแน่นอน

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