다음은 흥미로운 질문입니다. 프로그래밍 방식으로 함수가 예상하는 인수 수 또는 JSL을 통해 함수가 예상하는 인수 목록을 얻을 수 있습니까?
다음은 예입니다. 기능이 있다고 가정해 보겠습니다.
beta density()
설명서에는 4개의 매개변수가 있다고 나와 있습니다. (x, alpha, beta, , ) - 이 중 두 개는 필수이고 두 개는 기본값입니다. 매개변수 목록이나 함수가 기대하는 항목 수를 얻고 싶다고 가정해 보겠습니다. 임의의 기능에 대해 JSL을 통해 해당 정보를 얻을 수 있는 방법이 있습니까?
나는 이것을 하는 직접적인 방법이 있다고 믿지 않지만, 생각해볼 수 있는 끔찍하고 못생긴 간접적인 방법이 있습니다.
따라서 JMP는 올바른 개수의 인수와 잘못된 개수의 인수를 사용하여 함수를 평가하려고 할 때 예상대로 반응합니다. 예를 들어:
beta density()
우리에게 줄 것입니다:

그러나 다음은 오류가 아니며 "."을 반환합니다. Beta Density에는 3개의 인수(x, alpha 및 beta)가 필요하기 때문입니다.
beta density(empty(),empty(),empty())
실제로 함수가 예상하는 최대 인수 수에 도달할 때까지 "." 즉, 1+ 최대 인수 수인 6에 도달할 때까지:
beta density(empty(),empty(),empty(),empty(),empty(),empty())
이는 우리에게 다음을 제공합니다.

따라서 최대 10개의 잠재적 인수를 테스트하고 최소 및 최대 인수를 반환하는 (못생긴) 함수를 구축하여 이를 악용해 보겠습니다. 10개면 다 커버할 것 같아서 그냥 무차별 대입으로 했습니다.) 함수는 다음과 같이 응답합니다.

Random Normal()과 같은 일부 함수는 이상하게 작동하는 것 같습니다. 최소 인수가 없거나 다른 점이 있기 때문일 수 있습니다. 잘 모르겠습니다. 그리고 Interest Rate()와 같은 일부 함수는 테스트된 최대값까지 인수의 수를 기꺼이 받아들이는 것 같습니다. 따라서 완벽과는 거리가 멀고 세부 정보를 직접 반환하는 jsl 조회 기능이 있으면 좋을 것입니다. 어쨌든 아래 코드는 스크립트로 첨부되어 있습니다.
getRecArgs = Function( {funcHead},
min = .;
max = .;
If( Eval( Parse( Eval Insert( "if(isMissing(try(^funcHead^(empty()),0)),1,0);" ) ) ),
If( Is Missing( min ),
min = 1,
max = 1
)
);
If( Eval( Parse( Eval Insert( "if(isMissing(try(^funcHead^(empty(),empty()),0)),1,0);" ) ) ),
If( Is Missing( min ),
min = 2,
max = 2
)
);
If( Eval( Parse( Eval Insert( "if(isMissing(try(^funcHead^(empty(),empty(),empty()),0)),1,0);" ) ) ),
If( Is Missing( min ),
min = 3,
max = 3
)
);
If( Eval( Parse( Eval Insert( "if(isMissing(try(^funcHead^(empty(),empty(),empty(),empty()),0)),1,0);" ) ) ),
If( Is Missing( min ),
min = 4,
max = 4
)
);
If( Eval( Parse( Eval Insert( "if(isMissing(try(^funcHead^(empty(),empty(),empty(),empty(),empty()),0)),1,0);" ) ) ),
If( Is Missing( min ),
min = 5,
max = 5
)
);
If( Eval( Parse( Eval Insert( "if(isMissing(try(^funcHead^(empty(),empty(),empty(),empty(),empty(),empty()),0)),1,0);" ) ) ),
If( Is Missing( min ),
min = 6,
max = 6
)
);
If( Eval( Parse( Eval Insert( "if(isMissing(try(^funcHead^(empty(),empty(),empty(),empty(),empty(),empty(),empty()),0)),1,0);" ) ) ),
If( Is Missing( min ),
min = 7,
max = 7
)
);
If( Eval( Parse( Eval Insert( "if(isMissing(try(^funcHead^(empty(),empty(),empty(),empty(),empty(),empty(),empty(),empty()),0)),1,0);" ) ) ),
If( Is Missing( min ),
min = 8,
max = 8
)
);
If( Eval( Parse( Eval Insert( "if(isMissing(try(^funcHead^(empty(),empty(),empty(),empty(),empty(),empty(),empty(),empty(),empty()),0)),1,0);" ) ) ),
If( Is Missing( min ),
min = 8,
max = 8
)
);
If( Eval( Parse( Eval Insert( "if(isMissing(try(^funcHead^(empty(),empty(),empty(),empty(),empty(),empty(),empty(),empty(),empty(),empty()),0)),1,0);" ) ) ),
If( Is Missing( min ),
min = 9,
max = 9
)
);
If( Eval( Parse( Eval Insert( "if(isMissing(try(^funcHead^(empty(),empty(),empty(),empty(),empty(),empty(),empty(),empty(),empty(),empty(),empty()),0)),1,0);" ) ) ),
If( Is Missing( min ),
min = 10,
max = 10
)
);
If( Is Missing( min ),
min = 0
);
Return( min, max );
);
다음은 Julian의 멋진 아이디어를 가져와 코드를 약간 단축한 함수입니다.
함수에는 종료 시점을 지정하는 선택적 두 번째 인수가 있습니다(기본값은 10개 인수).
getNumArgBand = Function( {str, max = 10},
{default local},
fctExpr = Parse( Eval Insert( "^str^()" ) );
res = [];
For Each( {i}, 0 :: max,
Insert Into( res,
Try( Eval( Name Expr( fctExpr ) ); 1, 0 )
);
Insert Into( fctExpr, Empty() );
);
Return( Eval List( {Min( Loc( res ) ), Max( Loc( res ) )} - 1 ) ); //account for 0-indexing
);
임의의 정상적인 경우를 제외하고 결과는 Julian이 제공한 것과 일치합니다. 내 보고서가 {0,2}이고 그의 보고서가 {0,인 이유를 조사하지 않았습니다. }
