############################## librep 版 ############################## #!/usr/bin/rep !# ;; 沒有下面這列 (保持註解), x 就是一個 lexical variable; ;; 加上下面這列 (把分號拿掉), x 就變成一個 dynamic variable ;(defvar x 1) (let ( (x -1) ) (defun f (choice) (let ( (x 5) ) (defun h () (format standard-output "%d\n" x) ) (defun g1 () (let ( (x 31) ) (h) ) ) (defun g2 () (let ( (x 42) ) (h) ) ) (if (eq choice 1) (g1) (g2)) ) ) (f 1) (f 2) (format standard-output "%d\n" x) ) ############################## perl 版 ############################## #!/usr/bin/perl -w # lexical scoping 與 dynamic scoping 的比較: # 請執行本程式, 然後把 use vars 這句, 以及三句 local 通通註解掉, # 又把各句下面的 my 打開 (井號拿掉), 再執行一次. 比較兩次的結果. use strict; use vars qw($x); #my ($x); $x = -1; sub f { local ($x) = 5; # my ($x) = 5; sub h { print "$x\n"; } sub g1 { local ($x) = 31; # my ($x) = 31; h(); } sub g2 { local ($x) = 42; # my ($x) = 42; h(); } if ($_[0] == 1) { g1(); } else { g2(); } } f(1); f(2); print "$x\n"; ############################## pascal 版 ############################## { 翻譯: p2c scoping.pas 編譯: gcc scoping.c -lp2c 執行: ./a.out } program scoping_demo; const x = -1; procedure f(choice: integer); const x = 5; procedure h; begin writeln(x); end; procedure g1; const x = 31; begin h; end; procedure g2; const x = 42; begin h; end; begin if (choice = 1) then g1 else g2; end; begin f(1); f(2); writeln(x); end.