togo 和 toperl 的行爲不一樣,原來是 togo 在處理 for exprs 時,沒有按照 block 來處理。函數
函數和方法,都會創建一個名字爲函數名的命名空間,而 block 是匿名的命名空間。在解析時,會按照解析順序用累加器,來爲每一個 block 來命名。code
if cond block elif cond block else block given cond block when cond block then block while cond block for cond block
LintMyAst 時,會進入一個命名空間爲包名的空間,但由於沒有結束語句,在解析結束時,並不會從當前命名空間退出,只是將 block 計數器清零。而 perl / go 解析相同語法樹的代碼時,並不須要從新進入這個包,只是須要在合適的地方,切換到不一樣的空間,就能夠獲取已經定義的變量和函數資源,從而隨時獲取有須要的信息,爲代碼轉換提供方便。資源
進入 func, def 時,切換到以函數名爲名字的命名空間,但不會把代碼當成 block 處理變量
進入 if/elif/else given/when/then for/while block 時切換命名空間。命名空間
解析完語法樹時,將計數器清零,以便爲後來的代碼轉換提供良好的開端。perl
但在解析語法樹開始時,要習慣的將計數器清零,以防止出錯。語法