2011-11-19 6 views
6

Quiero escribir unPaso de una función a un módulo sin especificar sus argumentos

Module Arg[f_,n_] 

que toma una función f (que tiene < = n argumentos) y un número natural n y emite el argumento n-ésimo de la función f.

Como un ejemplo, supongamos que f está definida por

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

Entonces,

Arg[f[s,t],1] 

debería haber s;

mientras

Arg[f[u,v],2] 

debe ser v.

Mi pregunta es si eso es posible. Si es así, ¿qué debo escribir en el lugar de "???" ¿abajo?

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

Tenga en cuenta que no quiero especificar a_ b_ y en la definición de Arg como

Arg[f_,a_,b_,n_] 

EDIT: "Arg" es sólo mi nombre para el módulo no la función interna de Arg Mathematica.

+0

Se da cuenta de 'Arg' es una función interna, ¿verdad? ¿Quiso reescribir 'Arg' (no se ve así en la definición) o fue simplemente una mala elección del nombre de la función? Además, probablemente quisiste decir 'Arg [f [u, v], 2]' da 'v'? – abcd

+0

Acaba de echar a perder mis ediciones @bel :) – abcd

+0

@yoda Lo siento :(. Tengo algunos problemas con JS en mi navegador. Quizás es por eso que no recibí el aviso de "edición previa". Siéntase libre de retrotraer mi Cambia o combínalos con los tuyos –

Respuesta

10

Quizás

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

Asumiendo que su segundo ejemplo debe dar u, esto debería hacer el trabajo:

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 
    ] 

modo que

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

da s.

Esto es muy pesado, así que espero que alguien encuentre algo mejor pronto.

Esto es un poco mejor (no redefine funciones integradas aunque sea temporalmente):

ClearAll[arg2]; 
SetAttributes[arg2, HoldFirst]; 
arg2[g_, n_] := Hold[g][[1, n]] 
Cuestiones relacionadas