2011-11-19 17 views
6

निर्दिष्ट किए बिना एक मॉड्यूल के लिए एक समारोह पासिंग मैं एकअपने तर्कों

Module Arg[f_,n_] 

कि एक समारोह च लेता है लिखना चाहते हैं और एक प्राकृतिक संख्या n (< = n तर्क वाले) और के एन-वें तर्क आउटपुट समारोह एफ।

उदाहरण के लिए, मान लीजिए कि च

f[a_,b_]=a^2+b^2. 
फिर

,

Arg[f[s,t],1] 

रों होना चाहिए द्वारा परिभाषित है,

जबकि

Arg[f[u,v],2] 

वी होना चाहिए।

मेरा प्रश्न है कि क्या यह संभव है। यदि हां, तो मुझे "???" के स्थान पर क्या लिखना चाहिए नीचे?

Arg[f_,n_] := Module[{}, ??? ] 

ध्यान दें कि मैं की तरह

Arg[f_,a_,b_,n_] 

संपादित Arg की परिभाषा में a_ और b_ निर्दिष्ट करने के लिए नहीं करना चाहते हैं: "Arg" बस मॉड्यूल के नहीं आंतरिक समारोह Arg के लिए मेरा नाम है मेथेमेटिका।

+0

आपको पता 'Arg' एक आंतरिक समारोह, सही है? क्या आपका मतलब 'Arg' को फिर से लिखना है (परिभाषा से ऐसा नहीं दिखता है) या क्या यह फ़ंक्शन नाम की एक खराब पसंद थी? इसके अलावा, आप शायद 'Arg [f [u, v], 2]' 'v' देता है? – abcd

+0

आपने बस मेरे संपादन @bel :) को बंगला दिया है – abcd

+0

@yoda क्षमा करें :(मुझे अपने ब्राउज़र पर जेएस के साथ कुछ परेशानी हो रही है। शायद यही कारण है कि मुझे "पिछली संपादन" सूचना नहीं मिली। मेरे रोलबैक के लिए स्वतंत्र महसूस करें उन्हें बदल दें या उन्हें अपने साथ विलय करें। –

उत्तर

10
शायद

SetAttributes[arg, HoldFirst]; 
arg[f_[x___], n_] := {x}[[n]] 

f[a_, b_] := a^2 + b^2. 
arg[f[arg[f[s, t], 1], t], 1] 
arg[f[s, t], 2] 

(* 
-> s 
-> t 
*) 

arg[ArcTan[f[[email protected]@x, x], t], 1] 

(* 
-> x^2. + Cos[Sin[x]]^2 
*) 
4

अपने दूसरे उदाहरण मानते हुए u देना चाहिए, यह काम करना चाहिए:

ClearAll[arg]; 
SetAttributes[arg, HoldFirst]; 
arg[g_, n_] := Module[ 
    {tmp, ret}, 
    Unprotect[Part]; 
    tmp = Attributes[Part]; 
    SetAttributes[Part, HoldFirst]; 
    ret = Part[g, n]; 
    ClearAttributes[Part, HoldFirst]; 
    SetAttributes[Part, tmp]; 
    Protect[Part]; 
    ret 
    ] 

ताकि

f[a_, b_] = a^2 + b^2.; 
arg[f[s, t], 1] 

s देता है।

हालांकि यह बहुत भारी हाथ है, इसलिए मुझे उम्मीद है कि किसी को जल्द ही कुछ बेहतर मिलेगा।

इसमें कुछ समय बेहतर है (फिर से परिभाषित नहीं है बिल्ट-इन कार्य भी अस्थायी रूप से) है:

ClearAll[arg2]; 
SetAttributes[arg2, HoldFirst]; 
arg2[g_, n_] := Hold[g][[1, n]] 
संबंधित मुद्दे