JMP 範圍 -- 動態範圍與詞法範圍以及一般混淆學習 JSL如果我錯了,請糾正我,但 JMP 似乎具有動態作用域,沒有作用域持久性(偽命名空間除外)這裡,窗戶,盒子)。這與許多流行的編程語言形成鮮明對比,這些編程語言具有詞法範圍和使用引用計數器的完整範圍持久性。
這讓我非常頭疼,直到我獲得了使用 JMP 奇怪的示波器系統所需的直覺,我相信這對許多人來說是一個很大的困惑。沒有多少編程語言使用動態作用域(LISP 是一個重要的例外,JSL 與 LISP 有一些相似之處)。
我鼓勵 JSL 文檔團隊指出這種區別,並提供一些有關如何更好地理解動態作用域的資源/鏈接,因為它肯定不是進行名稱解析的標準方法。
這是一個示例——外部函數的局部作用域在 return 語句之後立即被清除,並且內部函數的名稱解析是動態的(基於當前的調用堆棧):
Names Default to Here( 1 );
x = 7;
outer function = Function( {},
{x},
x = 4;
inner function = Function( {},
Print( x )
);
Return( Name Expr( inner function ) );
);
func = outer function;
func()
/*** OUTPUT ***
7如果您在具有作用域持久性的詞法作用域語言(例如Python)中執行功能等效的操作,則內部函數的封閉作用域是持久的(它是外部函數的本地作用域),並且內部函數的名稱解析函數的 x 變量是系統詞法讀取的值 4。由於JMP不使用詞法作用域,而是使用動態作用域,那麼當內部函數最終在腳本末尾執行時,它使用動態名稱解析Local -> Here -> Global(以及可能的column-)當前表的名稱)並找到值 7。
理解這種類型的行為對於在 JSL 中構建健壯的程序至關重要,我只想向任何學習/努力使用 JSL 的人指出這一點。
如果您有任何想法/不直觀的例子,請告訴我!
自動化和腳本編寫數據存取回复:JMP 作用域——動態作用域與詞法作用域以及一般混淆學習 JSL這是真的,並且在學習這門語言時確實讓我感到困惑。另一個問題是 JSL 是術語重寫語言由於它的表達式對象,這意味著雖然在作用域方面是 LISP 式的,但在處理宏的方式方面卻不是 LISP 式的。
據我所知,唯一一種流行的術語重寫語言是 Wolfram 語言。我對 CS 不夠精通,無法肯定地說,但我聽到一些人聲稱術語重寫範式嚴格來說比 Lisp 的宏更強大。另一方面,我聽到有人聲稱 Wolfram 語言只是 m 表達式的實現,而 Lisp 認為 s 表達式已經足夠好了。
無論如何,JSL 的表達系統對幾乎每個人來說都是陌生的,並且其處理表達的功能的人體工程學對他們沒有任何好處。您可以在這個論壇中找到這麼多使用字符串操作和 Parse() 而不是術語重寫功能的示例,這是有原因的。
回复:JMP 作用域——動態作用域與詞法作用域以及一般混淆學習 JSL我自己不是一個計算機科學的人,但是術語重寫的東西很有趣!謝謝你的參考,我現在要在這個兔子洞裡整夜不眠......
回覆:JMP 範圍-動態範圍與詞彙範圍、學習 JSL 時常見的困惑這
func = outer function;
func();
這讓我很困惑。
執行後
func = outer function();
內部函數的定義儲存在變數 func 中。
這就是顯示(函數)回傳的原因
func = Function({},Print(x));
至此,所有關於外部功能和內部功能的資訊都消失了。
所以func()將執行Print(x)並...列印7 。
編輯:
實際上,與主帖中寫的內容相比,並沒有什麼新內容。
這只是JSL程式設計師的「二維視角」。
回覆:JMP 範圍-動態範圍與詞彙範圍、學習 JSL 時常見的困惑JMP 會保留函數定義中的變數原樣——它不會自動用當前值取代它們。
所以,之後
x = 4;
inner function = Function( {}, Print( x ));
inner function is defined as
Function( {}, Print( x ));
為了使內部函數將其自身的x替換為外部函數中的x ,需要進行一些預評估,例如:
Names Default to Here( 1 );
x = 7;
outer function = Function( {},
{x},
x = 4;
Eval(Eval Expr( inner function = Function( {},
x= Expr(x);
Print( x )
)));
Return( Name Expr(inner function));
);
func = outer function;
func() // prints 4
編輯:同樣的二維視圖,只是換了些文字。
回覆:JMP 範圍-動態範圍與詞彙範圍、學習 JSL 時常見的困惑我迅速地朝柵欄那邊看了一眼:
def outer():
y=4
def inner():
print(y)
return inner
f = outer()
y = 7
f() # -> 4
所以,Python 回傳 3。因為這是定義 inner 時,詞法上下文中 y 的定義方式。
是「已定義」還是「已返回」?
我們再來看一次:
def outer():
y=4
def inner():
print(y)
y=-100
return inner
f = outer()
y = 7
f()
-> -100