Giter Club home page Giter Club logo

nuri's Introduction

누리 프로그래밍 언어

누리는 쓰기 쉬운 함수형 한글 프로그래밍 언어입니다.

GitHub Workflow Status GitHub top language GitHub

특징

"안녕, "과 "세상!"을 연결하고 보여주다

누리의 주된 언어 방향성은 함수형 프로그래밍 언어 입니다. 그에 따라 대부분의 언어적 특징은 함수에서 나옵니다.

조사

누리에서 함수의 정의는 다음과 같은 방식으로 합니다.

동사 [ㄱ]을 [ㄴ]으로 나누다: [ㄱ] / [ㄴ]

이 코드를 통해서 "ㄱ"과 "ㄴ" 이라는 인자를 받는 "나누다"라는 함수(동사)를 정의했습니다. 그리고 이 함수를 호출하면 "ㄱ"을 "ㄴ"으로 나눈 값을 반환합니다.

함수의 호출은 다음과 같이 합니다.

105로 나누다

다른 언어로 치면 divide(10, 5) 와 비슷한 코드입니다. 그런데 누리에는 다른 점이 하나가 있는데, 바로 함수를 호출할 때 인수 뒤에 조사를 붙인다는 것입니다. 위 코드의 10을 5로 에서 '을'과 '로'가 조사에 해당합니다.

한국어는 조사의 존재로 인해 문장 내에서 어순을 바꾸어도 의미가 달라지지 않는다는 특성을 갖고 있습니다. 누리는 이를 활용해서, 함수를 호출할 때 인수의 위치를 바꾸어도 조사에 맞는 위치에 인수를 집어넣도록 하는 기능을 넣었습니다. 즉,

105로 나누다 == 510을 나누다 == 2

입니다. 추가적으로 조사는 이름있는 인수(named arguments)와 비슷한 역할을 하여 인수의 의미를 조금 더 명확하게 해준다는 장점 또한 있습니다.

함수의 품사 (동사, 형용사)

누리의 함수는 세 종류로 구분되며, 일반적인 함수, 동사, 형용사가 있습니다.

일반적인 함수는 말 그대로 일반적인 함수입니다.

함수 [목록]의 합계:
  만약 [목록] == {} 이라면 0
  아니라면 [목록]의 첫번째 + ([목록]의 나머지)의 합계

동사는 ~(하)다 의 꼴로 생긴 함수이며, 연쇄 호출을 할 수 있다는 특징이 있습니다.

동사 [ㄱ]을 [ㄴ]으로 나누다: [ㄱ] / [ㄴ]
동사 [ㄱ]과 [ㄴ]을 더하다: [ㄱ] + [ㄴ]

이렇게 나누다 라는 동사와 더하다 라는 동사들을 선언합니다. 그러면 다음과 같이 사용이 가능합니다.

10 5 나누고 출력하다 # 출력: 2
2 8 더하고 5 나누고 출력하다 # 출력: 2

이렇게 동사는 조금 더 "자연어"스러운 코드의 활용이 가능합니다. (10을 5로 나누다)를 보여주다 와 같은 코드보다는 가독성이 좋다는 것을 알 수 있습니다.

형용사는 어떤 값의 특징을 판정하는 함수이고, 동사와 비슷하게 ~다 의 꼴로 생긴 함수입니다.

형용사 [] [] 같다: [] == []

현재는 별다른 활용이 없지만, 근 시일 내에 특정 형용사에 대해 반의어, 유의어를 정의할 수 있는 기능을 추가할 예정입니다.

부분 호출 (Partial Application)

누리는 함수형 프로그래밍 언어의 대표적인 기능인 부분 호출(관점에 따라서는 커링으로도 볼 수 있습니다)을 지원합니다. 즉,

동사 [ㄱ]과 [ㄴ]을 더하다: [ㄱ] + [ㄴ]

와 같은 함수가 정의되어 있으면,

510을 더하다 == 15
10을 더하다 == (인수를 1개 받아서 거기에 10을 더하고 반환하는 함수)

입니다. 응용해보자면 다음과 같은 코드를 작성할 수 있습니다.

{1, 2, 3}에 (2를 더하다)를 각각 적용하다 == {3, 4, 5}

선언형 프로그래밍

누리는 함수형 프로그래밍 언어이자 선언형 프로그래밍 언어입니다. 명령형 프로그래밍 언어(C, Java, Python 등이 해당)는 프로그램이 무엇을 실행해야하는지 컴퓨터에게 지시하는 방식을 사용한다면, 선언형 프로그래밍 언어는 무엇이 무엇인지 정의해 나가면서 프로그래밍을 합니다. 즉, 선언형 프로그래밍 언어는 수학이 함수를 정의하는 방식과 조금 더 유사하다고 볼 수 있습니다.

선언형 프로그래밍 언어는 부수 효과(side effects)를 최대한 피한다는 특징이 있습니다. 이에 따라 누리에는 변수가 없습니다. 오직 상수만 존재합니다. (오해는 하시면 안됩니다! 변수가 없어도 재귀 함수 등을 이용하여 다른 프로그래밍 언어에서 작성할 수 있는 프로그램을 모두 구현할 수 있습니다.)

제가 명령형 패러다임이 아닌 선언형 패러다임을 선택한 이유는, 선언형 프로그래밍이 자연어에 조금 더 적합하기 때문입니다. 우리가 평소에 다른 누군가에게 어떤 개념을 설명할 때 "이런 생각을 해. 그 다음 이런 생각을 해."와 같이 설명을 하진 않습니다. "이것은 이거고, 이거는 이거야"와 같은 방식으로 정의를 해 나가면서 설명을 합니다. 전자가 명령형 프로그래밍이고, 후자가 선언형 프로그래밍입니다.

사용

누리 사용해보기를 참조하세요.

vscode-nuri - @rycont님, @CraftyDragon678님께서 Visual Studio Code에서 사용할 수 있는 누리 문법 하이라이팅 확장팩을 제작해주셨습니다!

문서

누리 0.2.1 문서를 참조하세요.

기여

누리는 아직 완성 단계가 아니며, 정식 릴리즈 단계가 아닙니다. 풀 리퀘스트, 버그 보고 등 모든 형태의 기여를 환영합니다.

라이센스

Copyright (c) 2020 서동휘
누리는 MIT 라이센스로 배포되었습니다.

누리의 로고를 제작해주신 @greenstar1151님께 감사드립니다.

nuri's People

Contributors

craftydragon678 avatar greenstar1151 avatar joonas-yoon avatar kmc7468 avatar suhdonghwi 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  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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

nuri's Issues

구조체 이름과 필드에 영어문법을 지원할 계획이 있으신가요?

간단하게 RGB 출력코드를 만들어봤는데요.

색의 경우 보통 RGB 형태로 사용하는데요.
한글로만 쓰니깐 뭔가 단어가 많이 어색한 느낌이 드는 것 같습니다.
혹시 구조체에 영문 이름도 지원하실 계획이 있는지 궁금하네요.

구조체 : 빨강, 초록, 파랑

상수 [나의색]: (빨강: 255, 초록: 255, 파랑: 30)

함수 [알지비] 거리:
  [알지비] 빨강 * [알지비] 초록 * [알지비] 파랑

([나의색] 거리) 출력하다

I/O 관련 함수들 추가

현재 평가 함수에 IO 모나드 트랜스포머 타입이 포함되어있지 않기 때문에 입출력 연산들을 수행하지 못합니다.

구조체 필드 변경 연산

구조체의 필드 값을 가져올 수 있는 기능은 있지만, 구조체에서 특정 필드 값을 새로 변경해서 새로운 구조체 객체를 얻는 연산은 아직 없습니다. 가독성 측면에서 필요한 기능입니다.

하늘 바이트 파일에 디버깅 정보 포함 요청

누리에서 특정 플래그를 줬을 때 지역 변수나 자유 변수의 이름과 같은 디버깅에 필요한 정보들이 하늘 바이트 파일에 포함될 수 있으면 향후 디버거 개발 등에 유용할 것 같습니다.

에러 메시지 한국어화

현재 파싱 에러 메시지가 megaparsec 라이브러리의 기본인 영어로 나옵니다. megaparsec은 따로 에러 메시지 국제화를 위한 인터페이스를 지원하지 않으며(megaparsec Issue #355), 직접 에러 메시지 객체를 한국어화하는 함수를 처음부터 구현하여야합니다.

그리고 decimal 같은 Lexer 라이브러리 함수도 "decimal"와 같이 영어로 label되어있기 때문에 이것 또한 고쳐야합니다. 이러한 사실들은 처음부터 구현해야하는 부분이 상당히 많다는 것을 암시합니다.

Windows에서 빌드된 바이너리로 실행 시 openFile 에러

OS: Windows 10 64bit (Build 18362)

0.1.0 배포판에 있던 Windows.zip 으로 작업하였습니다.

실행하려고 했던 파일 이름과 내용은 아래와 같습니다.

main.nuri:

꾸러미 "유용한 함수들.nuri"

"안녕?"을 보여주다

EUC-KR 인코딩에 개행은 CRLF으로 저장했습니다.

가이드대로 해봤는데 쉘마다 아래 메시지로 실행이 안되네요.

CMD:

C:\Users\joonas-yoon\Downloads\누리\Windows>chcp 65001
Active code page: 65001

C:\Users\joonas-yoon\Downloads\누리\Windows>nuri.exe main.nuri
nuri.exe: main.nuri: hGetContents: invalid argument (invalid byte sequence)

C:\Users\joonas-yoon\Downloads\누리\Windows>nuri.exe ./main.nuri
nuri.exe: ./main.nuri: hGetContents: invalid argument (invalid byte sequence)

Powershell:

PS C:\Users\joonas-yoon\Downloads\누리\Windows> chcp 65001
Active code page: 65001

PS C:\Users\joonas-yoon\Downloads\누리\Windows> nuri.exe main.nuri
nuri.exe : 'nuri.exe' 용어가 cmdlet, 함수, 스크립트 파일 또는 실행할 수 있는 프로그램 이름으로 인식되지 않습니다. 이름이 정확한지 확인하고 경로가 포함된 경우 경로가 올바른지 검증한 다음
 다시 시도하십시오.
위치 줄:1 문자:1
+ nuri.exe main.nuri
+ ~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (nuri.exe:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException


Suggestion [3,General]: nuri.exe 명령이 현재 위치에 있지만 이 명령을 찾을 수 없습니다. Windows PowerShell은 기본적으로  현재 위치에서 명령을 로드하지 않습니다. 이 명령을 신뢰하는 경우 대신 ".\nuri.exe"을(를) 입력하십시오. 자세한 내용은 "get-help about_Command_Precedence"를 참조하십시오.

PS C:\Users\joonas-yoon\Downloads\누리\Windows> .\nuri.exe main.nuri
nuri.exe: main.nuri: hGetContents: invalid argument (invalid byte sequence)

Git Bash (MinGW64):

joonas-yoon@desktop MINGW64 ~/Downloads/누리/Windows
$ ./nuri.exe main.nuri
nuri.exe: .\ .nuri: openFile: does not exist (No such file or directory)

추가로 설치해야할 의존성이 있나요?

유용한 함수들 꾸러미 목록으로 보여주다 함수 에러

이전 커밋(790fa54)에서 함수 출력하다의 이름이 보여주다로 바뀌었는데,
"유용한 함수들"에 있는 목록으로 보여주다 함수에서 ~를 출력하다함수를 사용합니다.

또 쉼표는 같은줄에 보여주는 게 깔끔할 것 같습니다

그래서 아래 처럼 수정이 필요해 보입니다.

# 목록의 원소를 콤마로 나누어서 출력합니다.
동사 [목록]을 목록으로 보여주다:
  만약 [목록] == {} 이라면 없음
  아니라면 만약 [목록]의 나머지 == {} 이라면 ([목록]의 첫번째)를 보여주다
  아니라면 순서대로
    ([목록]의 첫번째)를 같은줄에 보여주다
    ", "를 같은줄에 문자열로 보여주다
    ([목록]의 나머지)를 목록으로 보여주다

또한 문법 문서와 README.md에 함수 출력하다를 사용하는데 헷갈릴 수 있어서 보여주다로 바꾸어야할 것 같습니다.

모듈 기능 추가

현재 꾸러미 라는 기능이 있긴 하지만, 그냥 파일 내용을 가져와서 파싱하는 정도이고 모듈로써의 기능은 하지 못하고 있습니다. 정식적인 모듈 기능의 도입이 필요한 것 같습니다.

대화형 입력 기능

누리 놀이터도 있지만 대화형 입력 기능이 있으면 좋겠습니다.

❯ ./haneul
> 꾸러미 "유용한 함수들.nuri"
> "안녕, "과 "세상!"을 연결하고 문자열로 보여주다
안녕, 세상!

REPL 상태 관리에 State 모나드 사용

REPL의 프롬프트, 심볼 테이블 등이 현재 repl 함수의 인수로 전달되는 방식으로 관리되고 있습니다. 확장성을 높이기 위해서 이 방식을 State 모나드를 활용한 방식으로 변경하여야합니다.

품사 체커 추가

현재 함수 연쇄 호출 활용은, 동사로 선언되지 않아도 함수의 이름이 ~다로 끝나기만 하면 가능합니다. 극단적인 예시이긴 하지만 함수 바다를 선언해도 바고라는 활용이 된다는 뜻입니다. 이를 방지하기 위해서 다른 언어의 type checker에 해당하는 품사 체커를 만들 필요성이 있습니다.

C-style 함수 호출 인자 배정 방식

https://github.com/suhdonghwi/nuri/blob/master/docs/grammar.md#c-style-%ED%95%A8%EC%88%98-%ED%98%B8%EC%B6%9C

C-style 함수 호출 방식과 관련한 문서에서는 가장 앞에 있는 인자부터 배정이 된다고 하지만, 아래 함수로 테스트 할 경우, 1 2 3 4가 아닌 4 3 2 1이 출력됩니다.

함수 [ㄱ]과 [ㄴ]의 [ㄷ]에 [ㄹ]을 테스트하다:
  순서대로
    [ㄱ]을 보여주다
    [ㄴ]을 보여주다
    [ㄷ]을 보여주다
    [ㄹ]을 보여주다

테스트하다(1, 2, 3, 4)

타입 다양화

현재 Val의 타입에 정수와 함수만 존재합니다. 테스트의 간단화를 위해서인데, 실수, 리스트, 튜플 등 언어의 실 사용에 필요한 타입들을 추가하여야합니다.

함수 전방 선언 문법이 없음

지역 함수끼리의 상호 재귀 등을 구현하려면 전방 선언 (forward declaration) 문법이 필요합니다.

예시 :

함수 테스트하다:
    함수 짝수인지 보다, 홀수인지 보다 # 이 부분

    함수 [수]가 짝수인지 보다:
		만약 [수] == 0 이라면 참
		아니라면 ([수] - 1)이 홀수인지 보다

    함수 [수]가 홀수인지 보다:
        만약 [수] == 1 이라면 참
        아니라면 ([수] - 1)이 짝수인지 보다
    
    [짝수인지 보다]

어미 추가 제안

안녕하세요? 평소에 있으면 좋겠다고 생각하던 컨셉의 언어라 무척 반갑습니다.

제가 제안하고자 하는 것은 현재 지원되는 두 어미 '-다', '-고'에 더해 '-기'와 '-다면'을 추가하는 것입니다. 이들은 '-고'와 마찬가지로 기본형에서 '다'만 제거하고 바로 붙이는 어미라는 점이 같아 다른 유형의 어미에 비해 구현이 용이할 것이라 생각합니다.

  1. '-기'를 제안하는 이유
    {1, 2, 3, 4}에 (2를 곱하다)를 각각_적용하다와 같이 함수를 다른 함수의 인수로 넘겨주는 경우 기본형 '-다'를 쓰는 것보다 {1, 2, 3, 4}에 (2를 곱하기)를 각각_적용하다와 같이 '-기'를 붙이면 더 자연스러워지는 이점이 있습니다. 행동은 '-다'와 동일하게 하여 문법적 설탕으로 제공하면 될 것으로 생각합니다.

  2. '-다면'을 제안하는 이유
    만약 [목록]이 비어있다 이라면과 같이 형용사를 조건으로 쓸 때 만약 [목록]이 비어있다면 혹은 구현상 문제가 있다면 만약 ([목록]이 비어있다)면의 꼴이 더 자연스럽다는 이점이 있습니다. 후자의 경우 '이라면'과 같은 키워드로 볼 수 있을 것 같습니다.

감사합니다.

보여주다 -> 보여준다

연결하다 -> 연결한다
~와 ~를 더하다 -> ~와 ~를 더한다
~을 보여주다 -> ~을 보여준다
출력하다 -> 출력한다

이런식으로 쓰는게 더 자연스럽게 읽히는데 저런 표현은 혹시 구현하는게 어려울까요?

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.