Monday, November 28, 2005

Higher Order Procedures

วันนี้เจอ ruby code ที่เขียนแบบนี้
oper = proc do |op|
proc do |x, y|
x.method(op).call(y)
end
end

add = oper[:+]
add[1,2] # => 3

sub = oper[:-]
sub[2,1] # => 1


นี่ถ้าเป็นเมื่อก่อน ตอนที่ยังไม่เรียน scheme
ก็คง งงงวย พักใหญ่
(การเขียน คง กับ งงงวย ติดกัน อาจทำให้ผู้อ่านเกิด
อาการเมา blog ได้)
แต่หลังจากเรียนรู้ scheme แล้วก็เลยรู้ว่า
มันคือ higher order procedure นี่เอง


• A procedure is said to be “first-order” if
none of its arguments is itself a procedure.
• A procedure is said to be “higher-order” if
one or more of its arguments is a procedure.


ถ้าเขียนใน scheme ก็จะเป็นแบบนี้
(define oper
(lambda (op)
(lambda (x y)
(op x y))))

(define add
(oper +))

(define sub
(oper -))

(add 1 2) ;; => 3
(sub 2 1) ;; => 1

Related link from Roti

4 comments:

Anonymous said...

ก็ยังงง ๆ อยู่ครับ ruby ผมเองก็ไม่ค่อยได้เรื่องเท่าไร ขอบคุณมากครับที่่มี ruby ให้อ่านอยู่เรื่อย ๆ ผมจะมาอ่านทุก ๆ วัน ขยันอัพเดทด้วยนะครับ ผม

ยงยุทธ

bact' said...

method(op) กับ : ใน oper[:+]

นี่คือทำให้เราพิมพ์ + กับ - ได้ใช่มั๊ยครับ ?
คือ + กับ - เป็น object ด้วย

bact' said...

ดีที่ คง งงงวย มีฝูงงูอยู่นะ

nontster said...

มา งงงวย ด้วยคน หวังว่าจะเลิกงงเร็วๆนี้ :)