dragonteros / unsuspected-hangeul

함수형 난해한 언어 '평범한 한글'의 명세와 구현체입니다.
MIT License
56 stars 0 forks source link

문자열 생성에 관하여 #11

Closed kmc7468 closed 5 years ago

kmc7468 commented 5 years ago

안녕하세요. 평범한 한글을 처음 접했을 때의 버전이 v0.2였는데, 벌써 v0.5까지 개발돼 많은 기능들이 추가되었네요. 언어 스펙을 읽어보던 중 문자열을 생성하는 방법이 보이지 않아 오래간만에 이슈 남깁니다.

현재 스펙상 문자열을 만들거나 얻는 방법은 실수를 문자열로 변환하거나 사용자로부터 입력받는 방법밖에 없습니다. 문자열과 실수에 대한 목록 사이의 형 변환이 추가된다면 프로그램에서 자유롭게 문자열을 생성할 수 있는 방법이 마련될 수 있을 것 같습니다. 예를 들어 [ 65, 105 ]라는 목록을 문자열로 변환해 "Hi"를 생성하거나, 반대로 "Hi"라는 문자열을 목록으로 변환해 [ 65, 105 ]를 생성할 수 있습니다.

덧붙여서, 문자열의 인코딩을 강제하는 규칙도 언어 스펙에 추가되면 좋을 것 같습니다. 현재 스펙에서는 문자열의 인코딩을 정하고 있지 않아 구현체가 문자열을 어떤 인코딩으로 인코딩 하냐에 따라 같은 문자열이어도 문자열의 x번째 글자에 접근하는 동작이 달라질 수 있다는 문제점이 있습니다.

감사합니다.

+ 주제와는 어긋나지만 두 목록을 합치는 함수를 기본적으로 제공해 주실 계획은 없으신지 궁금합니다.

andrea9292 commented 5 years ago

개발자 님의 트윗을 보면 문자열에 대해서 매우 재밌는 실험을 하고 계신 듯합니다. 다음 버전에 어떻게 적용될 지는 모르겠지만 벌써부터 기대가 됩니다. ^^

아울러, 두 목록을 더하는 함수는 을 쓰시면 되겠습니다.

ㄴ ㄷ ㄹ ㅁㄹㅎㄹ   ㅁ ㅂ ㅅ ㅁㄹㅎㄹ  ㄷㅎㄷ 

위와 같이하면 [1, 2, 3, 4 ,5, 6] 을 내놓습니다.

kmc7468 commented 5 years ago

아~ 제가 예전에 구현체 개발할 때는 ㄷ이 덧셈과 논리합 기능 밖에 없었어서 ㄷ의 존재를 잊고 있었나 봅니다. 답변 감사합니다!

dragonteros commented 5 years ago

잊지 않고 찾아주셔서 반갑습니다 :) 아마 v0.6은 이번 달 내로 업데이트가 될 것 같으니 많은 기대 해주세요!

문자열 관련해서는 파이썬 모델을 따라 바이트열을 신설해 숫자 <-> 바이트열 <-> 문자열로 변환하게끔 하는 것으로 결정했습니다. 이렇게 하면 언급하신 인덱싱 행동이 명확해지는 장점이 있습니다. 변환하는 기능은 기본제공 모듈 ㅂ ㄱ (가칭)이 맡도록 했고, 그 스펙은 다음과 같이 할 생각입니다.

예를 들어 'Hi'라는 문자열을 생성하려면 다음과 같이 할 수 있게 됩니다.

사족으로, 이 내장모듈의 이름을 뭐로 하는 게 좋을까요?

dhnam commented 5 years ago

@dragonteros 제가 지금껏 본 난해한 프로그래밍 언어 중에서 가장 문자열 지원이 ~복잡한~ 잘 된 언어네요. 내장모듈이 인코딩/디코딩을 담당하니까 부호 모듈이라고 부르는건 어떻나요?

dragonteros commented 5 years ago

감사합니다 :D '부호'라는 이름은 리터럴로 쓸 수 없어서 안 좋을 것 같습니다. 현재 가칭은 'ㅂ ㄱ'입니다. ㅂ과 ㄱ의 관계는 패키지와 서브모듈의 관계입니다만, 현재 만든 내장모듈이 변환모듈 하나밖에 없기 때문에, 패키지를 두지 않아도 무방하긴 합니다.

kmc7468 commented 5 years ago

패키지의 이름은 평범한 한글의 ㅍ에서 따온 ㅂ이 좋을 것 같네요. 서브 모듈의 이름은 변환 모듈의 ㅂ에서 따와 ㅂ, 또는 인코딩에서 따와 ㅇ으로 하는게 어떨까 싶습니다. 아, 그리고 문자열의 x번째 요소에 접근하는 동작은 여전히 구현체에 따라 달라질 수 있는건가요?

dragonteros commented 5 years ago

'ㅂ ㅂ'이 괜찮은 것 같습니다. 이 이름으로 하겠습니다.

@kmc7468 문자열은 문자 단위로 접근합니다. 저는 유니코드 문자를 생각하고는 있지만, 어차피 바이트열로 바꿀 때 인코딩을 지정하도록 하는만큼, 문자열을 구현하는 방식은 어떻게 하더라도 괜찮을 것 같습니다.

가령 내부적으로 CP949를 쓴다면, 한 문자가 1바이트 또는 2바이트를 차지하겠지만, 인덱스로 접근할 때는 내부 구현과 무관하게 (바이트 단위가 아니라) 문자 단위로 접근해야 합니다.

kmc7468 commented 5 years ago

이때 1개의 문자라는 것은 Codepoint를 의미하나요, Grapheme Cluster를 의미하나요? 전자로 하는 것이 처리할 때 더 편리할 것 같습니다.

dragonteros commented 5 years ago

@kmc7468 네, 코드포인트입니다.