expr()으로 선언된 변수의 type()에 대한 질문안녕
'expr()'을 사용하고 있는데 몇 가지 질문이 있습니다.
댓글에 적힌 번호대로 질문드리겠습니다.
1) c가 그대로 실행될 때 eval()이 적용된다고 볼 수 있는가?
2) -
3) expr()로 선언된 변수 c의 타입을 체크했을 때 왜 Number가 나오나요?
type()이 인자를 실행하고 타입을 인식하여 결과를 출력한다면 4)의 경우 왜 Expression인지 궁금합니다.
4) -
a = 1;
b = 2;
c = expr(a + b);
c; // 1) Result : 3
print(c); // 2) Result : a + b
type(c); // 3) Result : Number
type(expr(a + b)); // 4) Result : Expression
고맙습니다 
스크립팅Re: expr()로 선언된 변수의 type()에 대한 질문명심해야 할 주요 사항은 인쇄() , 쓰다() 그리고 보여주다() 인수를 대부분의 함수와 약간 다르게 취급합니다. 압축을 풀지만 평가하지는 않습니다. 따라서 인쇄( c ) 인쇄할 것입니다 씨 is -- 표현입니다. 유형() 압축을 풀고 인수를 평가한 다음 유형을 반환합니다. 네가 원한다면 유형() 처럼 행동하다 인쇄() , 다음 사용 이름 Expr() , 처럼 유형( 이름 Expr( c ) )
Re: expr()로 선언된 변수의 type()에 대한 질문고맙습니다 @ErraticAttach
나는 당신이 설명하는 것을 명확하게 이해합니다.
하지만 질문이 있습니다.
만약에 유형 () 압축을 풀고 평가한 다음 특급 (a + b)는 경우 4에서 평가되며 반환 값으로 Number가 반환되어서는 안 됩니다. 유형 () 사례 3에서와 같이?Unpacking 후 타입을 평가하는 과정에서 인수를 변수로 지정했는지 함수로 지정했는지에 따라 처리가 달라지나요?
Re: expr()으로 선언된 변수의 type()에 대한 질문a = 1;
b = 2;
type( a + b );
"숫자"
내부적으로 type은 add( a, b )처럼 보이는 표현식 트리를 받았습니다. 나무는 숫자로 평가됩니다.
a = 1;
b = 2;
type( expr( a + b ) );
"표현"
내부적으로 type은 expr( add( a, b ) )과 같은 표현식 트리를 받았습니다. 다시, 트리가 평가됩니다. 트리의 expr() 노드는 인수를 표현식으로 반환합니다.
a = 1;
b = 2;
c = expr( a + b );
type( c );
"숫자"
내부적으로 type은 c처럼 보이는 표현식 트리를 받았습니다. 다시 평가됩니다. c는 표현식 add(a,b)로 c가 평가될 때마다 및 b의 현재 값을 사용합니다.c는 트리에 expr() 노드가 없습니다.
"풀기"는 JSL에서 잘 정의된 개념이 아닙니다. 모든 내장 함수는 처음에 인수를 표현식 트리로 봅니다. 일부 함수는 인수를 먼저 보지 않고 인수를 평가합니다. 다른 함수는 절대 평가하지 않습니다. 일부 함수는 표현식의 루트 노드가 eval() 또는 expr() 또는 send()인지 확인하고 다른 작업을 수행합니다. (send()는 << 연산자입니다. 특수 인수를 식별하기 위해 인수 목록에 단항 사용법이 있습니다. 종종 실제 메시지가 생성 중인 디스플레이 상자로 전송됩니다.) 열에 수식 표현식을 추가하는 것은 때때로 저를 당황하게 하는 한 가지 예입니다. 인수가 평가되지 않아야 한다고 가정합니다. Formula(...)가 인수를 엿보기 때문에 수식 주위에 eval()을 추가하면 eval이 됩니다. 대안은 항상 인수를 평가한 다음 일반 사용 사례에서는 공식 주위에 expr()이 필요합니다(expr(...) 평가는 인수를 반환하기 때문에).
Re: expr()로 선언된 변수의 type()에 대한 질문C 및 C++와 같은 언어는 호출 전에 함수 호출에 대한 인수를 평가합니다. C 및 C++에는 표현식 데이터 유형이 없습니다. 표현식은 컴파일 타임에 코드로 컴파일되기 때문입니다. 실행 속도는 더 빠르지만 문제 해결에 대해 생각할 수 있는 몇 가지 방법이 제한됩니다.
JSL에는 문자열을 가져와 표현식 트리로 바꾸는 parse() 함수가 있습니다. eval() 함수는 트리를 평가합니다. 트리는 특별히 살펴보기 위해 주의를 기울이지 않는 한 할당의 오른쪽으로 액세스할 때 자동으로 평가됩니다.변수에 저장된 표현식을 실수로 평가하지 않고 엿보고 싶은 경우에만 사용해야 하는 nameExpr() 함수가 있습니다. 어떤 이유에서인지, 시간이 지나고 수정하기에는 너무 늦었을 수 있습니다. 인수가 단순 변수인 경우 인수를 평가하기 위한 호출 없이 인쇄/표시/쓰기가 작성되었습니다. 좋아, 그 당시에는 eval(c)에 대한 오버헤드가 있고 c의 값을 얻는 데 약간의 오버헤드가 있기 때문에 아마도 속도가 빨라진 것처럼 보였습니다. 그러나 인자는 단순 변수가 아니기 때문에 print(c+0)은 인자를 평가할 것이고 print(eval(c))는 인자를 평가할 것입니다.
Re: expr()로 선언된 변수의 type()에 대한 질문@Craige_Hales 확실히 맞습니다 -- 포장 풀기는 좋은 용어가 아닙니다. 혼란을 드려 죄송합니다!내가 설명하려고 했던 동작은 문서화되어 있습니다 -- 이 링크를 확인하십시오: https://www.jmp.com/support/help/en/15.2/index.shtml#page/jmp/expressions.shtml
관련 비트는 다음과 같습니다.
