상황별 식은 특정 컨텍스트에서만 유효한 식입니다. 예를 들어 복사 및 업데이트 식에서 항목 이름을 사용할 때는 정규화할 필요 없이.
식은 계산 및 재할당 문과 같이 컴파일러에서 유추하고 자동으로 삽입할 수 있는 경우 생략할 수 있습니다.
개방형 범위는 컨텍스트 식과 생략된 식 모두에 적용되는 또 다른 예입니다. 특정 컨텍스트 내에서만 유효하며 컴파일러는 적절한 경계를 유추하여 컴파일 중에 정규 Range 식으로 변환합니다.
Range 형식의 값은 시작 값, 단계 값(선택 사항) 및 끝 값으로 지정된 정수 시퀀스를 생성합니다. 예를 들어 Range 리터럴 식 1..3 시퀀스 1,2,3을 생성합니다. 마찬가지로 식 3..-1..1 시퀀스 3,2,1을 생성합니다. 예를 들어 범위를 사용하여 기존 배열에서 새 배열을 만들 수도 있습니다.
let arr = [1,2,3,4];
let slice1 = arr[1..2..4]; // contains [2,4]
let slice2 = arr[2..-1..0]; // contains [3,2,1]
Q#무한 범위를 정의할 수 없습니다. 시작 및 끝 값을 항상 지정해야 합니다. 유일한 예외는 Range 사용하여 배열을 조각화할 때입니다. 이 경우 컴파일러는 범위의 시작 또는 끝 값을 합리적으로 유추할 수 있습니다.
이전 배열 조각화 예제에서는 단계 크기가 양수인 경우 컴파일러에서 의도한 범위 끝이 배열의 마지막 항목 인덱스여야 한다고 가정하는 것이 합리적입니다. 단계 크기가 음수이면 범위 끝은 배열에서 첫 번째 항목의 인덱스일 가능성이 0. 이 대화는 범위의 시작 부분에 대해 유지됩니다.
요약하자면 범위 시작 값을 생략하면 유추된 시작 값입니다.
- 는 단계가 지정되지 않거나 지정된 단계가 양수이면 0입니다.
- 는 지정된 단계가 음수이면 배열 길이에서 1을 뺀 값입니다.
범위 끝 값을 생략하면 유추된 끝 값입니다.
- 은 지정된 단계가 없거나 지정된 단계가 양수이면 배열 길이에서 1을 뺀 값입니다.
- 지정된 단계가 음수이면 0입니다.
따라서 Q# 배열 조각화 식 내에서 개방형 범위를 사용할 수 있습니다. 예를 들면 다음과 같습니다.
let arr = [1,2,3,4,5,6];
let slice1 = arr[3...]; // slice1 is [4,5,6];
let slice2 = arr[0..2...]; // slice2 is [1,3,5];
let slice3 = arr[...2]; // slice3 is [1,2,3];
let slice4 = arr[...2..3]; // slice4 is [1,3];
let slice5 = arr[...2...]; // slice5 is [1,3,5];
let slice7 = arr[4..-2...]; // slice7 is [5,3,1];
let slice8 = arr[...-1..3]; // slice8 is [6,5,4];
let slice9 = arr[...-1...]; // slice9 is [6,5,4,3,2,1];
let slice10 = arr[...]; // slice10 is [1,2,3,4,5,6];
범위 단계가 양수인지 아니면 음수인지를 결정하는 작업이 런타임에 발생하므로 컴파일러는 런타임에 평가되는 적절한 식을 삽입합니다. 생략된 끝 값의 경우 삽입된 식은 step < 0 ? 0 | Length(arr)-1있으며 생략된 시작 값의 경우 step < 0 ? Length(arr)-1 | 0, 여기서 step 범위 단계에 지정된 식이거나, 단계가 지정되지 않은 경우 1.