Closed kmc7468 closed 5 years ago
개발자 님의 트윗을 보면 문자열에 대해서 매우 재밌는 실험을 하고 계신 듯합니다. 다음 버전에 어떻게 적용될 지는 모르겠지만 벌써부터 기대가 됩니다. ^^
아울러, 두 목록을 더하는 함수는 ㄷ
을 쓰시면 되겠습니다.
ㄴ ㄷ ㄹ ㅁㄹㅎㄹ ㅁ ㅂ ㅅ ㅁㄹㅎㄹ ㄷㅎㄷ
위와 같이하면 [1, 2, 3, 4 ,5, 6] 을 내놓습니다.
아~ 제가 예전에 구현체 개발할 때는 ㄷ이 덧셈과 논리합 기능 밖에 없었어서 ㄷ의 존재를 잊고 있었나 봅니다. 답변 감사합니다!
잊지 않고 찾아주셔서 반갑습니다 :) 아마 v0.6은 이번 달 내로 업데이트가 될 것 같으니 많은 기대 해주세요!
문자열 관련해서는 파이썬 모델을 따라 바이트열을 신설해 숫자 <-> 바이트열 <-> 문자열로 변환하게끔 하는 것으로 결정했습니다. 이렇게 하면 언급하신 인덱싱 행동이 명확해지는 장점이 있습니다. 변환하는 기능은 기본제공 모듈 ㅂ ㄱ (가칭)이 맡도록 했고, 그 스펙은 다음과 같이 할 생각입니다.
ㅂ ㄱ ㅂㅎㄷ
[문자열] {ㄱ(utf) ㄷ(2 byte) ㅈㅈㅎㄱ(big endian) (ㅂ ㄱ ㅂㅎㄷ) ㅎㄹ} ㅎㄴ
[바이트열] {ㄱ ㄴ (ㅂ ㄱ ㅂㅎㄷ) ㅎㄷ} ㅎㄴ
[실수] {ㄴ(unsigned) ㅁ(4 byte) (ㅂ ㄱ ㅂㅎㄷ) ㅎㄷ} ㅎㄴ
[바이트열] {ㄷ(signed) (ㅂ ㄱ ㅂㅎㄷ) ㅎㄴ} ㅎㄴ
예를 들어 'Hi'라는 문자열을 생성하려면 다음과 같이 할 수 있게 됩니다.
(ㄴㄱㄴ ㄴㅂㄴ ㅁㄹㅎㄷ) {ㄴ ㄴ (ㅂ ㄱ ㅂㅎㄷ)ㅎㄷ} ㅁㄷㅎㄷ {ㄱ ㄴ (ㅂ ㄱ ㅂㅎㄷ)ㅎㄷ} ㅁㄷㅎㄷ ㅁㅈㅎㄱ ㄱㅁㅎㄷ
ㄴㄱㅂㅁㅈ(0x6941) {ㄴ ㄷ (ㅂ ㄱ ㅂㅎㄷ)ㅎㄷ}ㅎㄴ {ㄱ ㄴ (ㅂ ㄱ ㅂㅎㄷ)ㅎㄷ}ㅎㄴ
ㄴㅂㅂㄱㅁ(0x4169) {ㄴ ㄷ ㅈㅈㅎㄱ (ㅂ ㄱ ㅂㅎㄷ)ㅎㄹ}ㅎㄴ {ㄱ ㄴ (ㅂ ㄱ ㅂㅎㄷ)ㅎㄷ}ㅎㄴ
사족으로, 이 내장모듈의 이름을 뭐로 하는 게 좋을까요?
@dragonteros 제가 지금껏 본 난해한 프로그래밍 언어 중에서 가장 문자열 지원이 ~복잡한~ 잘 된 언어네요. 내장모듈이 인코딩/디코딩을 담당하니까 부호 모듈이라고 부르는건 어떻나요?
감사합니다 :D '부호'라는 이름은 리터럴로 쓸 수 없어서 안 좋을 것 같습니다. 현재 가칭은 'ㅂ ㄱ'입니다. ㅂ과 ㄱ의 관계는 패키지와 서브모듈의 관계입니다만, 현재 만든 내장모듈이 변환모듈 하나밖에 없기 때문에, 패키지를 두지 않아도 무방하긴 합니다.
패키지의 이름은 평범한 한글의 ㅍ에서 따온 ㅂ이 좋을 것 같네요. 서브 모듈의 이름은 변환 모듈의 ㅂ에서 따와 ㅂ, 또는 인코딩에서 따와 ㅇ으로 하는게 어떨까 싶습니다. 아, 그리고 문자열의 x번째 요소에 접근하는 동작은 여전히 구현체에 따라 달라질 수 있는건가요?
'ㅂ ㅂ'이 괜찮은 것 같습니다. 이 이름으로 하겠습니다.
@kmc7468 문자열은 문자 단위로 접근합니다. 저는 유니코드 문자를 생각하고는 있지만, 어차피 바이트열로 바꿀 때 인코딩을 지정하도록 하는만큼, 문자열을 구현하는 방식은 어떻게 하더라도 괜찮을 것 같습니다.
가령 내부적으로 CP949를 쓴다면, 한 문자가 1바이트 또는 2바이트를 차지하겠지만, 인덱스로 접근할 때는 내부 구현과 무관하게 (바이트 단위가 아니라) 문자 단위로 접근해야 합니다.
이때 1개의 문자라는 것은 Codepoint를 의미하나요, Grapheme Cluster를 의미하나요? 전자로 하는 것이 처리할 때 더 편리할 것 같습니다.
@kmc7468 네, 코드포인트입니다.
안녕하세요. 평범한 한글을 처음 접했을 때의 버전이 v0.2였는데, 벌써 v0.5까지 개발돼 많은 기능들이 추가되었네요. 언어 스펙을 읽어보던 중 문자열을 생성하는 방법이 보이지 않아 오래간만에 이슈 남깁니다.
현재 스펙상 문자열을 만들거나 얻는 방법은 실수를 문자열로 변환하거나 사용자로부터 입력받는 방법밖에 없습니다. 문자열과 실수에 대한 목록 사이의 형 변환이 추가된다면 프로그램에서 자유롭게 문자열을 생성할 수 있는 방법이 마련될 수 있을 것 같습니다. 예를 들어 [ 65, 105 ]라는 목록을 문자열로 변환해 "Hi"를 생성하거나, 반대로 "Hi"라는 문자열을 목록으로 변환해 [ 65, 105 ]를 생성할 수 있습니다.
덧붙여서, 문자열의 인코딩을 강제하는 규칙도 언어 스펙에 추가되면 좋을 것 같습니다. 현재 스펙에서는 문자열의 인코딩을 정하고 있지 않아 구현체가 문자열을 어떤 인코딩으로 인코딩 하냐에 따라 같은 문자열이어도 문자열의 x번째 글자에 접근하는 동작이 달라질 수 있다는 문제점이 있습니다.
감사합니다.
+ 주제와는 어긋나지만 두 목록을 합치는 함수를 기본적으로 제공해 주실 계획은 없으신지 궁금합니다.