आप जो अनुरोध करते हैं वह मुश्किल है। यह मैक्रोज़ के लिए एक नौकरी है, जैसा कि पहले से ही दूसरों द्वारा उजागर किया गया है। मैं एक अलग संभावना का पता लगाऊंगा - एक ही प्रतीक का उपयोग करने के लिए, लेकिन उस कोड के चारों ओर कुछ रैपर डालें जिन्हें आप लिखना चाहते हैं। इस तकनीक का लाभ यह है कि कोड रन-टाइम (जैसा कि अन्य उत्तरों में) के बजाए "लेक्सिकली" और "कंपाइल-टाइम" में बदल दिया गया है। यह आम तौर पर डीबग करने के लिए तेज़ और आसान दोनों होता है।
Clear[expandWith];
expandWith[heldCode_Hold] :=
Module[{with},
heldCode /. With -> with //. {
HoldPattern[with[{{} = {}, rest___}, body_]] :>
with[{rest}, body],
HoldPattern[
with[{
Set[{var_Symbol, otherVars___Symbol}, {val_, otherVals___}], rest___},
body_]] :>
with[{{otherVars} = {otherVals}, var = val, rest}, body]
} /. with -> With]
ध्यान दें कि यह रखे हुए कोड पर चल रही है:
तो, यहाँ एक समारोह जो अपने प्रस्तावित वाक्य रचना के साथ With
परिणत हो गया है। इसका लाभ यह है कि हमें संभव मूल्यांकन के बारे में चिंता करने की ज़रूरत नहीं है, न तो शुरुआत में और न ही expandWith
समाप्त हो गया है। यहां बताया गया है कि यह कैसे काम करता है:
In[46]:= [email protected][With[{{x1,x2,x3}={a,b,c}},x+x1+x2+x3]]
Out[46]= Hold[With[{x3=c,x2=b,x1=a},x+x1+x2+x3]]
हालांकि, इसका उपयोग करने के लिए बहुत सुविधाजनक नहीं है।यहाँ इस आसान बनाने के लिए एक सुविधा समारोह है:
In[47]:= [email protected][{{x1,x2}={a,b}},x+x1+x2]
Out[47]= a+b+x
तो, विस्तार कोड में होती हैं, बस लपेट ew
इसके चारों ओर बनाने के लिए:
ew = Function[code, [email protected]@[email protected], HoldAll]
हम यह अब के रूप में उपयोग कर सकते हैं।
Remove[f];
ew[f[x_] := With[{{x1, x2} = {a, b}}, x + x1 + x2]]
अब हम जांच करें और देखें कि क्या हम मिल एक विस्तारित परिभाषा है:
?f
Global`f
f[x_]:=With[{x2=b,x1=a},x+x1+x2]
इस दृष्टिकोण का लाभ यह है कि आप एक के आसपास ew
लपेट कर सकते हैं यहाँ समारोह की परिभाषा के लिए अपने मामले है आपके कोड का मनमाने ढंग से बड़ा हिस्सा। क्या होता है कि पहला, विस्तारित कोड उस से उत्पन्न होता है, जैसे कि आप इसे स्वयं लिखेंगे, और फिर वह कोड निष्पादित हो जाता है। फ़ंक्शन की परिभाषाओं के मामले में, जैसे f
ऊपर, हम यह कर सकते हैं कि कोड जनरेशन "संकलन-समय" पर होता है, इसलिए जब आप फ़ंक्शन को बाद में करते हैं तो आप किसी भी रन-टाइम ओवरहेड से बचते हैं, जो फ़ंक्शन को अक्सर कहा जाता है, तो यह पर्याप्त हो सकता है।
इस दृष्टिकोण का एक अन्य लाभ इसकी संगतता है: आप कई वाक्यविन्यास एक्सटेंशन के साथ आ सकते हैं, और उनमें से प्रत्येक के लिए ew
जैसा कार्य लिखना है। फिर, बशर्ते कि ये कस्टम कोड-ट्रांसफॉर्मिंग फ़ंक्शंस एक-दूसरे के साथ विवाद न करें, आप एक संचयी प्रभाव प्राप्त करने के लिए बस (घोंसला) बना सकते हैं। एक मायने में, इस तरह आप एक कस्टम कोड जेनरेटर बनाते हैं जो आपके गणित अभिव्यक्तियों में प्रोग्राम का प्रतिनिधित्व करने वाले कुछ गणित अभिव्यक्तियों से वैध गणित कोड उत्पन्न करता है, ताकि आप इन माध्यमों का उपयोग करके गणित के भीतर बना सकें।
संपादित
expandWith
लेखन में, मैं मूल्यांकन नियंत्रण है, जो एक गड़बड़ हो सकता है के साथ काम कर से बचने के लिए पुनरावृत्ति नियम आवेदन का इस्तेमाल किया। हालांकि, रुचि रखने वालों के लिए, यहां एक संस्करण है जो कोड के अनियमित टुकड़ों के साथ कुछ स्पष्ट कार्य करता है।
Clear[expandWithAlt];
expandWithAlt[heldCode_Hold] :=
Module[{myHold},
SetAttributes[myHold, HoldAll];
heldCode //. HoldPattern[With[{Set[{vars__}, {vals__}]}, body_]] :>
With[{eval =
(Thread[Unevaluated[Hold[vars] = Hold[vals]], Hold] /.
Hold[decl___] :> myHold[With[{decl}, body]])},
eval /; True] //. myHold[x_] :> x]
मुझे यह पहले की तुलना में काफी जटिल लगता है।
मैं अक्सर ऐसे डिज़ाइन विकल्पों पर विचार करता हूं, और मैं कभी-कभी ऐसे प्रश्न पोस्ट करता हूं। दुर्भाग्य से यह दुर्लभ है कि ऐसी चीजों को समझाया गया है। मैंने खुद को इस तथ्य से दबदबा किया है कि/ब्लॉक/मॉड्यूल बस अलग-अलग काम करता है, और इनके पहले तर्क में 'सेट' वास्तव में 'सेट' ऑपरेशन नहीं कर रहा है बल्कि इसके बजाय वाक्यविन्यास है। –
त्रुटि संदेश प्रलेखन (मेरे क्यू के अंत की तरफ उद्धृत भाग) के पढ़ने से मुझे ऐसा लगता है कि वर्तमान व्यवहार को चलाने के लिए कुछ सरल पैटर्न है --- यानी, सिर सूची वाले पैटर्न को स्वीकार करना, जिसमें केवल तत्व जो MatchQ जैसे कुछ के लिए सत्य का मूल्यांकन करते हैं [होल्ड [सेट [एक्स, 1]], [सेट [Symbol_, _]]] दबाएं। यदि ऐसा है, तो कम से कम मेरी मायोपिक छोटी दुनिया में, पैटर्न मिलान/परीक्षण को ट्विक करने के लिए संभव लगता है कि मैं जिस व्यवहार की तलाश करता हूं, और यह कि सेट पर प्रलेखन को इंगित करना चाहिए (एक वैध रूप के रूप में) असाइनमेंट का)। – telefunkenvf14
मैं असहमत नहीं हूं, लेकिन मुझे उस परिवर्तन को प्रभावित करने का कोई तरीका नहीं है। –