메아리 저널

나루의 자료형 (1)

자료형은 언어에서 정보의 처리 단위가 되는 매우 기본적인 개념이다. 자료형의 개념은 객체 지향 프로그래밍과 기타 수도 없는 프로그래밍 기법들에서 엄청나게 확장되었지만, 일단은 좀 범위를 낮춰서 숫자에 대해서만 좀 생각해 보자.

프로그래밍 언어에서 숫자는 보통 그 도메인에 따라 자연수 및 정수, 유리수, 실수, 복소수로 분류된다. 여기서는 이 숫자들이 나루에서 어떻게 구현될 것이며, 왜 그렇게 할 것인지에 대한 내용을 정리해 놓는다. (언제나 그렇지만 이 내용은 확정된 게 아니다.)

정수

흔히 정수 리터럴은 숫자들로 구성되어 있는 경우가 많다. 그건 나루에서도 별로 변하지 않았다.

...   -3   -2   -1   0   1   2   3   ...

많은 언어들에서는 16진법이나 8진법 등의 숫자를 표기하기 위해 접두사 0x 등을 흔히 쓴다. 앞에 붙는 0은 해석을 쉽게 하고 모호함을 없애기 위한 것으로 딱히 반대하진 않지만, 이런 방법에는 몇 가지 문제점이 있다.

  • 8진법은 흔히 03177과 같이 나타내지만, 다른 진법에 비해 많이 쓰이는 것도 아니고 (차라리 16진법을 짧게 하면 또 모르겠다.) 실수로 10진법을 8진법으로 써 버릴 가능성도 있다.
  • 8진법에 대한 접두사를 0o 등으로 하는 경우가 종종 있으나, 대문자로 쓰면 혼돈의 여지가 있다. (0O를 생각해 보라)
  • C/C++에는 16진법만큼이나 많이 쓰이는 2진법에 대한 처리가 따로 없다. (다른 언어들 중에는 0b를 사용하기도 한다.)
  • 다른 진법들에 대한 일반적인 처리는 보기가 힘들다. 설령 처리할 방법이 있다 해도 상수 수식으로는 불가능한 경우가 많다.

꽤 많은 언어들이 이런 문제 때문에 제각기 다른 규칙을 쓰고 있다. 특히 일반화된 진법 표기는 지원하는 언어들마다 천차만별인데, 예를 들어 펄 6에서는 :radix(number) 형태를 쓰고, 프롤로그는 radix'number 형태의 문법을 썼다. (프롤로그는 참 특이한 게 진법에 0을 쓰면 숫자가 아니라 주어진 문자의 코드를 의미하게 되어 있다. 즉 0'A는 65이다.)

그리하여 나루에서는 다음과 같은 규칙을 사용한다.

  • 2진법, 8진법, 16진법에 대한 접두사 0b, 0o, 0x는 그대로 사용한다. 03177과 같은 숫자는 10진법으로 해석한다.
  • 다만 대문자로 쓰여진 접두사는 허용하지 않는다. 즉 0X1234 등은 잘못된 숫자이다. 현실적으로 진법과 숫자의 구분을 위해 접두사를 소문자로 많이 쓰므로 이로 인한 문제는 크게 없으리라 생각한다.
  • 일반화된 진법을 위해서 radix'number' 형태의 문법을 지원한다. (작은 따옴표 대신에 문자를 담는 모든 형태의 문법을 대신 쓸 수 있다.) radix는 항상 숫자로만 이루어져 있으므로 해석에 모호함은 없을 것이다.

일반화된 진법에 대한 문법은 프롤로그에서 왔다. 나는 펄 6에서 : 문자를 지나치게 많이 쓰는 게 그다지 맘에 들지 않는다.

숫자 리터럴에서 자리와 자리 사이에는 _를 넣어서 구별할 수도 있다. 이 문법은 루비 등에서 쓰이면서 최근에 꽤나 유행하고 있는데, 딱히 넣으면 안 될 이유가 있는 것도 아니라서 넣기로 했다. 물론 자리 구분자를 두 개 이상 연달아 쓰거나, 숫자의 앞 뒤에 붙이는 건 위법이다.

자리 구분자를 왜 _로 쓰냐고 물을 수 있다. 사실 일반화된 진법의 문법을 바꾼다면 좀 더 예뻐 보일 수도 있는 '를 대신 쓸 수도 있을 것이다. 그런데도 굳이 _를 쓰는 이유는, 첫째 다른 언어와의 호환을 위한 것이며, 둘째 문법 강조에 영향을 주지 않기 위함이다. 작은 따옴표 안에 들어 있는 모든 내용을 똑같이 감싸는 거라 가정하고 처리할 수 있다면 나쁘지 않겠는가?

유리수

...이건 나중에 계속.

전체 글 목록은 다음과 같다.

(2010-04-03)

이 글은 본래 http://mearie.org/journal/2007/08/datatype-in-naru-part-1에 썼던 것을 옮겨 온 것입니다.


(rev 1d46270eb038)