다음을 통해 공유


연산자 동작

이 섹션에서는 다양한 M 연산자의 동작을 정의합니다.

연산자 우선 순위

식에 여러 연산자가 포함되어 있으면 연산자의 우선 순위에 따라 개별 연산자가 계산되는 순서가 제어됩니다. 예를 들어 식 x + y * z 은 연산자가 * 이진 + 연산자보다 우선 순위가 높기 때문에 계산 x + (y * z) 됩니다. 연산자의 우선 순위는 연결된 문법 프로덕션의 정의에 의해 설정됩니다. 예를 들어 가 식은 곱하기 식시퀀스 또는 - 연산자를 구분 + 하여 + 연산자 및 / 연산자보다 * 우선 순위가 - 낮습니다.

괄호 식 프로덕션을 사용하여 기본 우선 순위 순서를 변경할 수 있습니다.

parenthesized-expression:
      (expression)

예시:

1 + 2 * 3       // 7 
(1 + 2) * 3     // 9

다음 표에서는 M 연산자를 요약하여 연산자 범주를 우선 순위에서 가장 높은 순서에서 가장 낮은 순서로 나열합니다. 동일한 범주의 연산자는 우선 순위가 같습니다.

범주 설명
i
@i
식별자 식
(x) 괄호로 착색된 식
x[i] Lookup
x{y} 항목 액세스
x(...) 함수 호출
{x, y, ...} 목록 초기화
[ i = x, ... ] 레코드 초기화
... 구현되지 않음
단항 +x ID
-x 부정
notx 논리적 부정
메타데이터 xmetay 메타데이터 연결
곱하기 x * y 곱하기
x / y 나누기
더하기 x + y 더하기
x - y 빼기
관계 x< y 보다 작음
x > y 보다 큼
x<= y 보다 작거나 같음
x >= y 크거나 같음
등호 x = y 같음
x<> y 같지 않음
형식 어설션 xasy 호환되는 nullable-primitive 형식 또는 오류
형식 규칙 xisy 호환되는 nullable-primitive 형식 테스트
논리적 AND xandy 단락 연결
논리적 OR xory 단락 분리
Coalesce x??y null 병합 연산자

연산자 및 메타데이터

모든 값에는 값에 대한 추가 정보를 전달할 수 있는 연결된 레코드 값이 있습니다. 이 레코드를 값의 메타데이터 레코드 라고 합니다. 메타데이터 레코드는 모든 종류의 값 null과 연결할 수 있습니다. 이러한 연결의 결과는 지정된 메타데이터가 포함된 새 값입니다.

메타데이터 레코드는 일반 레코드일 뿐이며 일반 레코드가 할 수 있는 모든 필드와 값을 포함할 수 있으며 그 자체에는 메타데이터 레코드가 있습니다. 메타데이터 레코드를 값과 연결하면 "비 침입적"입니다. 메타데이터 레코드를 명시적으로 검사하는 경우를 제외하고 평가에서 값의 동작은 변경되지 않습니다.

모든 값에는 지정되지 않은 경우에도 기본 메타데이터 레코드가 있습니다. 기본 메타데이터 레코드는 비어 있습니다. 다음 예제에서는 표준 라이브러리 함수를 사용하여 텍스트 값의 메타데이터 레코드에 액세스하는 것을 Value.Metadata 보여 줍니다.

Value.Metadata( "Mozart" )   // []

메타데이터 레코드는 일반적으로 값이 새 값을 생성하는 연산자 또는 함수와 함께 사용될 때 유지 되지 않습니다. 예를 들어 연산자를 사용하여 & 두 텍스트 값이 연결된 경우 결과 텍스트 값의 메타데이터는 빈 레코드 []입니다. 다음 식은 동일합니다.

"Amadeus " & ("Mozart" meta [ Rating = 5 ])  
"Amadeus " & "Mozart"

표준 라이브러리는 값 Value.RemoveMetadataValue.ReplaceMetadata 에서 모든 메타데이터를 제거하고 값의 메타데이터를 대체하는 데 사용할 수 있습니다(메타데이터를 기존 메타데이터로 병합하는 대신).

메타데이터를 전달하는 결과를 반환하는 유일한 연산자는 메타 연산입니다.

구조적 재귀 연산자

값은 주기적수 있습니다. 예시:

let l = {0, @l} in l
// {0, {0, {0, ... }}}
[A={B}, B={A}]
// [A = {{ ... }}, B = {{ ... }}]

M은 레코드, 목록 및 테이블의 생성을 지연 상태로 유지하여 순환 값을 처리합니다. 교차된 지연 구조화된 값의 이점을 얻지 못하는 순환 값을 생성하려고 시도하면 오류가 발생합니다.

[A=B, B=A] 
// [A = Error.Record("Expression.Error", 
//         "A cyclic reference was encountered during evaluation"), 
//  B = Error.Record("Expression.Error", 
//         "A cyclic reference was encountered during evaluation"), 
// ]

M의 일부 연산자는 구조적 재귀에 의해 정의됩니다. 예를 들어 레코드와 목록의 같음은 각각 해당 레코드 필드와 항목 목록의 결합된 같음으로 정의됩니다.

비순환 값의 경우 구조적 재귀 를 적용하면 값이 유한하게 확장 됩니다. 공유 중첩 값은 반복적으로 트래버스되지만 재귀 프로세스는 항상 종료됩니다.

순환 값은 구조적 재귀를 적용할 때 무한 확장 됩니다. M의 의미 체계는 해당 무한 확장을 특별히 수용하지 않습니다. 예를 들어 같음의 순환 값을 비교하려고 시도하면 일반적으로 리소스가 부족해지고 해당 시도는 예외적으로 종료됩니다.

선택 및 프로젝션 연산자

선택 및 프로젝션 연산자를 사용하면 목록 및 레코드 값에서 데이터를 추출할 수 있습니다.

항목 액세스

항목 액세스 식을 사용하여 해당 목록 또는 테이블 내의 0부터 시작하는 위치에 따라 목록이나 테이블에서 값을 선택할 수 있습니다.

item-access-expression:
      item-selection
      optional-item-selection
item-selection:
      primary-expression
{item-selector}
optional-item-selection:
      primary-expression
{item-selector} ?
item-selector:
      expression

item-access-expressionx{y}가 다음을 반환합니다.

  • 목록 x 및 숫자y의 경우 위치y의 목록 x 항목입니다. 목록의 첫 번째 항목은 서수 인덱스가 0인 것으로 간주됩니다. 요청된 위치가 목록에 없으면 오류가 발생합니다.

  • 테이블 x 및 숫자y의 경우 위치에 y있는 테이블 x 의 행입니다. 테이블의 첫 번째 행은 서수 인덱스가 0인 것으로 간주됩니다. 테이블에 요청된 위치가 없으면 오류가 발생합니다.

  • 테이블 x 및 레코드 y의 경우 해당 테이블 x 열 이름과 일치하는 필드 이름이 있는 필드에 대한 레코드 y 의 필드 값과 일치하는 테이블 행입니다. 테이블에 일치하는 고유한 행이 없으면 오류가 발생합니다.

예시:

{"a","b","c"}{0}                        // "a" 
{1, [A=2], 3}{1}                        // [A=2] 
{true, false}{2}                        // error 
#table({"A","B"},{{0,1},{2,1}}){0}      // [A=0,B=1] 
#table({"A","B"},{{0,1},{2,1}}){[A=2]}  // [A=2,B=1]  
#table({"A","B"},{{0,1},{2,1}}){[B=3]}  // error 
#table({"A","B"},{{0,1},{2,1}}){[B=1]}  // error

항목 액세스 식목록이나 테이블에 x위치(또는 일치 항목) y 가 없을 때 반환 null 되는 폼x{y}?도 지원합니다. 일치하는 항목 y이 여러 대인 경우 오류가 계속 발생합니다.

예시:

{"a","b","c"}{0}?                       // "a" 
{1, [A=2], 3}{1}?                       // [A=2] 
{true, false}{2}?                       // null 
#table({"A","B"},{{0,1},{2,1}}){0}?     // [A=0,B=1] 
#table({"A","B"},{{0,1},{2,1}}){[A=2]}? // [A=2,B=1]  
#table({"A","B"},{{0,1},{2,1}}){[B=3]}? // null 
#table({"A","B"},{{0,1},{2,1}}){[B=1]}? // error

항목 액세스는 액세스되는 항목 이외의 목록 또는 테이블 항목을 강제로 평가하지 않습니다. 예시:

{ error "a", 1, error "c"}{1}  // 1 
{ error "a", error "b"}{1}     // error "b"

다음은 항목 액세스 연산 x{y} 자를 평가할 때 유지됩니다.

  • 식을 x 평가하는 동안 발생하거나 y 전파되는 오류입니다.

  • x 은 목록 또는 테이블 값을 생성합니다.

  • y 은 숫자 값을 생성하거나 테이블 값을 생성하는 경우 x 레코드 값을 생성합니다.

  • 숫자 값을 생성하고 값이 음수 y 이면 y 이유 코드 "Expression.Error" 와 함께 오류가 발생합니다.

  • 숫자 값을 생성하고 값 y 이 개수x보다 크거나 같으면 y 선택적 연산자 폼 x{y}? 을 사용하지 않는 한 이유 코드 "Expression.Error" 오류가 발생합니다. 이 경우 값 null 이 반환됩니다.

  • 테이블 값을 생성하고 y 레코드 값을 생성하고 일치하는 xy 항목이 없는 경우 x 선택적 연산자 폼 x{y}? 을 사용하지 않는 한 이유 코드 "Expression.Error" 오류가 발생합니다. 이 경우 값 null 이 반환됩니다.

  • 테이블 값을 생성하고 y 레코드 값을 생성하고 일치하는 항목이 여러 xy 개인 경우 x 이유 코드 "Expression.Error" 오류가 발생합니다.

항목 x 선택 과정에서 해당 위치 y 이외의 항목이 평가되지 않습니다. (스트리밍 목록 또는 테이블의 경우 해당 위치 y 앞에 있는 항목 또는 행을 건너뛰어 목록 또는 테이블의 원본에 따라 평가를 발생시킬 수 있습니다.)

필드 액세스

필드 액세스 식은 레코드에서 값을 선택하거나 레코드 또는 테이블을 각각 필드나 열이 적은 값으로 프로젝트하는 데 사용됩니다.

field-access-expression:
      field-selection
      implicit-target-field-selection
      프로젝션(projection)
      implicit-target-projection
field-selection:
      primary-expression field-selector
field-selector:
      required-field-selector
      optional-field-selector
required-field-selector:

      [field-name]
optional-field-selector:
      [field-name] ?
field-name:
      generalized-identifier
      quoted-identifier
implicit-target-field-selection:
      field-selector
projection:
      primary-expression required-projection
      primary-expression optional-projection
required-projection:

      [required-selector-list]
선택적 프로젝션:
      [required-selector-list] ?
required-selector-list:
      required-field-selector
      required-selector-list
,required-field-selector
implicit-target-projection:
      required-projection
      optional-projection

필드 액세스의 가장 간단한 형태는 필수 필드 선택입니다. 연산 x[y] 자를 사용하여 레코드의 필드를 필드 이름으로 조회합니다. 필드 y 가 없 x으면 오류가 발생합니다. 양식 x[y]? 은 선택적 필드 선택을 수행하는 데 사용되며 요청된 필드가 레코드에 없는 경우 반환 null 됩니다.

예시:

[A=1,B=2][B]       // 2 
[A=1,B=2][C]       // error 
[A=1,B=2][C]?      // null

여러 필드의 집합적 액세스는 필요한 레코드 프로젝션 및 선택적 레코드 프로젝션에 대해 연산자가 지원합니다. 연산 x[[y1],[y2],...] 자는 필드 수가 적은 새 레코드에 레코드를 프로젝트합니다(,, <...a0/>에서 선택y1). 선택한 필드가 없으면 오류가 발생합니다. 연산 x[[y1],[y2],...] 자는 레코드를 선택한 필드가 있는 새 레코드에 ...y1y2투영합니다. 필드가 누락 null 된 경우 대신 사용됩니다. 예시:

[A=1,B=2][[B]]           // [B=2] 
[A=1,B=2][[C]]           // error 
[A=1,B=2][[B],[C]]?      // [B=2,C=null]

양식 [y] 이며 식별자 _ (밑줄)에 대한 약식 참조로 [y]? 지원됩니다. 다음 두 식은 동일합니다.

[A]                 
_[A]

다음 예제에서는 필드 액세스의 약식 형식을 보여 줍니다.

let _ = [A=1,B=2] in [A] //1

양식 [[y1],[y2],...][[y1],[y2],...]? 약식으로도 지원되며 다음 두 식도 마찬가지로 동일합니다.

[[A],[B]]                 
_[[A],[B]]

약식 형식은 명명된 _ 단일 매개 변수의 함수를 도입하는 방법인 약식과 each 함께 특히 유용합니다(자세한 내용은 간소화된 선언 참조). 두 약식은 함께 일반적인 상위 순서 함수 식을 간소화합니다.

List.Select( {[a=1, b=1], [a=2, b=4]}, each [a] = [b]) 
// {[a=1, b=1]}

위의 식은 다음과 같은 더 비밀스러운 긴 손과 같습니다.

List.Select( {[a=1, b=1], [a=2, b=4]}, (_) => _[a] = _[b]) 
// {[a=1, b=1]}

필드 액세스는 액세스 중인 필드 이외의 필드를 강제로 평가하지 않습니다. 예시:

[A=error "a", B=1, C=error "c"][B]  // 1 
[A=error "a", B=error "b"][B]       // error "b"

다음은 필드 액세스 연산x[y]자, x[y]?또는 x[[y]]x[[y]]? 평가될 때 유지됩니다.

  • 식을 x 평가하는 동안 발생한 오류는 전파됩니다.

  • 필드를 평가할 때 발생하는 오류는 필드 yy와 영구적으로 연결된 다음 전파됩니다. 나중에 필드에 y 액세스하면 동일한 오류가 발생합니다.

  • x 은 레코드 또는 테이블 값을 생성하거나 오류가 발생합니다.

  • 식별자가 존재하지 x않는 필드의 이름을 지정하면 선택적 연산자 y...? 을 사용하지 않는 한 이유 코드 "Expression.Error" 오류가 발생합니다. 이 경우 값 null 이 반환됩니다.

필드 액세스 프로세스 중에 명명된 y 필드 이외의 필드는 x 평가되지 않습니다.

메타데이터 연산자

값에 대한 메타데이터 레코드는 메타 연산(x meta y)를 사용하여 수정됩니다.

metadata-expression:
      unary-expression
      unary-expression
metaunary-expression

다음 예제에서는 연산자를 사용하여 메타데이터 레코드를 사용하여 텍스트 값을 생성한 다음 다음을 사용하여 meta 결과 값의 메타데이터 레코드에 Value.Metadata액세스합니다.

Value.Metadata( "Mozart" meta [ Rating = 5 ] ) 
// [Rating = 5 ]
Value.Metadata( "Mozart" meta [ Rating = 5 ] )[Rating] 
// 5

다음은 메타데이터 결합 연산 x meta y자를 적용할 때 유지됩니다.

  • 또는 y 식을 평가할 x 때 발생하는 오류는 전파됩니다.

  • 식은 y 레코드이거나 이유 코드 "Expression.Error" 가 있는 오류가 발생해야 합니다.

  • 결과 메타데이터 레코드는 x'와 병합된 y메타데이터 레코드입니다. (레코드 병합의 의미 체계는 다음을 참조하세요 .레코드 병합.)

  • 결과 값은 새로 계산된 메타데이터 레코드가 x 연결된 메타데이터 없이 식의 값입니다.

표준 라이브러리는 값 Value.RemoveMetadataValue.ReplaceMetadata 에서 모든 메타데이터를 제거하고 값의 메타데이터를 대체하는 데 사용할 수 있습니다(메타데이터를 기존 메타데이터로 병합하는 대신). 다음 식은 동일합니다.

x meta y  
Value.ReplaceMetadata(x, Value.Metadata(x) & y) 
Value.RemoveMetadata(x) meta (Value.Metadata(x) & y)

같음 연산자

‘같음 연산자’ =는 두 값이 같은지 확인하는 데 사용됩니다. 같지 않음 연산자<>는 두 값이 서로 같지 않은지 확인하는 데 사용됩니다.

equality-expression:
      relational-expression
      relational-expression
=equality-expression
      relational-expression
<>equality-expression

예시:

1 = 1            // true 
1 = 2            // false 
1 <> 1           // false 
1 <> 2           // true 
null = true      // false 
null = null      // true

메타데이터는 같음 또는 같지 않음 비교의 일부가 아닙니다. 예시:

(1 meta [ a = 1 ]) = (1 meta [ a = 2 ]) // true 
(1 meta [ a = 1 ]) = 1                  // true

같음 연산 x = y 자를 적용할 때 다음이 유지되며 x <> y,

  • 또는 y 식을 평가할 x 때 발생하는 오류는 전파됩니다.

  • = 연산자에는 값이 같은지, false 그렇지 않으면 결과가 true 발생합니다.

  • <> 연산자에는 값이 같은지, true 그렇지 않으면 결과가 false 발생합니다.

  • 메타데이터 레코드는 비교에 포함되지 않습니다.

  • y 식을 계산하여 x 생성된 값이 같은 종류의 값이 아니면 값이 같지 않습니다.

  • y 식을 평가하여 x 생성되는 값이 동일한 종류의 값인 경우 아래에 정의된 대로 값이 같은지 확인하기 위한 특정 규칙이 있습니다.

  • 다음은 항상 true입니다.

    (x = y) = not (x <> y)

같음 연산자는 다음 형식에 대해 정의됩니다.

  • 값은 null 자체와만 같습니다.
    null = null    // true 
    null = true    // false 
    null = false   // false
  • 논리적 값 true 이며 false 자신과만 같습니다. 예시:
    true = true      // true 
    false = false    // true 
    true = false     // false 
    true = 1         // false
  • 숫자는 지정된 정밀도를 사용하여 비교됩니다.

    • 두 숫자 #nan중 하나가 있으면 숫자가 동일하지 않습니다.

    • 두 숫자 #nan모두 없는 경우 숫자 값의 비트 단위 비교를 사용하여 숫자를 비교합니다.

    • #nan 는 자체와 같지 않은 유일한 값입니다.

      예시:

        1 = 1,              // true 
        1.0 = 1             // true 
        2 = 1               // false 
        #nan = #nan         // false 
        #nan <> #nan        // true
  • 동일한 수의 100나노초 틱을 나타내는 경우 두 기간은 같습니다.

  • 해당 부분의 크기(시간, 분, 초)가 같으면 두 번 같습니다.

  • 해당 부분의 크기(연도, 월, 일)가 같으면 두 날짜가 같습니다.

  • 해당 부분의 크기(연도, 월, 일, 시간, 분, 초)가 같으면 두 날짜/시간이 같습니다.

  • 해당하는 UTC 날짜/시간이 같으면 두 datetimezone이 같습니다. 해당 UTC 날짜/시간에 도달하려면 datetimezone의 datetime 구성 요소에서 시간/분 오프셋을 뺍니다.

  • 서수, 대/소문자 구분, 문화권을 구분하지 않는 비교를 사용하면 두 텍스트 값이 같으며 해당 위치에서 길이가 같고 문자가 같습니다.

  • 다음이 모두 true이면 두 목록 값이 같습니다.

    • 두 목록 모두 동일한 수의 항목을 포함합니다.

    • 목록에서 각 위치에 해당하는 항목의 값은 같습니다. 즉, 목록에 동일한 항목이 포함되어야 할 뿐만 아니라 항목 순서가 같아야 합니다.

      예시:

        {1, 2} = {1, 2}     // true 
        {2, 1} = {1, 2}     // false 
        {1, 2, 3} = {1, 2}  // false
      
  • 다음이 모두 true이면 두 레코드가 같습니다.

    • 필드 수가 동일합니다.

    • 한 레코드의 각 필드 이름도 다른 레코드에 있습니다.

    • 한 레코드의 각 필드 값은 다른 레코드의 같은 이름의 필드와 같습니다.

      예시:

        [ A = 1, B = 2 ] = [ A = 1, B = 2 ]        // true 
        [ B = 2, A = 1 ] = [ A = 1, B = 2 ]        // true 
        [ A = 1, B = 2, C = 3 ] = [ A = 1, B = 2 ] // false 
        [ A = 1 ] = [ A = 1, B = 2 ]               // false
      
  • 다음이 모두 true이면 두 테이블이 같습니다.

    • 열 수가 동일합니다.

    • 한 테이블의 각 열 이름도 다른 테이블에 있습니다.

    • 행 수는 동일합니다.

    • 각 행의 값은 해당 셀에 있습니다.

      예시:

        #table({"A","B"},{{1,2}}) = #table({"A","B"},{{1,2}}) // true 
        #table({"A","B"},{{1,2}}) = #table({"X","Y"},{{1,2}}) // false 
        #table({"A","B"},{{1,2}}) = #table({"B","A"},{{2,1}}) // true
      
  • 함수 값은 자체와 같지만 다른 함수 값과 같거나 같지 않을 수 있습니다. 두 함수 값이 같은 것으로 간주되면 호출될 때 동일하게 동작합니다.

    지정된 두 함수 값은 항상 동일한 같음 관계를 갖습니다.

  • 형식 값은 자체와 같지만 다른 형식 값과 같거나 같지 않을 수 있습니다. 두 형식 값이 같은 것으로 간주되면 준수를 쿼리할 때 동일하게 동작합니다.

    지정된 두 형식 값은 항상 같은 같음 관계를 갖습니다.

관계 연산자

<, ><=>= 연산자를 관계형 연산라고 합니다.

relational-expression:
      additive-expression
      additive-expression
<relational-expression
      additive-expression
>relational-expression
      additive-expression
<= _relational-expression
      additive-expression >=relational-expression

이러한 연산자는 다음 표와 같이 두 값 간의 상대 순서 관계를 결정하는 데 사용됩니다.

연산 결과
x < y true if x is less than y, false 그렇지 않으면
x > y true이보다 y크면 x false 그렇지 않으면
x <= y true 가 작거나 같으면 x y>이고, false 그렇지 않으면
x >= y true 이보다 크거나 같으면 x y>이고, false 그렇지 않으면

예시:

0 <= 1            // true 
null < 1          // null 
null <= null      // null 
"ab" < "abc"      // true 
#nan >= #nan      // false  
#nan <= #nan      // false

다음은 관계형 연산자가 포함된 식을 평가할 때 유지됩니다.

  • 또는 y 피연산자 식을 평가할 x 때 발생하는 오류가 전파됩니다.

  • 식과 y 식을 모두 x 평가하여 생성되는 값은 이진, 날짜, 날짜/시간, datetimezone, 기간, 논리, 숫자, null, 텍스트 또는 시간 값이어야 합니다. 그렇지 않으면 이유 코드 "Expression.Error" 와 함께 오류가 발생합니다.

  • 두 피연산자 모두 동일한 종류의 값 또는 null.이어야 합니다. 그렇지 않으면 이유 코드 "Expression.Error" 와 함께 오류가 발생합니다.

  • 피연산자 null중 하나 또는 둘 다인 경우 결과는 값입니다 null .

  • 바이트 바이트 바이트와 비교되는 바이트

  • 두 날짜는 연도 부분을 비교하여 비교하고, 같으면 월 부분과 같은 경우 일 부분을 비교합니다.

  • 두 날짜/시간은 연도 부분을 비교하여 비교하고, 같으면 월 부분과, 같으면 해당 날짜 부분과, 같으면 시간 부분과, 같으면 분 부분과 두 번째 파트를 비교합니다.

  • 두 datetimezone은 시간/분 오프셋을 빼고 날짜/시간 구성 요소를 비교하여 UTC로 정규화하여 비교됩니다.

  • 두 기간은 나타내는 100나노초 틱의 총 수에 따라 비교됩니다.

  • 두 논리를 비교 true 하여 보다 false큰 것으로 간주됩니다.

  • 두 개의 x 숫자와 y IEEE 754 표준의 규칙에 따라 비교됩니다.

    • 피연산자 중 #nan하나가면 모든 관계형 연산자의 결과가 false 됩니다.

    • 두 피연산자가 모두 없는 경우 연산자는 #nanmin과 max가 나타낼 수 있는 가장 작고 가장 큰 양의 유한 값인 순서 지정 -∞ < -max < ... < -min < -0.0 = +0.0 < +min < ... < +max < +∞ 과 관련하여 두 부동 소수점 피연산자의 값을 비교합니다. -∞ 및 +∞ M 이름은 다음과 같습니다 -#infinity#infinity.

      이 순서 지정의 주목할 만한 효과는 다음과 같습니다.

      • 음수 및 양수 0은 같은 것으로 간주됩니다.

      • -#infinity 값은 다른 모든 숫자 값보다 작지만 다른 -#infinity숫자 값과 같은 것으로 간주됩니다.

      • #infinity 값은 다른 모든 숫자 값보다 크지만 다른 #infinity숫자 값과 같은 것으로 간주됩니다.

  • 두 텍스트는 문자별 서수, 대/소문자 구분, 문화권을 구분하지 않는 비교를 사용하여 비교됩니다.

  • 두 번은 시간 부분을 비교하여 비교하고, 같으면 분 부분과 같은 경우 두 번째 부분을 비교합니다.

조건부 논리 연산자

andor 연산자를 조건부 논리 연산자라고 합니다.

logical-or-expression:
      logical-and-expression
logical-and-expression
orlogical-or-expression
logical-and-expression:
      is-expression
      is-expression
andlogical-and-expression

연산자는 or 피연산자 중 하나 이상이면 반환 true 됩니다 true. 오른쪽 피연산자는 왼쪽 피연산자가 아닌 true경우에만 평가됩니다.

연산자는 and 피연산자 중 하나 이상이면 반환 false 됩니다 false. 오른쪽 피연산자는 왼쪽 피연산자가 아닌 false경우에만 평가됩니다.

세로 축에서 orand 왼쪽 피연산자 식을 계산한 결과와 가로 축에서 오른쪽 피연산자 식을 계산한 결과와 연산자의 진리 테이블이 아래에 나와 있습니다.

and true false null error
true true false null error
false false false false false
null null false null error
error error error error error
or true false null error
or true false null error
true true true true true
false true false null error
null true null null error
error error error error error

다음은 조건부 논리 연산자가 포함된 식을 평가할 때 유지됩니다.

  • 또는 y 식을 평가할 x 때 발생하는 오류는 전파됩니다.

  • 조건부 논리 연산자는 형식 logicalnull에 대해 정의됩니다. 피연산자 값이 이러한 형식이 아니면 이유 코드 "Expression.Error" 오류가 발생합니다.

  • 결과는 논리적 값입니다.

  • x 에서 식 yy 계산되지 않는 경우에만 x 계산 true됩니다.

  • x 에서 식은 y 계산되지 않는 경우에만 x 계산false됩니다.y

마지막 두 속성은 조건부 논리 연산자의 "조건부" 한정을 제공합니다. 속성을 "단락"이라고도 합니다. 이러한 속성은 압축 보호 조건자를 작성하는 데 유용합니다. 예를 들어 다음 식은 동일합니다.

d <> 0 and n/d > 1 if d <> 0 then n/d > 1 else false

산술 연산자

+, -*/ 연산자는 산술 연산자입니다.

additive-expression:
      multiplicative-expression
      additive-expression
+multiplicative-expression
      additive-expression
-multiplicative-expression
multiplicative-expression:
      metadata- expression
      multiplicative-expression
*metadata-expression
      multiplicative-expression
/metadata-expression

정밀도

M의 숫자는 다양한 표현을 사용하여 저장되어 다양한 소스에서 들어오는 숫자에 대해 가능한 한 많은 정보를 유지합니다. 숫자는 필요에 따라 한 표현에서 다른 표현으로만 변환됩니다. M에서 두 개의 정밀도가 지원됩니다.

정밀도 의미 체계
Precision.Decimal ±1.0 x 10-28에서 ±7.9 x 1028 및 28-29 유효 숫자까지 범위의 128비트 10진수 표현입니다.
Precision.Double 가수 및 지수를 사용하는 과학적 표현; 는 64비트 이진 배정밀도 IEEE 754 산술 표준 IEEE 754-2008을 준수합니다.

산술 연산은 정밀도를 선택하고, 두 피연산자를 해당 정밀도(필요한 경우)로 변환한 다음, 실제 연산을 수행하고, 마지막으로 선택한 정밀도로 숫자를 반환하여 수행됩니다.

기본 제공 산술 연산자(+, -, ,*/)는 배정밀도를 사용합니다. 표준 라이브러리 함수(Value.Add, Value.Subtract, Value.Multiply, Value.Divide)를 사용하여 특정 정밀도 모델을 사용하여 이러한 작업을 요청할 수 있습니다.

  • 숫자 오버플로는 불가능 #infinity 합니다. 또는 -#infinity 크기가 너무 커서 나타낼 수 없는 값을 나타냅니다.

  • 숫자 언더플로는 불가능 0 합니다 -0 . 크기가 너무 작아서 나타낼 수 없는 값을 나타냅니다.

  • IEEE 754 특수 값 #nan(NaN—숫자가 아님)은 0으로 0 나누기와 같은 잘못된 사례를 산술적으로 처리하는 데 사용됩니다.

  • 10진수에서 배정밀도로의 변환은 소수 자릿수를 가장 가까운 이중 값으로 반올림하여 수행됩니다.

  • Double에서 10진수로의 전체 자릿수 변환은 이중 숫자를 가장 가까운 10진수 값으로 반올림하고 필요한 경우 값으로 #infinity-#infinity 오버플로하여 수행됩니다.

더하기 연산자

더하기 연산자(x + y)의 해석은 다음과 같이 계산된 식 x 및 y의 값 종류에 따라 달라집니다.

x y 결과 해석
type number type number type number 숫자 합계
type number null null
null type number null
type duration type duration type duration 크기의 숫자 합계
type duration null null
null type duration null
type날짜/시간 type duration type날짜/시간 기간별 날짜/시간 오프셋
type duration type날짜/시간 type날짜/시간
type날짜/시간 null null
null type날짜/시간 null

테이블에서 typedatetimetype date, type datetime, type datetimezone 또는 type time을 나타냅니다. 기간 및 일부 형식 datetime의 값을 추가할 때 결과 값은 동일한 형식입니다.

테이블에 나열된 값과 다른 값 조합의 경우 이유 코드 "Expression.Error" 와 함께 오류가 발생합니다. 각 조합은 다음 섹션에서 다룹니다.

두 피연산자 중 하나를 평가할 때 발생하는 오류가 전파됩니다.

숫자 합계

두 숫자의 합계는 더하기 연산자를 사용하여 계산되어 숫자를 생성합니다.

예시:

1 + 1             // 2 
#nan + #infinity  // #nan

숫자에 대한 더하기 연산 + 자는 배정밀도를 사용합니다. 표준 라이브러리 함수 Value.Add 를 사용하여 10진수 정밀도를 지정할 수 있습니다. 다음은 숫자의 합계를 계산할 때 유지됩니다.

  • 배정밀도의 합계는 64비트 이진 더블프레시션 IEEE 754 산술 IEEE 754-2008 규칙에 따라 계산됩니다. 다음 표에서는 0이 아닌 유한 값, 0, 무한대 및 NaN의 가능한 모든 조합의 결과를 나열합니다. 테이블에서 xy 0이 아닌 유한 값이며 z , 의 결과 x + y입니다. y 크기가 동일하지만 반대 기호 z 가 있는 경우 x 양수 0입니다. 너무 커서 대상 형식 z 으로 나타낼 수 없는 경우 x + y 부호x + y가 같은 무한대입니다.

    + y +0 -0 +∞ -∞ NaN
    x z x x +∞ -∞ NaN
    +0 y +0 +0 +∞ -∞ NaN
    -0 y +0 -0 +∞ -∞ NaN
    +∞ +∞ +∞ +∞ +∞ NaN NaN
    -∞ -∞ -∞ -∞ NaN -∞ NaN
    NaN NaN NaN NaN NaN NaN NaN
  • 10진 정밀도의 합계는 정밀도를 잃지 않고 계산됩니다. 결과의 배율은 두 피연산자의 배율보다 큽니다.

기간의 합계

두 기간의 합계는 기간으로 표시되는 100nanosecond 틱 수의 합계를 나타내는 기간입니다. 예시:

#duration(2,1,0,15.1) + #duration(0,1,30,45.3) 
// #duration(2, 2, 31, 0.4)

기간별 날짜/시간 오프셋

x + y를 통해 datetimex 및 기간 y를 더해서 선형 타임라인의 x부터 거리가 정확히 y의 크기인 새 datetime을 계산할 수 있습니다. 여기서 datetime은 모든 Date, DateTime또는 DateTimeZoneTime null이 아닌 결과를 의미하며 동일한 형식이 됩니다. 기간별 날짜/시간 오프셋은 다음과 같이 계산될 수 있습니다.

  • epoch 값 이후 날짜/시간을 지정한 경우 다음 정보 요소를 사용하여 새 datetime을 생성합니다.

    • 24시간 동안 y의 크기를 100나노초 틱 수로 나누고 결과의 소수 부분을 잘라내고 epoch 이후 x의 일에 이 값을 추가하는 것과 동일한 epoch 이후의 새 일을 계산합니다.

    • 자정 이후 x의 틱에 y의 크기를 추가하는 것과 동등한 자정 이후 새 틱을 계산하고, 24시간 동안 100나노초 틱 수를 모듈로합니다. x가 자정 이후 틱 값을 지정하지 않으면 값이 0으로 간주됩니다.

    • 변경되지 않은 UTC에서 분 오프셋에 대한 x 값을 복사합니다.

  • epoch 값 이후의 datetime의 날짜가 지정되지 않은 경우 다음 정보 요소를 지정하여 새 datetime을 생성합니다.

    • 자정 이후 x의 틱에 y의 크기를 추가하는 것과 동등한 자정 이후 새 틱을 계산하고, 24시간 동안 100나노초 틱 수를 모듈로합니다. x가 자정 이후 틱 값을 지정하지 않으면 값이 0으로 간주됩니다.

    • epoch 이후 며칠 동안 x의 값을 복사하고 UTC에서 분 오프셋을 변경하지 않고 복사합니다.

다음 예제에서는 datetime이 epoch 이후의 일을 지정하는 경우 절대 임시 합계를 계산하는 방법을 보여 줍니다.

#date(2010,05,20) + #duration(0,8,0,0) 
    //#datetime( 2010, 5, 20, 8, 0, 0 ) 
    //2010-05-20T08:00:00 
 
#date(2010,01,31) + #duration(30,08,0,0) 
    //#datetime(2010, 3, 2, 8, 0, 0) 
    //2010-03-02T08:00:00 
 
#datetime(2010,05,20,12,00,00,-08) + #duration(0,04,30,00) 
    //#datetime(2010, 5, 20, 16, 30, 0, -8, 0) 
    //2010-05-20T16:30:00-08:00 
 
#datetime(2010,10,10,0,0,0,0) + #duration(1,0,0,0) 
   //#datetime(2010, 10, 11, 0, 0, 0, 0, 0) 
   //2010-10-11T00:00:00+00:00

다음 예제에서는 지정된 시간 동안 날짜/시간 오프셋을 기간별로 계산하는 방법을 보여줍니다.

#time(8,0,0) + #duration(30,5,0,0) 
   //#time(13, 0, 0) 
   //13:00:00

빼기 연산자

빼기 연산자(x - y)의 해석은 다음과 같이 계산된 식 xy의 값 종류에 따라 달라집니다.

x Y 결과 해석
type number type number type number 숫자 차이
type number null null
null type number null
type duration type duration type duration 크기의 숫자 차이
type duration null null
null type duration null
type날짜/시간 type날짜/시간 type duration 날짜/시간 사이의 기간
type날짜/시간 type duration type날짜/시간 무효화된 기간별 날짜/시간 오프셋
type날짜/시간 null null
null type날짜/시간 null

테이블에서 typedatetimetype date, type datetime, type datetimezone 또는 type time을 나타냅니다. 일부 형식 datetime의 값에서 기간을 빼면 결과 값은 동일한 형식입니다.

테이블에 나열된 값과 다른 값 조합의 경우 이유 코드 "Expression.Error" 와 함께 오류가 발생합니다. 각 조합은 다음 섹션에서 다룹니다.

두 피연산자 중 하나를 평가할 때 발생하는 오류가 전파됩니다.

숫자 차이

두 숫자의 차이는 빼기 연산자를 사용하여 계산되어 숫자를 생성합니다. 예시:

1 - 1                // 0 
#nan - #infinity     // #nan

숫자에 대한 빼기 연산 - 자는 배정밀도를 사용합니다. 표준 라이브러리 함수 Value.Subtract 를 사용하여 10진수 정밀도를 지정할 수 있습니다. 다음은 숫자 차이를 계산할 때 유지됩니다.

  • 배정밀도의 차이는 64비트 이진 배정밀도 IEEE 754 산술 IEEE 754-2008의 규칙에 따라 계산됩니다. 다음 표에서는 0이 아닌 유한 값, 0, 무한대 및 NaN의 가능한 모든 조합의 결과를 나열합니다. 테이블에서 xy 0이 아닌 유한 값이며 z , 의 결과 x - y입니다. yz 으면 x 양수 0입니다. 너무 커서 대상 형식 z 으로 나타낼 수 없는 경우 x - y 부호x - y가 같은 무한대입니다.

    - y +0 -0 +∞ -∞ NaN
    x z x x -∞ +∞ NaN
    +0 -y +0 +0 -∞ +∞ NaN
    -0 -y -0 +0 -∞ +∞ NaN
    +∞ +∞ +∞ +∞ NaN +∞ NaN
    -∞ -∞ -∞ -∞ -∞ NaN NaN
    NaN NaN NaN NaN NaN NaN NaN
  • 10진 정밀도의 차이는 정밀도를 잃지 않고 계산됩니다. 결과의 배율은 두 피연산자의 배율보다 큽니다.

기간 차이

두 기간의 차이는 각 기간이 나타내는 100나노초 틱 수의 차이를 나타내는 기간입니다. 예시:

#duration(1,2,30,0) - #duration(0,0,0,30.45) 
// #duration(1, 2, 29, 29.55)

무효화된 기간별 날짜/시간 오프셋

x - y를 통해 datetimex 및 기간 y를 빼서 새 datetime을 계산할 수 있습니다. 여기서 datetimedate, datetime또는 datetimezonetime. 결과 datetime은 선형 타임라인의 부호 y반대 방향으로 정확히 크기y인 거리를 x 가집니다. 양수 기간을 빼면 시간을 기준으로 x역방향 결과를 생성하고 음수 값을 빼면 정시에 전달되는 결과가 생성됩니다.

#date(2010,05,20) - #duration(00,08,00,00) 
   //#datetime(2010, 5, 19, 16, 0, 0) 
   //2010-05-19T16:00:00 
#date(2010,01,31) - #duration( 30,08,00,00) 
   //#datetime(2009, 12, 31, 16, 0, 0) 
   //2009-12-31T16:00:00

두 날짜/시간 사이의 기간

t - u를 통해 두 개의 datetimetu를 빼서 두 항목 간 기간을 계산할 수 있습니다. 여기서 datetimedate, datetime또는 datetimezonetime. 를 빼서 ut 생성되는 기간은 에 추가할 u때 생성 t 되어야 합니다.

#date(2010,01,31) - #date(2010,01,15) 
// #duration(16,00,00,00) 
// 16.00:00:00 
 
#date(2010,01,15)- #date(2010,01,31) 
// #duration(-16,00,00,00) 
// -16.00:00:00 
 
#datetime(2010,05,20,16,06,00,-08,00) - 
#datetime(2008,12,15,04,19,19,03,00) 
// #duration(521,22,46,41)
// 521.22:46:41

음수 t - u 기간이 발생하는 경우 u > t 빼기:

#time(01,30,00) - #time(08,00,00) 
// #duration(0, -6, -30, 0)

다음은 다음을 사용하여 t - udatetime을 뺄 때 유지됩니다.

  • u + (t - u) = t

곱하기 연산자

곱하기 연산자(x * y)의 해석은 다음과 같이 계산된 식 x 및 y의 값 종류에 따라 달라집니다.

X Y 결과 해석
type number type number type number 숫자 제품
type number null null
null type number null
type duration type number type duration 기간의 배수
type number type duration type duration 기간의 배수
type duration null null
null type duration null

테이블에 나열된 값과 다른 값 조합의 경우 이유 코드 "Expression.Error" 와 함께 오류가 발생합니다. 각 조합은 다음 섹션에서 다룹니다.

두 피연산자 중 하나를 평가할 때 발생하는 오류가 전파됩니다.

숫자 제품

두 숫자의 곱은 곱하기 연산자를 사용하여 계산되어 숫자를 생성합니다. 예시:

2 * 4                // 8 
6 * null             // null 
#nan * #infinity     // #nan

숫자에 대한 곱셈 연산 * 자는 배정밀도를 사용합니다. 표준 라이브러리 함수 Value.Multiply 를 사용하여 소수 자릿수를 지정할 수 있습니다. 다음은 숫자의 곱을 계산할 때 유지됩니다.

  • 배정밀도의 제품은 64비트 이진 배정밀도 IEEE 754 산술 IEEE 754-2008의 규칙에 따라 계산됩니다. 다음 표에서는 0이 아닌 유한 값, 0, 무한대 및 NaN의 가능한 모든 조합의 결과를 나열합니다. 테이블에서 xy 양수 유한 값입니다. z 의 결과 x * y입니다. 결과가 대상 형식 z 에 비해 너무 크면 무한대입니다. 결과가 대상 형식 z 에 비해 너무 작으면 0입니다.

    * +y -y +0 -0 +∞ -∞ NaN
    +x +z -z +0 -0 +∞ -∞ NaN
    -x -z +z -0 +0 -∞ +∞ NaN
    +0 +0 -0 +0 -0 NaN NaN NaN
    -0 -0 +0 -0 +0 NaN NaN NaN
    +∞ +∞ -∞ NaN NaN +∞ -∞ NaN
    -∞ -∞ +∞ NaN NaN -∞ +∞ NaN
    NaN NaN NaN NaN NaN NaN NaN NaN
  • 10진 정밀도의 제품은 정밀도를 잃지 않고 계산됩니다. 결과의 배율은 두 피연산자의 배율보다 큽니다.

기간의 배수

기간 및 숫자의 곱은 기간 피연산자에서 숫자 피연산자의 시간을 나타내는 100nanosecond 틱의 수를 나타내는 기간입니다. 예시:

#duration(2,1,0,15.1) * 2 
// #duration(4, 2, 0, 30.2)

나누기 연산자

나누기 연산자(x / y)의 해석은 다음과 같이 계산된 식 xy의 값 종류에 따라 달라집니다.

X Y 결과 해석
type number type number type number 숫자 몫
type number null null
null type number null
type duration type number type duration 기간의 비율
type duration type duration type duration 기간의 숫자 몫
type duration null null
null type duration null

테이블에 나열된 값과 다른 값 조합의 경우 이유 코드 "Expression.Error" 와 함께 오류가 발생합니다. 각 조합은 다음 섹션에서 다룹니다.

두 피연산자 중 하나를 평가할 때 발생하는 오류가 전파됩니다.

숫자 몫

두 숫자의 몫은 나누기 연산자를 사용하여 계산되어 숫자를 생성합니다. 예시:

8 / 2               // 4 
8 / 0               // #infinity 
0 / 0               // #nan 
0 / null            // null 
#nan / #infinity    // #nan

숫자에 대한 나누기 연산 / 자는 배정밀도를 사용합니다. 표준 라이브러리 함수 Value.Divide 를 사용하여 10진수 정밀도를 지정할 수 있습니다. 다음은 숫자의 몫을 계산할 때 유지됩니다.

  • 배정밀도의 몫은 64비트 이진 배정밀도 IEEE 754 산술 IEEE 754-2008 규칙에 따라 계산됩니다. 다음 표에서는 0이 아닌 유한 값, 0, 무한대 및 NaN의 가능한 모든 조합의 결과를 나열합니다. 테이블에서 xy 양수 유한 값입니다. z 의 결과 x / y입니다. 결과가 대상 형식 z 에 비해 너무 크면 무한대입니다. 결과가 대상 형식 z 에 비해 너무 작으면 0입니다.

    / +y -y +0 -0 +∞ -∞ NaN
    +x +z -z +∞ -∞ +0 -0 NaN
    -x -z +z -∞ +∞ -0 +0 NaN
    +0 +0 -0 NaN NaN +0 -0 NaN
    -0 -0 +0 NaN NaN -0 +0 NaN
    +∞ +∞ -∞ +∞ -∞ NaN NaN NaN
    -∞ -∞ +∞ -∞ +∞ NaN NaN NaN
    NaN NaN NaN NaN NaN NaN NaN NaN
  • 10진 정밀도의 합계는 정밀도를 잃지 않고 계산됩니다. 결과의 배율은 두 피연산자의 배율보다 큽니다.

기간의 몫

두 기간의 몫은 기간이 나타내는 100nanosecond 틱 수의 몫을 나타내는 숫자입니다. 예시:

#duration(2,0,0,0) / #duration(0,1,30,0) 
// 32

확장된 기간

기간 및 숫자의 몫은 기간 xy숫자 y 로 표현되는 100나노초 틱 수의 몫을 나타내는 기간 x 입니다. 예시:

#duration(2,0,0,0) / 32 
// #duration(0,1,30,0)

구조 조합

조합 연산자(x & y)는 다음과 같은 종류의 값에 대해 정의됩니다.

X Y 결과 해석
type text type text type text Concatenation
type text null null
null type text null
type date type time type datetime 병합
type date null null
null type time null
type list type list type list Concatenation
type record type record type record 병합
type table type table type table Concatenation

Concatenation

을 사용하여 x & y텍스트 2개, 목록 2개 또는 테이블 값 2개를 연결할 수 있습니다.

다음 예제에서는 텍스트 값을 연결하는 방법을 보여 줍니다.

"AB" & "CDE"     // "ABCDE"

다음 예제에서는 목록을 연결하는 방법을 보여 줍니다.

{1, 2} & {3}     // {1, 2, 3}

다음은 다음을 사용하여 x & y두 값을 연결하는 경우 유지합니다.

  • 또는 y 식을 평가할 x 때 발생하는 오류는 전파됩니다.

  • 오류가 있거나 오류가 있는 항목이 xy 있으면 오류가 전파되지 않습니다.

  • 두 텍스트 값을 연결한 결과는 x 값과 y가 바로 뒤에 있는 텍스트 값입니다. 피연산자 중 하나가 null이고 다른 피연산자 중 하나가 텍스트 값인 경우 결과는 null입니다.

  • 두 목록을 연결한 결과는 뒤에 있는 모든 항목 xy이 포함된 목록입니다.

  • 두 테이블을 연결한 결과는 두 피연산자 테이블의 열이 결합된 테이블입니다. 열 순서가 x 유지되고 열이 뒤에만 표시되어 y상대 순서가 유지됩니다. 피연산자 중 하나에만 나타나는 열의 경우 다른 피연 null 산자의 셀 값을 채우는 데 사용됩니다.

병합

레코드 병합

두 레코드를 사용하여 x & y병합할 수 있으며, 두 레코드의 필드가 모두 x 포함된 레코드를 생성합니다 y.

다음 예제에서는 레코드 병합을 보여 줍니다.

[ x = 1 ] & [ y = 2 ]                // [ x = 1, y = 2 ] 
[ x = 1, y = 2 ] & [ x = 3, z = 4 ]  // [ x = 3, y = 2, z = 4 ]

다음은 다음을 사용하여 x + y두 레코드를 병합할 때 유지합니다.

  • 또는 y 식을 평가할 x 때 발생하는 오류는 전파됩니다.

  • 필드가 둘 다 x 에 표시되고 y값이 y 사용됩니다.

  • 결과 레코드의 필드 순서는 해당 필드의 순서이며x, 그 다음에는 해당 필드의 일부가 x아닌 필드 y 가 표시되는 y순서와 같습니다.

  • 레코드를 병합해도 값이 평가되지는 않습니다.

  • 필드에 오류가 포함되어 있으므로 오류가 발생하지 않습니다.

  • 결과는 레코드입니다.

날짜-시간 병합

날짜를 x 사용하여 x & y시간과 y 병합할 수 있으며, 둘 다 yx 의 파트를 결합하는 datetime을 생성합니다.

다음 예제에서는 날짜와 시간을 병합하는 방법을 보여 줍니다.

#date(2013,02,26) & #time(09,17,00) 
// #datetime(2013,02,26,09,17,00)

다음은 다음을 사용하여 x + y두 레코드를 병합할 때 유지합니다.

  • 또는 y 식을 평가할 x 때 발생하는 오류는 전파됩니다.

  • 결과는 datetime입니다.

단항 연산자

+, -not 연산자는 단항 연산자입니다.

unary-expression:
      type-expression

      +단항 식
      -단항 식
      not단항 식

단항 더하기 연산자

단항 더하기 연산자(+x)는 다음 종류의 값에 대해 정의됩니다.

X 결과 해석
type number type number 단항 더하기
type duration type duration 단항 더하기
null 'null

다른 값의 경우 이유 코드 "Expression.Error" 오류가 발생합니다.

단항 더하기 연산자를 + 사용하면 숫자, datetime 또는 null 값에 기호를 적용할 수 있습니다. 결과는 동일한 값입니다. 예시:

+ - 1                 // -1 
+ + 1                 // 1 
+ #nan                // #nan 
+ #duration(0,1,30,0) // #duration(0,1,30,0)

단항 더하기 연산 +x자를 평가할 때 다음이 유지됩니다.

  • 평가할 x 때 발생하는 오류는 전파됩니다.

  • 평가 x 결과가 숫자 값이 아니면 이유 코드 "Expression.Error" 와 함께 오류가 발생합니다.

단항 빼기 연산자

단항 빼기 연산자(-x)는 다음 종류의 값에 대해 정의됩니다.

X 결과 해석
type number type number 부정
type duration type duration 부정
null null

다른 값의 경우 이유 코드 "Expression.Error" 오류가 발생합니다.

단항 빼기 연산자는 숫자 또는 기간의 기호를 변경하는 데 사용됩니다. 예시:

- (1 + 1)       // -2 
- - 1           // 1 
- - - 1         // -1 
- #nan          // #nan 
- #infinity     // -#infinity 
- #duration(1,0,0,0)  // #duration(-1,0,0,0) 
- #duration(0,1,30,0) // #duration(0,-1,-30,0)

단항 빼기 연산 -x자를 평가할 때 다음이 유지됩니다.

  • 평가할 x 때 발생하는 오류는 전파됩니다.

  • 식이 숫자이면 해당 기호가 변경된 식 x 의 숫자 값이 결과입니다. 값이 NaN이면 결과도 NaN입니다.

논리 부정 연산자

논리 부정 연산자(not)는 다음 종류의 값에 대해 정의됩니다.

X 결과 해석
type logical type logical 부정
null null

이 연산자는 지정된 논리 값에 대한 논리 not 연산을 계산합니다. 예시:

not true             // false 
not false            // true 
not (true and true)  // false

다음은 논리 부정 연산 not x자를 평가할 때 유지됩니다.

  • 평가할 x 때 발생하는 오류는 전파됩니다.

  • 식 x를 계산하여 생성된 값은 논리 값이거나 이유 코드 "Expression.Error" 가 있는 오류가 발생해야 합니다. 값이 true면 결과는 .입니다 false. 피연산자인 false경우 결과는 .입니다 true.

결과는 논리적 값입니다.

형식 연산자

연산 is 자이며 as 형식 연산자로 알려져 있습니다.

형식 호환성 연산자

형식 호환성 연산자 x is y는 다음 종류의 값에 대해 정의됩니다.

X Y 결과
type any nullable-primitive-type type logical

x is y 은 지정된 형식 x 이 호환y되는지를 반환 true 하고, 지정된 형식 x 이 .와 y호환되지 않는 경우 반환 false 합니다. ynullable-primitivetype이어야 합니다.

is-expression:
      as-expression
      is-expression
isnullable-primitive-type
nullable-primitive-type:

      nullableopt primitive-type

연산자가 지원하는 is 형식 호환성은 일반 형식 호환성의 하위 집합이며 다음 규칙을 사용하여 정의됩니다.

  • null이면 x 형식, 형식 또는 nullable 형식anynull인 경우 y 호환됩니다.

  • null이 아닌 경우 x 기본 형식 xy이 .

식을 x is y계산할 때 다음이 유지됩니다.

  • 식을 x 평가할 때 발생하는 오류입니다.

형식 어설션 연산자

형식 어설션 연산 x as y 자는 다음 형식의 값에 대해 정의됩니다.

X Y 결과
type any nullable-primitive-type type any

x as y 은 값 x 이 연산자에 따라 호환 y 된다는 것을 어설션합니다 is . 호환되지 않으면 오류가 발생합니다. ynullable-primitive-type이어야 합니다.

as-expression:
      equality-expression
      as-expression
asnullable-primitive-type

x as y 식은 다음과 같이 평가됩니다.

  • 형식 호환성 검사 x is y 수행되고 해당 테스트가 성공하면 어설션이 변경되지 않은 상태로 반환 x 됩니다.

  • 호환성 검사 실패하면 이유 코드 "Expression.Error" 와 함께 오류가 발생합니다.

예:

1 as number               // 1 
"A" as number             // error 
null as nullable number   // null

식을 x as y계산할 때 다음이 유지됩니다.

  • 식을 x 평가할 때 발생하는 오류입니다.

병합 연산자

병합 연산자 ??는 null이 아닌 경우 왼쪽 피연산자의 결과를 반환하고, 그렇지 않으면 오른쪽 피연산자의 결과를 반환합니다. 오른쪽 피연산자는 왼쪽 피연산자가 null인 경우에만 평가됩니다.