Thursday, January 12, 2006

Dynamic scoping & Static scoping

ลองดูตัวอย่าง ruby อันนี้
def x() 
puts 'outer'
end

def y()
x()
end

def z()
def x
puts 'inner'
end
y()
end

คำถามก็คือ ถ้าเราเรียกใช้งาน method z
เราจะเห็น output ที่ stdio เป็นอะไร ระหว่าง "inner" กับ "outer"

ที่นี้ลองดู javascript บ้าง
function x() {
alert('outer')

}
function y() {
x()
}

function z() {
function x() {
alert('inner')
}
y()
}

ทายสิว่า alert box ที่ได้ จะมีข้อความว่า "inner" หรือ "outer"

ถ้าเป็น scheme หล่ะ
(define (x)
(print "outer"))

(define (y)
(x))

(define (z)
(define (x) print "inner")
(y))


javascript กับ scheme จะได้ message ออกมาเป็น "outer"
ส่วน ruby จะได้คำตอบเป็น "inner"

Static Scope
In a language with static scope, each identifier gets its value from the scope
of its definition, not its use.

Dynamic Scope
In a language with dynamic scope, each identifier gets its value from the
scope of its use, not its definition.


ruby -> dynamic scope
javascript, scheme -> static scope

UPDATE
code ruby เขียนผิด แก้ให้ถูกแล้ว
มันผิดตอนเอาไปทำสวย (syntax highligh)

Related link from Roti

3 comments:

bact' said...

โค้ดรูบี้ x() อันสุดท้ายก่อนจบโปรแกรม ตั้งใจจะให้เป็น y() ป่าวครับ ?

อยากจะลากคุณ Pok ไปสอน software eng + programming lang :P

(อย่างผมนี่พอจะเป็นอาจารย์กะเค้าได้มั่งมะ ?)

PPhetra said...

เอาแค่สอนพิเศษก็พอ : )
ขี้เกียจเรียนโท
(เข้าใจว่า ใครจะเป็นอาจารย์ต้องจบโท ขึ้นไป)

bact' said...

ไม่เห็นเกี่ยวเลยอ่ะ - -

ถ้ารู้เรื่องไหนดี ก็สอนได้สิ :P
(ผมจบโทแล้วยังไม่เห็นจะทำไรอย่างคุณ Pok ได้เลย)