Re: 함수의 키워드 인수@vince_faller
멋진 예입니다. 공유해 주셔서 감사합니다. 오타 수정
show(f(2, {y=14})); // 36 not 33
Re: 함수의 키워드 인수@gzmorgan0
나는 이것을 hamcrest에서 훔친 것 같지만 우리는 한동안 그것을 사용해 왔으며 실제로 훨씬 더 나은 방법입니다. 여전히 나쁜 일을 할 수 있지만 조금 더 잘 확인합니다.
Names default to here(1);
f = function({x, kwargs = {}},
{DEFAULT LOCAL},
// kwargs
y = try(kwargs["y"], 2); // so the default is 2
z = try(kwargs["z"], 3); // 3
a = try(kwargs["a"], Expr(y+z)); // Expr(y+z)
r = x + y + z + eval(a);
return(r);
);
show(f(2)); // 12
show(f(2, {y=14})); // 33
show(f(2, {wrong=14})); // still 12
show(f(2, {y=3, a=Expr(y^2)})); // 17
Re: 함수의 키워드 인수@gzmorgan0 kwargs 목록의 가장 큰 문제는 무엇이든 실행할 수 있다는 것입니다. 예를 들어 주어진 함수에서 모든 지역을 보고 싶은 경우입니다.
f = function({x, kwargs = {}},
{y = 2, z = 3, a = Expr(y + z)},
evallist(kwargs);
r = x + y + z;
return(r);
);
f(14, {print(namespace("local") << Get Contents)});
암호화된 코드에 대한 보안 문제입니다.
나는 실제로 연관 배열에 물건을 보관한 다음 전달된 인수가 유효한지 확인하기 위해 기본 연관 배열과 << 교차를 수행합니다.
그런 다음 배열을 사용하여 호출할 필요가 없도록 키 값 쌍을 함수로 구문 분석하기만 하면 됩니다.
이 모든 작업을 수행할 수 있는 도움말 기능이 있지만 고유한 문제가 발생합니다.그리고 생각보다 번거롭습니다.
@XanGregg , 내 잘못이야.나는 이러한 것들의 대부분에 대해 훨씬 더 좁은 시야를 가지고 있습니다.
Re: 함수의 키워드 인수@vince_faller , 수정된 제안된 kwargs={} 솔루션이 여전히 마음에 듭니다.IMHO Default Local은 간단한 스크립팅에는 좋지만 복잡한 스크립트에는 위험합니다.지역 변수 목록을 관리하는 것이 좋습니다. 어쨌든 아래는 kwargs 솔루션을 수정한 스크립트이지만 kwargs 목록의 항목으로 {z,4} 대 z=4 구문을 사용하고 일반적인 코드 블록이 필요합니다. 함수는 로컬 연관 배열을 사용하여 아래에 언급된 코드 블록을 암시하는 "키워드" 값을 할당할 수 있지만 개별 변수 구문은 a+b 대신 aa1[a] + aa1[b], 그래서 예제는 목록을 사용합니다.
변수가 많은 함수가 있지만 각 함수 호출에 대해 몇 가지만 변경하려는 경우 이 접근 방식을 사용할 수 있습니다. 여기서 핵심은
- varList에 있지 않는 한 어떤 변수도 변경되지 않으며,
- 변경된 값은 로컬입니다.
Names Default To Here( 1 );
//simple example
g1 = Function({kwargs={}}, {Default Local},
varList = {a,b,c,d,e,f};
valList = {1,2,3,4,5,6};
For(i=1, i<=nitems(kwargs), i++,
//each item must be a list of 2 values.
If(IsList(kwargs[i]),
Try(valList[loc(varList,kwargs[i][1])] = kwargs[i][2])
);
);
Eval( EvalExpr( Expr(varList) = Expr(valList)) ) ;
show(a,b,c,d,e,f);
);
myList = {{a,10},{y,-44},{f,20}};
g1(myList);
// [+] no variable gets changed unless it is in the variable list
// [-] varList and valList need to be defined
// [-] lines 7-13 would need to be added to each function, could be a global expression
// [-] instead of z=4 syntax, {z,4} syntax is required
//------Modification of Vince Faller script
f = function({x, kwargs={}},
{DEFAULT LOCAL},
// optional
varList = {x, y};
valList = {2,3};
For(i=1, i<=nitems(kwargs), i++,
//each item must be a list of 2 values.
If(IsList(kwargs[i]),
Try(valList[loc(varList,kwargs[i][1])] = kwargs[i][2])
);
);
Eval( EvalExpr( Expr(varList) = Expr(valList)) ) ;
print("Before Bad Call");
show(y);
print("Bad Call");
//even though f2 is default local,
//because it's not explicit in the function it writes to here
f2(1, { {b,3}, {y,5}});
print("After Bad Call");
show(y);
);
f2 = function({a, kwargs={}},
{DEFAULT LOCAL},
varList= {b,c};
valList = {2,3};
For(i=1, i<=nitems(kwargs), i++,
//each item must be a list of 2 values.
If(IsList(kwargs[i]),
Try(valList[loc(varList,kwargs[i][1])] = kwargs[i][2])
);
);
Eval( EvalExpr( Expr(varList) = Expr(valList)) ) ;
show(a, b, c);
);
f(1, {z=2});
Re: 함수의 키워드 인수오른쪽. 믿거 나 말거나, 우리는 오래된 JSL 동작을 중단하지 않으려 고 노력합니다.:)
Re: 함수의 키워드 인수아.따라서 누군가 어떤 이유로든 해당 구문을 사용하면 나중에 az global이 필요하면 중단됩니다.알았다.
Re: 함수의 키워드 인수현재 사용자 함수에 대한 인수가 평가되고 z=4가 유효한 표현식이므로
f(1, z=4);
z=4를 평가하여 전역 z를 생성하고 결과가 4인 다음 결과를 f의 y 인수로 전달합니다.
Re: 함수의 키워드 인수새 구문이 필요한 이유는 무엇입니까?당신은 부르거나 정의하기 위해 말하고 있습니까?같은 방식으로 정의할 수 있다고 생각합니다.
함수가 이미 키워드 인수를 사용하지 않는 경우 현재처럼 기본적으로 위치 인수가 됩니다.
분명히 구현되기 전에는 키워드 인수를 사용할 수 없으므로 스크립트를 깨는 것으로 보지 않습니다.
함수
f = function({x, y=2, z=3},
show(x, y, z);
);
다른 스크립트를 깨지 않습니다.
어쨌든 이전의 모든 스크립트가 위치 인수를 사용하고 있다면 아무 것도 깨뜨릴 것이라고 생각하지 않습니다.
그러나 키워드가 지정되지 않은 경우 기본적으로 위치를 지정하는 키워드 인수가 있는 경우
f(1, 2, 4);
아무것도 깨지 않을 것입니다 (나는 추측하고 있습니다). 그러나 그것은 단지 허용 할 것입니다
f(1, z=4);
가짜 네임스페이스가 필요한 이유를 모르겠습니다(그러나 함수가 내부에서 어떻게 작동하는지 이해하지 못합니다).
Re: 함수의 키워드 인수기존 스크립트를 변경하지 않는 새로운 구문이 필요합니다. 목록이 특수 수신자에게 전달되는 예와 같은 것일 수 있습니다. 또는 f(1, arg:z = 2)와 같은 가짜 네임스페이스와 같은 호출자에 대한 새로운 구문일 수 있습니다.
Re: 함수의 키워드 인수감사.확실히 몇 가지 문제가 있습니다. 아마도 가장 큰 것은 어떤 변수든 함수에 주입할 수 있고 종종 변수 충돌을 일으키는 것입니다. 저는 조심하지 않습니다.
Names default to here(1);
f = function({x, kwargs={}},
{DEFAULT LOCAL},
// optional
y = 2;
z = 3;
evallist(kwargs);
print("Before Bad Call");
show(y);
print("Bad Call");
//even though f2 is default local,
//because it's not explicit in the function it writes to here
f2(1, {b=3, y=5});
print("After Bad Call");
show(y);
);
f2 = function({a, kwargs={}},
{DEFAULT LOCAL},
b=2;
c=3;
evallist(kwargs);
show(a, b, c);
);
f(1, {z=2});
Re: 함수의 키워드 인수현재 "kwargs" 목록 솔루션은 멋진 임시 트릭입니다.
Re: 함수의 키워드 인수표준 Jmp 함수는 어떻게 정의되어 있습니까?
- 그렇게 닫다 보충 논거를 받아들인다 noSave .
- 열 추가가 (...) 내의 모든 위치에서 식 Formula(...)를 허용하도록 합니다.
dt << New Column( "X", Formula( row() ) );
대신에
f(2, {y=14})~할 수 있었다
f(2, y(14))
어떻게 보여야 합니까?
Re: 함수의 키워드 인수내부 함수는 JSL이 아닌 C++로 빌드됩니다. 사용자 함수(JSL에서)는 인수를 매개변수로 전환하는 방법을 선택하는 다른 C++ 코드에 의해 해석됩니다(여기서 함수에 대한 인수는 전달된 외부 값이고 함수의 매개변수는 값을 참조하는 내부 변수 이름입니다).
C++로 작성된 sin(A)와 같은 함수는 다음과 같습니다.
ExpressionPointer sin( ExpressionPointer E) {
double value = evaluateExpression( E );
double answer = sin( value );
return makeExpression( answer );
}
함수가 연구하지 않고 인수를 반환하는 JSL의 expr() 함수는 다음과 같습니다.
ExpressionPointer expr( ExpressionPtr E ) {
return E;
}
언뜻 보기에는 쓸모 없어 보이지만 할당 연산자가 오른쪽을 평가할 수 있습니다.
ex = expr( a + b );
a+b의 결과가 아닌 ex에 표현식 트리를 저장합니다. 더 흥미로운 예는 head(a+b) 연산자입니다.
ExpressionPointer head( ExpressionPointer E ) {
return MakeExpression( E->child );
}
이것은 대략적인 아이디어의 근사치입니다. a+b에 대한 식 트리에는 루트 +가 있고 두 자식 a와 b가 있습니다.E->child는 루트 +를 가져와 자식이 없는 식으로 반환합니다.
JMP 개발자는 99%의 사용 사례를 쉽게 작성할 수 있도록 JSL 사용자 작성 함수에서 이러한 복잡성을 숨기기로 결정했습니다. 내가 익숙한 대부분의 언어에는 조작할 수 있는 표현식이 없습니다(Snobol은 일종의 JMP의 patmatch() 함수를 설명합니다...). 목록을 사용하는 것은 표현식을 함수에 보내는 합리적인 접근 방식입니다. 목록은 같은 목록으로 평가됩니다. 함수가 목록의 복사본에서 작업 중입니다.
함수의 키워드 인수사용자 정의 함수에서 호출에 키워드 인수를 사용할 수 있으면 좋겠습니다.
Names default to here(1);
f = function({x, y=2, z=3},
show(x, y, z);
);
print("What I'd like to do");
f(1, z=2);
//I want it to be 1, 2, 2
//instead of having to do
f = function({x, kwargs={}},
{DEFAULT LOCAL},
// optional
y = 2;
z = 3;
evallist(kwargs);
show(x, y, z);
);
print("Using List");
f(1, {z=2});
누군가가 언급했어요 여기 하지만 8년 전 일이라 다시 언급하고 싶다고 생각했습니다.
자동화 및 스크립팅Re: 함수에 대한 키워드 인수 - 상태가 다음으로 변경되었습니다: 승인됨Re: 함수의 키워드 인수목록을 이용한 트릭은 매우 유용합니다.
실제로 변수에 액세스하기 위해 목록을 평가할 필요는 없습니다.
목록을 스캔하고 올바른 이름을 검색할 수 있습니다. 각 루프에 대해 또는 Extract Expr을 통해.
Names default to here(1);
get = Function ({var}, Eval(Eval Expr(Arg(Extract Expr(kwarg, Expr(Name Expr(var)) = wild()),2))));
f = function({x, kwargs={}},
{DEFAULT LOCAL},
print(get(Expr(z)));
);
f(1, {z=2});