Giter Site home page Giter Site logo

dragonteros / unsuspected-hangeul Goto Github PK

View Code? Open in Web Editor NEW
57.0 57.0 0.0 1.33 MB

함수형 난해한 언어 '평범한 한글'의 명세와 구현체입니다.

License: MIT License

Python 78.30% HTML 0.49% JavaScript 1.68% CSS 0.16% TypeScript 19.36%
esoteric-language hangeul unsuspected-hangeul

unsuspected-hangeul's People

Contributors

dependabot[bot] avatar dragonteros avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

unsuspected-hangeul's Issues

문자열 생성에 관하여

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

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

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

감사합니다.

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

재귀 중 출력

0에서 8까지 출력하는 프로그램을 만들어보려 했습니다.

ㄱ [((ㄱㅇㄱ ㅁㅈㅎㄴ ㅈㄹㅎㄴ) (ㄱㅇㄱ ㄷ ㄷㅎㄷ ㄱㅇㅎㄴ) (ㄱㅇㄱ ㄱㄴㄱ ㄴㅎㄷ) ㅎㄷ) ㅎ] ㅎㄴ

일단 8을 출력하기는 하는데, 0에서부터를 출력하는 방법이 막막합니다.

파이썬으로 바꿔 생각하면 지금 코드는

f = lambda x: print(x) if x == 8 else f(x + 1)
f(0)

이건데, 파이썬에서 중간 과정을 출력하기 위해 이런 방법을 생각해냈습니다.

f = lambda x: print(x) if x==8 else f(0 if x==print(x) else x + 1)
f(0)

조금 꼼수죠. 아무튼 0에서 8까지 출력은 잘 합니다.
이걸 평범한 한글로 옮겨봤습니다.

ㄱ [((ㄱㅇㄱ ㅁㅈㅎㄴ ㅈㄹㅎㄴ) (((ㄱ) (ㄱㅇㄱ ㄷ ㄷㅎㄷ) (ㄱ (ㄱㅇㄱ ㅁㅈㅎㄴ ㅈㄹㅎㄴ) ㄴㅎㄷ) ㅎㄷ) ㄱㅇㅎㄴ) (ㄱㅇㄱ ㄱㄴㄱ ㄴㅎㄷ) ㅎㄷ) ㅎ] ㅎㄴ

그런데 8 한번만 출력이 됩니다.

언어 명세상 그렇게 되는 건가요? 아니면 자바스크립트 구현상 오류인가요?

옛한글 처리와 관련하여

안녕하세요. 최근 평범한 한글에 큰 개선이 있었는데, 그 중 하나인 옛한글 처리와 관련하여 질문이 있어 이슈 남깁니다.

  1. 옛한글에는 각자병서자와 합용병서자가 있는데, 각자병서자의 경우에는 예사소리로 처리하면 될 것 같습니다만, 합용병서자의 경우에는 어떻게 처리하는 것이 좋을까요? 겹받침처럼 여러 개의 자음으로 분리하여 처리하면 될까요?

  2. 방점 코드만 단독으로 쓰인 경우에는 어떻게 처리해야 하나요?

옛한글과 관련된 질문은 아니지만 문자열 처리와 관련해 몇가지 질문을 더 드리면,

  1. 변경 사항을 보니 모음은 v0.6부터 더 이상 공백으로 취급되지 않는다고 하였는데, 그렇다면 모음은 어떠한 동작을 하나요?

  2. 옛한글을 지원하게 된다면 필연적으로 현대 한글의 조합형도 처리를 할 수 있게 될 것 같습니다만, 그렇다면 조합형으로 표현된 한글 문자열도 완성형으로 표현된 한글 문자열처럼 정상적으로 처리되어야 하나요?

감사합니다.

평범한 한글의 방향성에 대하여

안녕하세요? 트위터로만 소통하다보니 뭔가 한계가 있어서 이번에는 용기를 내어서 새로운 논점을 열었습니다.

현재 평범한 한글에서는 객체에게 이름을 붙여줄 수 있는 방법이 없습니다. 나중에 객체를 사용하기 위해서는 함수에 인수로 넘기고 ㄱ ㅇㄱ, ㄴ ㅇㄱ 처럼 참조하는 방법이 유일합니다. 이 방법은 작은 프로그램에서는 괜찮지만 프로그램이 커진다면 복잡해져서 읽기가 어려울 듯합니다.

언어 명세를 보면 클래스 등 사용자 자료형과 기타 기능 추가도 생각하고 계신 듯한데요, 그렇다는 건 평범한 한글이 큰 프로그램 작성을 염두에 두셨다는 것인지요?

처음 평범한 한글을 접해을 때는 일상에서 접할 수 있는 작은 문제들을 한글로 써서 풀어내는 언어라고 생각했습니다. 하지만 언어를 공부하다보니 굉장히 독특한 구조를 가지고 있고, 이 구조대로라면 생각보다 큰 규모의 프로그램도 작성할 수 있다고 생각했습니다.

그러려면 객체에 이름을 붙인 다음 필요할 때 이름으로 객체를 꺼내 쓰는 기능이 꼭 필요합니다. 이 기능이 말씀하신 '사요자 클래스'와 관련이 되는 것일까요?

평범한 한글과 굉장히 비슷한 스택 지향 언어인 Forth 에서는 새로운 이름을 지을 수 있는 여러 가지 방법이 마련되어 있습니다.

4 4 *
: SQUARE DUP * ;
4 SQUARE

VARIABLE A
10 CONSTANT B
4 SQUARE A !
A @ B + A !

Haskell에서도 함수 뿐만 아니라 다양한 값에 이름을 붙일 수 있고 이들을 쌓아서 프로그램의 규모를 키울 수 있습니다.

@dragonteros 님이 생각하시는 평범한 한글의 방향성은 어떤 것인가요? 이를 알게 된다면 저도 기능을 건의하거나 논점을 새로 열 때 이것이 기준이 되리라 생각합니다. 아마도 #2 (파일/모듈 불러오기)논점과 맥락이 비슷한 것 같기도 합니다만 조금 더 범위를 키워서 논의해보고 싶습니다.

사용자로부터 입력 받기

안녕하세요. 언어 스펙에 stdin 이나 그 외에 스트림으로부터 입력을 받는 기능이 있으면 좋을 것 같아 이슈를 엽니다. 감사합니다.

함수를 표시할 때 True/False 판단 중 크래시

$ python pbhhg.py 'ㄱ ㄱ ㄷㅎㄷ ㅇㄱ ㅎ'
Traceback (most recent call last):
  File "pbhhg.py", line 336, in <module>
    print(main(sys.argv[1]))
  File "pbhhg.py", line 319, in main
    return str(to_printable(values[0]))
  File "pbhhg.py", line 297, in to_printable
    return decode_bool(value)
  File "pbhhg.py", line 185, in decode_bool
    if f == 0 and a.value == 0:
AttributeError: 'FunCall' object has no attribute 'value'
  1. 레퍼런스 구현이 동적 인자 로드가 있는 함수를 표시할 때 에러가 납니다.
  2. 이 경우는 ㅁ 연산자가 True로 판단하는 게 맞나요, 아니면 일반 함수로 판단하는 게 맞나요?

값을 평가하는 순서 등에 대해서 스펙에서 명확하게 정의해야 할 것 같습니다.

안녕하세요. 우선 구현체 목록에 제 C++ 구현체를 올려주신 것에 대해 감사하다는 말씀을 드리고 싶습니다. 현재 평범한 한글 스펙에는 값을 평가하는 순서에 대해 정의하고 있지 않습니다. JS, Python 레퍼런스 구현체의 경우에는 느긋한 평가를 적용하고 있고, 저의 구현체에서는 일반적인 명령형 언어에서처럼 값을 즉시 평가하는 방식을 적용하고 있습니다. 이렇게 값을 평가하는 순서가 스펙에서 정의되어 있지 않다보니 구현체에 따라 값을 평가하는 방법이 달라지기 마련이고, 이는 같은 코드의 실행 결과가 구현체마다 달라지는 결과를 낳기도 합니다.

제가 확인해 본 사례로는 팩토리얼 예제가 있습니다. 제 구현체에서는 함수를 호출하는 구문의 경우 일반적인 명령형 언어처럼 함수를 호출하기 전에 인수를 첫번째 인수부터 순서대로 평가한 후 함수를 호출하도록 구현되어 있습니다. 이 때문에 팩토리얼 예제를 제 구현체에서 실행하면 스택 오버플로우가 발생하게 되는데, 이는 중괄호 안에 있는 소괄호에 있는 값을 평가하는 과정에서 무한 루프가 발생하기 때문입니다. 그러나 레퍼런스 구현체에서는 이러한 문제가 발생하지 않습니다. 그리고 README에도 적어두셨듯이 입력을 여러 번 받는 경우 어떤 구문을 먼저 실행해야 할 지도 애매하다는 부분도 있습니다.

따라서 값을 평가하는 순서 등에 대해서 스펙에서 명확하게 정의하였으면 하는 요청을 드립니다. 감사합니다.

사용자 정의 자료형 명세(안)

사용자 정의 자료형의 명세에 들어갈 내용들을 제안, 검토하는 이슈입니다

제 제안은 다음과 같습니다.

  • 생성자가 자료형의 이름을 대체..?
  • instanceof 연산 지원
  • 상속은 지원 않고 자바의 interface와 같은 방식으로 다형성 지원
  • 대수적 자료형 지원
  • mutation을 허용하지 않음
  • 메소드와 속성은 별도로 구분하지 않음
  • 메소드 안에서 자신(self)을 다룰 때는 파이썬처럼 0번째 인수를 사용

모듈/패키지 불러오기

안녕하세요..? 고수 여러분들의 도움이 필요합니다ㅜㅜ
제가 PL을 막 들은 가엾은 학부생이라서 기본적인 것 이상으로 나아가는 데 한계를 느끼고 있습니다ㅜㅜ
불러오기도 그 중에 하나인데요..
구문은 아마 기본 제공 함수 5번 (ㅂ; 불러오기) 호출이 될 것 같습니다.

  1. 패키지/모듈 정의
    제가 아는 게 거의 파이썬뿐이라서...
    우선은 파이썬처럼 파일이랑 디렉토리 단위로 패키지/모듈이라고 생각하면 될까 싶은데,
    이게 괜찮은 건가요? 더 나은 방법이 있을까요?

  2. 또 파일 단위로 한다면, 한 파일 안에 여러 객체가 나열되는 경우를 허용하는 게 나을까요?
    만약 그렇게 한다면 아마 모듈을 Closure객체로서 불러와서 여기다 번호로 인덱싱을 하거나
    아니면 여기에 별도의 기본 함수를 배당하거나, 아니면 불러올 때부터 번호를 지정해 그것만 가져오는 방식들이 생각이 납니다. 어느 게 제일 좋을까요? 아니면 다른 방법이 더 있을까요?

  3. 문법
    기본 함수 ㅂ에는 어떤 인수를 넣는 형식이 되는 게 좋을까요?

  4. 행동
    가령 '무슨_모듈 ㅂ ㅎ무슨_숫자'로 모듈을 불러왔다고 하고 잠시 이걸 x라고 이름붙이면, 이것의 사용법은 어떻게 되어야 할까요?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.