ซึ่ง RoR หยิบมา implement ในหลายๆส่วนใน ActiveRecord
เช่น
- การ declare relationship ระหว่าง model
- การ declare Validate rule ของ model
ใน scheme มี function
define-syntax
ที่อนุญาตให้เรา define syntax ของเราเองได้ลองดูตัวอย่างง่ายๆ (ง่ายสุดๆ)
ปกติใน scheme, การ assign value ให้กับ variable จะใช้ syntax นี้
(define a 10)
วันดีคืนดี เกิดอยากเปลี่ยนรูปแบบ syntax ให้เป็นแบบนี้
(mylet a = 10)
Note: อยากใช้ let นะ จะได้เหมือน basic แต่ว่า scheme มี let ใช้แล้ว
เลยเปลี่ยนเป็น mylet แทน
วิธี define syntax ก็ง่ายๆ
เริ่มด้วย
(define-syntax mylet
(lambda (x)
(syntax-case x (=)
(
;;pattern to match
(mylet var = value)
;;transformer
(syntax (define var value))
)
)))
เริ่มด้วย
(mylet a = 10)
จะถูก pass เข้าไปในรูปตัวแปร xจากนั้นก็จะถูก function syntax-case เอาไปใช้ในการทำ pattern matching
ประโยค
syntax-case x (=)
หมายความว่าเครื่องหมาย
=
ใช้เป็น reserved word สำหรับ syntax นี้ใน
syntax-case
จะประกอบด้วยpattern mathcing กับ transformer
(mylet var = value)
เป็น pattern matching ซึ่งจะถูก match เข้ากับ
(mylet a = 10)
ผลลัพท์ที่ได้ var => a, value => 10
(syntax (define var value))
เป็นส่วน transformerในที่นี้
(mylet a = 10)
ก็จะถูกแปลงเป็น (define a 10)
อ่านตัวอย่างเพิ่มเติมในบทความ Metaprogramming using Scheme
No comments:
Post a Comment