我是Eval(Substitute(Expr(...), Expr(..), Expr(.)))的忠實粉絲

唯一的缺點: Expr(...)、Expr(..)、Expr(.)
……這讓我想到了subst() - Replacement() 2.0 ...一個不評估其參數的函數。
在玩弄表達式處理時,我注意到Subst()所需的邏輯與Extract Expr() 的邏輯非常接近:不需要使用Expr(),並且盡可能應用Name Expr() :
Names Default to here(1);
// direct mode, no Expr necessary
Extract Expr(x^2 + y, x);// -> x
Extract Expr(x^2 + y, c);// no c in x^2 + y -> empty
// Name Expr mode
c=Expr(x^2);
Extract Expr(x^2 + y , c);// looks up c = x^2, find "x^2"" in x^2 +y
精彩的!
…… 直到:
Extract Expr(cc * d , cc); // -> cc
cc=Expr(x^2);
Extract Expr(cc * d, cc);// looks up cc = x^2 , so doesn't find cc in cc * d anymore
危險的 ...
將cc定義為名稱為 expr 的符號後,是否仍可在Extract Expr中「按字面意思」使用c ?
Extract Expr(cc * d , Expr(cc)); // doesn't work
Extract Expr(Expr(cc) , Expr(cc)); // finds Expr(cc)
Extract Expr(cc , Name Expr(Expr(cc))); // -> empty
Extract Expr(Name Expr(Expr(cc)) , Name Expr(Expr(cc))); // finds Name Expr(Expr(cc)), argh!
甚至:
cc=Expr(x^2);
clear symbols(cc);
Extract Expr(cc * d , cc); //-> empty()
或許:
使用自訂函數作為Extract Expr的包裝器
Names default to here(1);
dummy=Function ({expression, pattern},
Extract Expr(expression, pattern);
);
cc = Expr(x^2);
dummy( Expr(cc+d), Expr(cc)); // -> cc您是否正在尋找答案?您也閱讀過有關表達式的腳本指南 腳本指南 > 程式設計方法 > 進階表達式、巨集和清單 - 高階表達式,特別是如何評估它們的部分?
在連結的頁面上,我沒有找到關於ExtractExpr()的更多資訊。
@jthi寫道:
你有什麼問題要找答案嗎?
如何確保 JMP 在表達式cc * d中搜尋cc ?
即使 cc 被用作另一個表達式的名稱,例如x^2 的表達式。
Extract Expr(cc * d , cc); // -> cc
cc=Expr(x^2);
Extract Expr(cc * d, cc);// looks up cc = x^2 , so doesn't find cc in cc * d anymore
更普遍地說:
自訂函數總是會對其參數進行求值-而透過表達式()函數可以阻止它這樣做。
擷取表達式總是會在使用名稱(如果有)之前檢索其背後的未求值表達式 - 用戶能否阻止它這樣做?
當使用名稱作為參數時,平台指令經常會受到干擾——而Eval 函數或許可以解決這個問題。
JSL中總共有多少種參數處理方式?是否存在某種界線?
為什麼要在多個地方使用相同的變數名稱?
刪除符號() 和清除符號() 不同
Names Default To Here(1);
cc = Expr(x ^ 2);
Delete Symbols(cc);
Extract Expr(cc * d, cc);