ตามบทความนี้บรรทัดของเสียงกระเพื่อมพิมพ์ "Hello world" ไปยังเอาต์พุตมาตรฐาน
(format t "hello, world")
เสียงกระเพื่อมซึ่งเป็นภาษา homoiconicสามารถรักษารหัสเป็นข้อมูลด้วยวิธีนี้:
ตอนนี้จินตนาการว่าเราเขียนมาโครต่อไปนี้:
(defmacro backwards (expr) (reverse expr))
ย้อนกลับเป็นชื่อของแมโครซึ่งใช้นิพจน์ (แสดงเป็นรายการ) และย้อนกลับ นี่คือ "สวัสดีโลก" อีกครั้งคราวนี้ใช้มาโคร:
(backwards ("hello, world" t format))
เมื่อคอมไพเลอร์เสียงกระเพื่อมเห็นบรรทัดของรหัสนั้นมันจะดูที่อะตอมแรกในรายการ (
backwards
) และสังเกตว่ามันตั้งชื่อแมโคร มันจะส่งรายการที่ไม่ได้ประเมินค่า("hello, world" t format)
ไปยังแมโครซึ่งจัดเรียงรายการ(format t "hello, world")
ใหม่เป็น รายการผลลัพธ์แทนที่นิพจน์แมโครและเป็นสิ่งที่จะถูกประเมินในเวลาทำงาน สภาพแวดล้อมเสียงกระเพื่อมจะเห็นว่าอะตอมแรก (format
) เป็นฟังก์ชั่นและประเมินมันส่งผ่านข้อโต้แย้งที่เหลือ
ในเสียงกระเพื่อมบรรลุภารกิจนี้เป็นเรื่องง่าย (แก้ไขฉันถ้าฉันผิด) เพราะรหัสจะดำเนินการตามรายการ ( s- นิพจน์ ?)
ตอนนี้ลองดูตัวอย่างโค้ด OCaml นี้ (ซึ่งไม่ใช่ภาษา homoiconic):
let print () =
let message = "Hello world" in
print_endline message
;;
ลองนึกภาพคุณต้องการเพิ่ม homoiconicity ให้กับ OCaml ซึ่งใช้ไวยากรณ์ที่ซับซ้อนกว่าเมื่อเปรียบเทียบกับ Lisp คุณจะทำอย่างไร ภาษาต้องมีไวยากรณ์ที่ง่ายเป็นพิเศษหรือไม่
แก้ไข : จากหัวข้อนี้ผมพบว่าวิธีการที่จะบรรลุ homoiconicity อื่นที่แตกต่างจากเสียงกระเพื่อมของ: หนึ่งนำมาใช้ในภาษา io มันอาจตอบคำถามนี้บางส่วน
ที่นี่เรามาเริ่มด้วยบล็อกง่ายๆ
Io> plus := block(a, b, a + b) ==> method(a, b, a + b ) Io> plus call(2, 3) ==> 5
โอเคบล็อกทำงาน บล็อกบวกเพิ่มตัวเลขสองตัว
ทีนี้ลองใคร่ครวญกับเพื่อนตัวน้อยคนนี้
Io> plus argumentNames ==> list("a", "b") Io> plus code ==> block(a, b, a +(b)) Io> plus message name ==> a Io> plus message next ==> +(b) Io> plus message next name ==> +
ร้อนเย็นราศักดิ์สิทธิ์ ไม่เพียง แต่คุณจะได้รับชื่อของ params บล็อก และไม่เพียง แต่คุณจะได้รับสตริงของรหัสที่สมบูรณ์ของบล็อก คุณสามารถแอบเข้าไปในรหัสและสำรวจข้อความภายใน และที่น่าตื่นตาตื่นใจที่สุด: ง่ายและเป็นธรรมชาติ จริงกับภารกิจของ Io กระจกของรูบี้ไม่สามารถมองเห็นสิ่งใด
แต่เดี๋ยวก่อนเดี๋ยวก่อนเดี๋ยวก่อนอย่าแตะต้องนั้น
Io> plus message next setName("-") ==> -(b) Io> plus ==> method(a, b, a - b ) Io> plus call(2, 3) ==> -1