Tuesday, April 04, 2006

[clisp, perl] dynamic scope

เคยเขียนกรณี Dynamic scope & Static scope ไปที
ตอนนั้นระบุว่า scheme, javascript เป็น static scope
ส่วน ruby เป็น dynamic scope

วันนี้มาดู clisp บ้าง
clisp สามารถเลือกได้ว่าจะให้เป็น static หรือ dynamic scope
โดย default จะเป็น static scope

(setq x 5)
(defun get-x () x)
(let ((x 12)) (get-x)) ;; => 5

ผลลัพท์ที่ได้จากคำสั่งที่ 3 , get-x จะได้ค่า 5 ออกมา
(ซึ่งเราเรียกว่า static scope)
แต่ถ้าเป็น dynamic scope, get-x จะต้องได้ค่า 12 ออกมา

ใน clisp เราสามารถกำหนดให้ตัวแปรเป็น dynamic scope ได้
โดยใช้คำสั่ง defvar
(defvar y 5)
(defun get-y () y)
(let ((y 12)) (get-y))


perl ก็สามารถเป็นได้ทั้ง static หรือ dynamic scope
กรณี static
$x = 5;
sub get_x {
print "x = $x";
}
sub test_static {
my $x = 12;
get_x();
}
test_static # => x = 5

ถ้าต้องการ dynamic ก็จะเป็นแบบนี้
$y = 5;
sub get_y {
print "y = $y";
}
sub test_dynamic {
local $y = 12;
get_y();
}
test_dynamic; # => y = 12

Related link from Roti

5 comments:

Anonymous said...

python มั่ง (python เป็น static (lexical) scoping)
ถ้าอยากให้เป็น dynamic scope ต้องส่ง scope ให้เป็น parameter กับคำสั่ง eval

x = 5
def get_x(): print 'x = %d' % x
def test():
x = 7
get_x()
test() # got 5


def get_x2(): print 'x = %d' % eval('x')
def test2():
x = 7
get_x2()
test2() # got 5


def get_x3(scope): print 'x = %d' % eval('x', *scope)
def test3():
x = 7
get_x3((globals(), locals()))
test3() # got 7

Anonymous said...

(html ไม่ชอบเว้นวรรค... เศร้า)
(นี่มันสมัยไหนกันแล้วทำไมยังไม่เป็น WYSIWYG editor อีก ?)

x = 5
def get_x(): print 'x = %d' % x
def test():
    x = 7
    get_x()
test() # got 5


def get_x2(): print 'x = %d' % eval('x')
def test2():
    x = 7
    get_x2()
test2() # got 5


def get_x3(scope): print 'x = %d' % eval('x', *scope)
def test3():
    x = 7
    get_x3((globals(), locals()))
test3() # got 7

polawat phetra said...

แหม กำลังอยากรู้เลย ว่า python
ทำ dynamic scope ได้ไหม

ขอบคุณครับ

ปล. : ) เวลาไม่มี indent นี่
ถ้าเป็นภาษาอื่น ยังแกะกลับมาได้
แต่ python แบบไม่มี indent นี่
เกิดความกำกวมขึ้นมาทันที

bact' said...

เป็นสาเหตุที่จะทำให้เลิก Python แล้วเนี่ย - -"

เจอ text editor หักหลังมาหลายรอบ
ใช้ spaces กับ tab ปนกันไม่ได้นะครับ เจ๊งเลย
(text editor บางตัวมันจะแปลง tab <-> spaces ..แต่บางครั้งก็แปลงไม่หมด)

มีอยู่ช่วงนึง ถ้าโปรแกรมเจ๊ง ให้ดู whitespace ก่อน ! (ชีวิตฉัน)

Anonymous said...

update ครับ
python ทำ dynamic scope แบบนี้ก็ได้เหมือนกัน
ไม่ต้องมี scope เป็น argument แล้ว


x =5
def get_x4(): print 'x = %d' % x
def test4():
    x = 7
    eval(get_x4.func_code, locals())
test4() # got 7