이 글은 C++ 반복자는 왜 그렇게 헷갈리는 걸까?의 보충 글입니다.
자연수의 부분수열 2, 3, ..., 12를 위험천만한 줄임표 없이 나타낼 때, 다음 4종류의 방식 중 하나를 고를 수 있다.
이 중 특정한 방식을 다른 것보다 선호할 이유가 있는가? 그렇다. 방식 a와 b는 표기된 상·하한의 차가 부분수열의 길이와 같은 이점이 있다는 관찰은 타당하다. 또한 결과적으로 이들 방식 하에서 두 부분수열이 인접하면 한쪽의 상한이 다른 한쪽의 하한과 같아진다는 관찰 역시 타당하다.역1 그러나 이러한 관찰이 타당한 것과 별개로 a와 b 중 더 나은 것을 고를 수는 없으니, 원점으로 돌아가 보자.
자연수에는 최솟값이 존재한다. b와 d와 같이 하한을 제외할 경우 가장 작은 자연수부터 시작하는 부분수열의 하한이 비자연수가 되어야 한다.역2 이는 더러우니 하한은 a와 c처럼 ≤로 표기하는 것을 선택한다. 한편 가장 작은 자연수부터 시작하는 부분수열을 생각하자. 상한을 포함할 경우 부분수열이 빈 수열이 되었을 때 상한이 비자연수가 되어야 한다.역3 이는 더러우니 상한은 a와 d처럼 <로 표기하는 것을 선택한다. 이로써 방식 a를 가장 우선하는 것으로 결론지을 수 있다.
참고 Xerox PARC에서 개발한 프로그래밍 언어 Mesa에는 네 종류의 방식 전부를 이용해 구간을 표현하는 특수 문법이 있다. Mesa를 이용한 광범위한 실험에서 나머지 세 방식이 꾸준히 어색한 코드와 실수의 원인이 되어 왔음이 밝혀졌으며, 이 실험으로 인해 현재 Mesa 프로그래밍을 할 때는 나머지 세 문법을 사용하지 않는 것이 권장되고 있다. 이 실험적 증거를 굳이 언급하는 이유는 현장 검증 없이 내린 결론을 불편해하는 사람들이 있기 때문이다. (참고 끝.)
길이가
참고 여러 프로그래밍 언어가 이러한 세부사항에 충분히 주의를 기울이지 않고 설계되었다. FORTRAN에서는 첨자가 항상 1부터 시작하고, ALGOL 60과 PASCAL에서는 방식 c를 채택했으며, 최신 판의 SASL은 수열을 동시에 양의 정수의 함수로도 취급하게 되면서 FORTRAN 방식으로 회귀했다. 유감! (참고 끝.)
이 이야기를 하자니 최근에 우리 대학의 수학과 동료 중 한 명—컴퓨터과학자가 아닌—가 몇몇 젊은 컴퓨터과학자들을 (습관적으로) 수를 0부터 센다는 이유로 "꼰대pedantry"라고 하던 일이 생각난다. 가장 합리적인 방식을 의식적으로 받아들이는 것을 화낼 이유로 받아들인 것이다. ("○○ 끝."을 쓰는 습관도 도발적으로 받아들여지지만, 이 습관은 유용하다. 한 학생이 문항이 첫 페이지의 맨 마지막까지만 있는 줄 알아서 시험에서 거의 낙제했다는 이야기를 들은 적이 있다.) 안토니 제이Antony Jay의 이 말이 참 옳다고 느껴진다. "다른 종교와 같이 기업 종교에서도, 이단자를 추방해야 할 이유는 그가 틀렸을 가능성이 아니라 맞았을 가능성 때문이다."
역1 예를 들어 인접하는 두 수열 2, 3, 4와 5, 6, 7을 a 방식으로 표기하면 각각 2 ≤ i < 5와 5 ≤ i < 8이 되고, 전자의 표기되는 상한과 후자의 표기되는 하한이 5로 일치합니다. ↑
역2 예를 들어 수열 0, 1, 2를 b 방식으로 표기하면 -1 < i ≤ 2가 되며, 자연수가 아닌 -1을 하한으로 사용해야 한다는 문제점이 생깁니다. 이 글에서는 0도 자연수로 취급하고 있습니다. ↑
역3 0에서 시작하는 빈 수열 0 ≤ i ≤ -1을 의미합니다. ↑