ยังมีอีกหลายภาษาที่อนุญาตให้ใช้ชนิดของบางอย่างจะmetaprogramming โดยเฉพาะอย่างยิ่งฉันประหลาดใจที่ไม่เห็นคำตอบที่พูดถึงตระกูลภาษาLisp
จากวิกิพีเดีย:
Metaprogramming คือการเขียนโปรแกรมคอมพิวเตอร์ที่มีความสามารถในการรักษาโปรแกรมเป็นข้อมูลของพวกเขา
ต่อมาในข้อความ:
เสียงกระเพื่อมอาจเป็นภาษาที่เป็นแก่นสารด้วยเครื่องมืออำนวยความสะดวกด้านเมตาโปรแกรมทั้งเนื่องจากความสำคัญทางประวัติศาสตร์และเนื่องจากความเรียบง่ายและพลังของเมตาโปรแกรม
ภาษาเสียงกระเพื่อม
คำนำที่สร้างขึ้นอย่างรวดเร็วของ Lisp มีดังนี้
วิธีหนึ่งในการดูรหัสคือชุดคำสั่ง: ทำสิ่งนี้จากนั้นทำสิ่งนั้นจากนั้นทำอย่างอื่น ... นี่คือรายการ! รายการสิ่งต่าง ๆ สำหรับโปรแกรมที่ต้องทำ และแน่นอนคุณสามารถมีรายการภายในรายการเพื่อแสดงลูปเป็นต้น ..
ถ้าเราเป็นตัวแทนของรายการที่มีองค์ประกอบ A, B, C, D เช่นนี้ (ABCD) เราได้รับสิ่งที่ดูเหมือนว่าการเรียกฟังก์ชั่นเสียงกระเพื่อมที่a
เป็นฟังก์ชั่นและb
, c
, d
มีความขัดแย้ง ถ้าเป็นจริง "Hello World!" ทั่วไป โปรแกรมสามารถเขียนได้เช่น:(println "Hello World!")
แน่นอนb
, c
หรือd
อาจจะเป็นรายการที่ประเมินสิ่งที่เป็นความดี ต่อไปนี้: (println "I can add :" (+ 1 3) )
จากนั้นพิมพ์ "" ฉันสามารถเพิ่มได้: 4 "
ดังนั้นโปรแกรมเป็นชุดของรายการที่ซ้อนกันและองค์ประกอบแรกคือฟังก์ชั่น ข่าวดีก็คือเราสามารถจัดการรายชื่อ! ดังนั้นเราสามารถจัดการภาษาการเขียนโปรแกรม
ข้อดีของเสียงกระเพื่อม
Lisps ไม่ได้เป็นภาษาการเขียนโปรแกรมมากเท่าเครื่องมือสำหรับการสร้างภาษาโปรแกรม ภาษาโปรแกรมที่ตั้งโปรแกรมได้
สิ่งนี้ไม่เพียง แต่ง่ายขึ้นใน Lisps ในการสร้างโอเปอเรเตอร์ใหม่ แต่ยังเป็นไปไม่ได้ที่จะเขียนโอเปอเรเตอร์บางภาษาในภาษาอื่น ๆ
ตัวอย่างเช่นในภาษา C เช่นสมมติว่าคุณต้องการเขียนif
โอเปอเรเตอร์ด้วยตัวเองเช่น:
my-if(condition, if-true, if-false)
my-if(false, print("I should not be printed"), print("I should be printed"))
ในกรณีนี้อาร์กิวเมนต์ทั้งสองจะได้รับการประเมินและพิมพ์ตามลำดับของการประเมินผลของอาร์กิวเมนต์
ใน Lisps การเขียนโอเปอเรเตอร์ (เราเรียกมันว่าแมโคร) และการเขียนฟังก์ชั่นนั้นเกี่ยวกับสิ่งเดียวกันและใช้ในวิธีเดียวกัน ความแตกต่างที่สำคัญคือการที่พารามิเตอร์ของแมโครไม่ได้รับการประเมินก่อนที่จะถูกส่งเป็นอาร์กิวเมนต์ไปยังแมโคร นี่เป็นสิ่งสำคัญที่จะสามารถเขียนโอเปอเรเตอร์บางอย่างเช่นif
ด้านบน
ภาษาในโลกแห่งความจริง
แสดงให้เห็นว่าขอบเขตออกไปเล็กน้อย แต่ฉันขอแนะนำให้คุณลองเขียนโปรแกรมด้วยเสียงกระเพื่อมหนึ่งเพื่อเรียนรู้เพิ่มเติม ตัวอย่างเช่นคุณสามารถดู:
- Scheme , Lisp เก่า "ค่อนข้างบริสุทธิ์" ที่มีแกนกลางขนาดเล็ก
- Common Lisp, Lisp ที่ใหญ่กว่าพร้อมระบบอ็อบเจกต์ที่รวมเข้าด้วยกันและการใช้งานมากมาย (เป็นมาตรฐาน ANSI)
- แร็กเกต Lisp ที่พิมพ์
- Clojure ที่ฉันชอบตัวอย่างข้างต้นคือรหัส Clojure เสียงกระเพื่อมที่ทันสมัยทำงานบน JVM มีตัวอย่างบางส่วนของมาโคร Clojure บนSOด้วย (แต่นี่ไม่ใช่จุดเริ่มต้นที่ถูกต้องฉันจะดู4clojure , braveclojureหรือclojure koansในตอนแรก)
โอ้และโดยวิธีการกระเพื่อมหมายถึง LISt กำลังประมวลผล
เกี่ยวกับตัวอย่างของคุณ
ฉันจะยกตัวอย่างโดยใช้ Clojure ด้านล่าง:
หากคุณสามารถเขียนadd
ฟังก์ชั่นใน Clojure (defn add [a b] ...your-implementation-here... )
คุณสามารถตั้งชื่อชอบดังนั้น+
(defn + [a b] ...your-implementation-here... )
นี่คือความจริงสิ่งที่เกิดขึ้นในการนำไปใช้จริง (เนื้อหาของฟังก์ชั่นนั้นมีส่วนเกี่ยวข้องมากกว่า แต่ความหมายนั้นเหมือนกับที่ผมเขียนไว้ด้านบน)
สิ่งที่เกี่ยวกับสัญกรณ์มัด Clojure ใช้prefix
สัญกรณ์ (หรือโปแลนด์) ดังนั้นเราสามารถสร้างinfix-to-prefix
แมโครที่จะเปลี่ยนรหัสนำหน้าเป็นรหัส Clojure ซึ่งอันที่จริงแล้วเป็นเรื่องง่ายอย่างน่าประหลาดใจ (จริงๆแล้วมันเป็นหนึ่งในแบบฝึกหัดแมโครใน koans ปิดบัง)! นอกจากนี้ยังสามารถมองเห็นได้ในป่าเช่นดูIncanter$=
แมโคร
นี่เป็นเวอร์ชั่นที่ง่ายที่สุดจาก koans ที่อธิบาย:
(defmacro infix [form]
(list (second form) (first form) (nth form 2)))
;; takes a form (ie. some code) as parameter
;; and returns a list (ie. some other code)
;; where the first element is the second element from the original form
;; and the second element is the first element from the original form
;; and the third element is the third element from the original form (indexes start at 0)
;; example :
;; (infix (9 + 1))
;; will become (+ 9 1) which is valid Clojure code and will be executed to give 10 as a result
เพื่อผลักดันให้จุดยิ่งขึ้นบางคำพูดเสียงกระเพื่อม :
“ ส่วนหนึ่งของสิ่งที่ทำให้ Lisp โดดเด่นคือมันถูกออกแบบมาเพื่อพัฒนา คุณสามารถใช้ Lisp เพื่อกำหนดตัวดำเนินการ Lisp ใหม่ เมื่อ abstractions ใหม่กลายเป็นที่นิยม (เช่นการเขียนโปรแกรมเชิงวัตถุ) มันจะกลายเป็นเรื่องง่ายที่จะนำไปใช้ใน Lisp เช่นเดียวกับ DNA ภาษาดังกล่าวไม่ได้มีสไตล์ "
- Paul Graham, ANSI Common Lisp
“ การเขียนโปรแกรมใน Lisp เหมือนกับการเล่นกับกองกำลังดั้งเดิมของจักรวาล รู้สึกเหมือนสายฟ้าอยู่ระหว่างปลายนิ้วของคุณ ไม่มีภาษาอื่นแม้แต่รู้สึกใกล้ชิด "
- Glenn Ehrlich, Road to Lisp