완벽한 범위 리터럴 설계 그 접근법에 대해

언어를 디자인하려면 “완벽한”범위 리터럴을 디자인하는 방법에 대해 생각했습니다. 1-4와 같이 값의 범위를 나타내는 명령문에서 범위 리터럴을 모르는 경우 for / foreach 루프에서 가장 일반적으로 사용됩니다.

고려해야 할 몇 가지 문제가있는 것 같습니다.

  • 포괄적이고 배타적 인 범위에 대한 지원, 엔드 포인트에 +1 또는 -1을 적용하는 것은 약간 애매하고 오류가 발생하기 쉽습니다.

  • 스테핑 지원, 예를 들어 짝수 또는 홀수의 범위를 만들 수 있습니다

  • 가독성, 범위 리터럴이 설명하는 내용을 쉽게 알 수 있어야합니다.

  • 확실성, 범위 리터럴이 설명하는 것은 완벽하게 명확해야합니다.

  • 대부분의 경우 배열을 반복하는 등의 이유로 사용되므로 기본값은 아마도 포함에서 배타적이어야합니다.

어쨌든, 내가 본 범위 리터럴의 한 가지 예는 루비입니다. 루비는 독점적 인 (끝) 범위는 1..3이고 포괄적 인 (끝)은 1 … 3입니다. 1..10.step (5)도 수행 할 수 있습니다. 주의 깊게 고려한 결과 (루비에 대한 제한된 지식으로) 그 접근법에 대해 싫어하는 몇 가지를 발견했습니다.

  1. 당신은 끝을 포함하고 배타적으로 설명 할 수 있습니다. 대부분의 시나리오를 설명하는 동안 약간 일치하지 않는 것 같습니다.

  2. 추가로 다양 함. 범위가 포함 또는 독점인지 확인하기 어려운 레시피처럼 보입니다. 나는 당신에 대해 모르지만 점은 흐려지는 경향이 있습니다 🙂

  3. 범위에 대한 표기법과 같은 방법을 추가하면 리터럴의 개념과 약간 일치하지 않는 클래스의 개념이 혼합되어있는 것 같습니다 (범위가 클래스에 컴파일 된 경우에도)

어쨌든 다른 대안을 숙고 한 후. 나는 이것을 생각해 냈다

  • [5..1] 5,4,3,2,1
  • [1..5 [ 1,2,3,4
  • ] 1..5] 2,3,4,5
  • [ 0..5..20] 0,5,10,15,20

기타 등등. 일반적으로 세트를 제거하고 세트와 대조적으로 주문하더라도이 종류에 적합하기 때문에 나는 그것을 좋아한다.

내가 조금 찢어 버린 한 가지 독점적 인 / 포괄적 인 지표를 필수 여부로 만드는 것입니다. 즉, 1..5 만 쓰면 배열이 가장 일반적인 경우이기 때문에 기본값은 1,2,3,4입니다. 더 쉽고 더 읽기 쉽지만 덜 구체적이며 [1..5 []를 작성해야한다면 어떻게 작동하는지 조기에 배울 수 있습니다.

제가 생각하기에, 대부분의 기지를 덮고, 무언가를 간과 했습니까? []을 필수로 설정 하시겠습니까? 프로그래밍 언어에서 범위 리터럴을 다르게 디자인 하시겠습니까?

응시자

  • 대괄호 스타일 : [0..10 [ , 단계 : [0..5..20 [
  • 구간 표기법 : [0..10) , 단계 : [0..5..20)
  • 독점적 느낌. 0 ..! 10, 단계 : 0..5 ..! 20
    • 다른 단계로. 0 ..! 20, 5
    • 그러나 기본값 * 0..10을 포함하는 포괄적 인
  • wordy : [0에서! 20까지 5]

나는 지금까지 내가 가장 좋아하는 aestically가 0 ..! 100..5 ..! 20 이라고 말해야 합니다. 포괄적 인 배타적 인 기본 0..10 이 더 논리적 이기를 바랍니다.



답변

수학에 이미 존재하는 것을 왜 발명합니까?

간격 표기법

그것은 이미 존재하는 ‘모호하지 않은’점을 포함해야합니다.

유일한 문제는 스테핑을 정의하는 것입니다. 수학의 다른 것이 도움이 될 수 있습니까?


답변

Haskell 범위를 보셨습니까? 단계에 대한 그들의 아이디어는 (중간에) 비슷하지만 구문상의 차이로 @ luqui ‘s answer에서 표시 됩니다.

[1,2..10] = [1,2,3,4,5,6,7,8,9,10]
[1,3..10] = [1,3,5,7,9]
[4,3..0]  = [4,3,2,1,0]
[0,5..]   = [0,5,10,15,20,25,30,35...  -- infinite
[1,1..]   = [1,1,1,1,1,1,1,1,1,1,1...  -- infinite

나는이 표기법이 매우 직관적이라는 것을 알았습니다 : 당신은 열거를 시작하고 본문을 건너 뛸 곳을 표시합니다.

그것은 “배타적”의 경우를 다루지 않지만 솔직히 말해서 행동에 대해 한 번 명확하게하고 (어떤 범위가 포함되고 독점적인지를 지정하십시오) 구문이 매우 명확 하지 않으면 사용자가 조정을 기대합니다 (그리고 언어에 구애받지 않는 편집자를 혼동하지 않습니다).


답변

제공하는 언어로 된 목록 이해에 대해 읽어야합니다.

예를 들어, 파이썬은 range()함수를 사용하여 사례를 꽤 잘 다루고 너무 복잡하게 표현할 수없는 경우에 대한 목록 이해도를 제공 range()합니다.


답변

나는 당신의 표기법이 명확하지 않다고 생각합니다. 직관적으로, [0..5..20]단계 너비 = 5의 범위처럼 보이지 않습니다. 일부 경우에는 실패합니다. 세트 (0,2)를 표현하는 [0..2..2]것은 어떻습니까? 또는 중간에 무엇을 넣어야합니까?

파이썬의 슬라이스 표기법은 확실한 접근법이라고 생각합니다 [start:end:step](단계는 선택 사항입니다).

배타적이고 포괄적 인 범위에 대한 지원이 실제로 필요한 경우 언어에 구문상의 모호성이 도입되지 않는 한 표준 범위 표기법 (예 : ([)을 사용 합니다.


답변

세 번째 증분 값을 설정할 때이 값은 중간이 아닌 끝 부분에 추가하는 것이 좋습니다. 이는 선택적 값이므로 중간에 선택적 세 번째 인수를 추가하는 것보다 노련한 프로그래머에게 더 직관적 인 것처럼 보입니다. .

[1..5..20] 대신 [1..20] [5] 또는 [1..20,5]와 같은 작업을 수행 할 수 있습니다.


답변

  • [1..5 [1,2,3,4
  • ] 1..5] 2,3,4,5
  • ] 1..5 [2,3,4

왜 [1..4], [2..5], [2..4]를 사용하지 않습니까? 범위를 제외하면 많은 이점이 없습니다. 예, MIN + 1 또는 MAX-1을 쓸 필요는 없지만 어쨌든 금지하지는 않습니다. 너무 많은 변형, imho. 내 선택 언어 인 scala에는 (1 ~ 3)과 (1 ~ 3) [= (1 ~ 2)]가 있지만 처음에는 혼란 스러웠습니다. 이제는 항상 ‘x to y’를 사용하므로 사용하지 않는 옵션이 제외 옵션이지만 사용하지 않는 옵션의 이점은 없습니다.

  • [5..1] 5,4,3,2,1

물론 (1 ~ MAX) (x => y = (MAX + 1)-x)이지만 많은 상용구이며 사용자 친화적이지 않습니다.

  • [0..5..20] 0,5,10,15,20

물론 (0 ~ 4) (x => y = x * 5)는 상용구가 아닙니다. 논쟁의 여지가 있습니다.


답변

이 같은 것은 어떻습니까 :

  • [5..1] 5,4,3,2,1
  • [1..5] [i, e] 1,2,3,4
  • [5..1] [i, e] 5,4,3,2
  • [1..5] [e, i] 2,3,4,5
  • [1..5] [e, e] 2,3,4
  • [0..20] (5)에 의해 0,5,10,15,20

ie대괄호의 두 번째 쌍은이 태초 또는 범위를 종료하는 것이 포함 또는 독점 여부를 나타내는 (또는 사용할 수 있습니다 incl, 그리고 excl당신이 더 명확 할 경우). 는 by 5스테핑 간격을 나타냅니다. 첫 번째와 마지막 예제는 첫 번째와 마지막 값을 포함하므로을 생략했습니다 [i,i]. 이것은 OK 기본 동작이라고 생각합니다.

[i,i]포함 / 배타 지정자 및 by 1단계 지정자에 대한 기본값이 될 수 있습니다 .

일반적으로 나는 포함하는 표준 표기법을 제시 한 것 ([@Dan 맥그래스에서 언급 한 바와 같이,하지만 난 코드에서이 혼란을 볼 수 있었다 동의합니다.