ตอนนั้นระบุว่า 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
5 comments:
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
(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
แหม กำลังอยากรู้เลย ว่า python
ทำ dynamic scope ได้ไหม
ขอบคุณครับ
ปล. : ) เวลาไม่มี indent นี่
ถ้าเป็นภาษาอื่น ยังแกะกลับมาได้
แต่ python แบบไม่มี indent นี่
เกิดความกำกวมขึ้นมาทันที
เป็นสาเหตุที่จะทำให้เลิก Python แล้วเนี่ย - -"
เจอ text editor หักหลังมาหลายรอบ
ใช้ spaces กับ tab ปนกันไม่ได้นะครับ เจ๊งเลย
(text editor บางตัวมันจะแปลง tab <-> spaces ..แต่บางครั้งก็แปลงไม่หมด)
มีอยู่ช่วงนึง ถ้าโปรแกรมเจ๊ง ให้ดู whitespace ก่อน ! (ชีวิตฉัน)
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
Post a Comment