Coder Social home page Coder Social logo

otlanguage's Introduction

이모티콘으로 제작하는 프로그래밍 언어

이름 유래
절망하는 자세인 OTL 과 언어라는 뜻인 Language가 합쳐져 만들어진 언어입니다.
OTL + Language

OTLanguage Github 링크

제작자

추진 배경

제작하게 된 계기는 실용성이 존재하는 난해한 프로그래밍 언어면 재미 있을 것 같아 제작하게 되었습니다. 처음은 제미로 시작하였지만 해당 언어 구현에 가능성을 느끼게 되었고 기능 추가 및 수정, 확장등을 진행 중입니다.

파일 확장자

OTLanguage는 .otl, .otlanguage확장자를 사용합니다.

  • 버전 3.1.2 이상부터 .otlanguage 확장자를 허용합니다.

모듈 확장자

확장자는 .otlm를 사용하며 module/operate, module/compulsion, module/alteration

동작 환경

  • MacOS 테스트 환경: MacBook, Apple M1
  • Linux 테스트 환경 : Red Hat
  • Window 개발중...
  • Android 개발중...

Download

다운로드에는 Git으로 부터 코드를 다운로드하기 때문에 원활한 설치를 위해서는 git이 설치 되어 있는지 확인 부탁드립니다. MacOS

curl https://raw.githubusercontent.com/OTLanguage/download/main/mac.sh | sh

Linux

curl https://raw.githubusercontent.com/OTLanguage/download/main/linux.sh | sh

Window 프로토타입 버전 윈도우 설치 파일 다운로드 링크

Android

실행

단, 설치 후 처음으로 실행할때는 실행이 느릴 수 있습니다.

대화식 모드 (셀에서는 한글 입력이 가끔 깨져서 보이기 때문에 복잡한 동작을 구현할때는 스크립트 모드를 권장합니다.)

otl

스크립트 모드

otl [파일경로]

모듈 다운로드

적용 버전 : 3.1.1 형태 : otl install <프로젝트명> 예시

otl install poison

기본적으로 poison과 같은 추가 기능들은 기본적으로 설치되어 있지 않기에 모듈을 따로 다운로드하여 사용할 수 있습니다.

LCS(Line Cleanup System)

LCS(Line Cleanup System)은 OTLanguage에 들어가있는 시스템으로 파일 전체를 간단하게 한번 읽고 실행되기전에 괄호처리 및 사용하지 않는 라인 정리등을 진행하는 시스템입니다.

특히 여러줄로 포현되어 있는 중괄호 문법을 한 줄 단위 역할 원칙에 맞추어 변경해줍니다. 원본 예시

0^10^1 {
	ㅆㅁㅆ 값 출력 = :변수명_
} <= ㅇㅈㅇ 변수명

LCS를 거친후 예제

0^10^1 (test,2,3) <= ㅇㅈㅇ 변수명

해당 특징으로 때문에 <= ㅇㅈㅇ 변수명에서 만약 타입에러가 발생하여도 0^10^1 {에서 에러가 발생하였다고 에러가 출력되게 됩니다.

에러 예시 hello.otl

0^10^1 {
    ㅆㅁㅆ 안녕
} <= ㅇㅁㅇ 변수명

ㅇㅁㅇ 변수명에서 타입에러가 발생하지만 (hello.otl:1), (0^10^1 {)를 에러에서 출력하게 됩니다.


철학&원칙

기본 철학

코드가 깔끔하지 않아도 동작만 되게 하자 예초에 깔끔한 프로그래밍 언어는 아니다.

설계 철학

  1. " 와 ' 도 문자이다.
  2. 난해한 프로그래밍언어로 실용적인 동작을 구현하자
  3. 한글로 프로그래밍을 해보자

원칙

  1. One Line Role Principle - 한 줄 단위 역할 원칙 1줄에 1개의 역할를 가지며, 1줄당 1개의 동작을 가지게 됩니다.

  2. String Non-Tokenization Principle - 문자열 비토큰화 원칙 모든 문자는 문자이므로 " 나 ' 를 사용하지 않습니다.

  3. Cut Off Zone Principle - 공간 단절의 원칙 각 중괄호 공간은 단절 공간으로 각각 별개의 공간이 됩니다.

  4. Replace Oriented Principle - 치환 지향 원칙 치환을 하는 방식으로 값을 사용합니다.

  5. Induction Deduction Principle - 유도 도출 원칙 원하는 결과가 발생하지 않았을때 방법을 바꾸어서 원하는 결과를 불러오는 원칙을 말합니다.


변수

파라미터

OTLanguage에서 파라미터 단위는 []대괄호로 사용됩니다. 단, 파라미터가 1개 일때는 대괄호를 생략하고 공백을 대체 할 수 있습니다.

예시

ㅆㅁㅆ[Hello World]
ㅆㅁㅆ Hello World

위 코드는 같은 동작을 합니다.

변수명

네이밍 컨벤션

OTLanguage에서는 **케밥 케이스**를 사용합니다. ex) 변수명 변수명-정의

명명 규칙

변수명은 숫자, 한글, 영어, 하이픈(-) 으로 이루어진 변수를 정의 할 수 있습니다.

변수명은 숫자로만 구현할 수 없으며, 변수명 가장 앞 글자는 문자이여야 합니다. ex)

변수1 (O) 올바른 예
1변수 (X) 틀린 예

예약어

예약어는 이미 정의된 단어로 변수명으로 사용할 수 없는 단어를 말합니다.

  • 예약어 : ㅅㅇㅅ, ㅇㅇ, ㄴㄴ, ㅇㄴ, , , ㅇ-ㅇ, ㅈㅈㅈ, ㅈㅉㅈ, ㅈㅂㅈ, ㅈㅁㅈ, ㅈㄱㅈ, ㅈㅅㅈ, ㅈㅆㅈ

  • 사용 불가 예시 : ㅇㅅㅇ ㅅㅇㅅ:3.14

  • 참고

예약어는 이미 사용하고 있는 존재하는 단어나 Map정의 단어와 같은 경우 아이템을 추가하는 과정중 ㅈㅁㅈ 키<<<값 과 같은 형태가 Map변수를 정의하는 형태와 일치하여 사용이 불가합니다.
ListSet 정의 단어를 사용할때도 띄어쓰기등을 주의해주어야 합니다.

포함 불가능 단어

계산 및 분석을 진행할때 기준을 애매하게 만들 수 있는 단어들은 변수명에서 사용할 수 없습니다. 포함 불가능한 단어 : ㅇㅇ, ㅇㄴ, ㄴㄴ, , 사용 불가 예시 : ㅇㅅㅇ 변ㅇㄴ수:3.14

변수의 유효 범위

기본적으로 생성되는 변수는 전역 변수로 생성됩니다. 크게 변수는 전역 변수, 클래스 변수, 메소드 변수로 단위가 나뉘게 됩니다.

상위 변수에 접근하기 위해서는 ~를 앞에 붙쳐서 상위 클래스에 접근할 수 있습니다.

ㅇㅁㅇ 변수명:출력1
ㅁㅅㅁ 메소드[] {
	ㅇㅁㅇ 변수명:출력2
    ㅆㅁㅆ :~변수명_
    ㅆㅁㅆ :변수명_
}
메소드[]

출력
출력1
출력2

토큰

치환 지향 원칙에 따라 값 변경은 치환을 통해 원하는 값을 유도하게 되는데 원하는 값을 얻기 위해 원하는 값을 구분을 위해서 토큰을 사용하게 됩니다.

  • 형태 :<반환값을 가지는 문법>_ 토큰은 사용하면 변경된 값이 고정되는데 때문에 $ㅅ$과 같은 반복문에서 사용하면 무한 반복문에 빠질 수 있으므로 사용할때 조심해야합니다.

버전 3.1.3 버전 3.1.3 이후 부터 일부 파라미터에서는 토큰을 생략할 수 있는데 생략하면 토큰 치환 형태보다 계산 속도가 보다 빠르며, 무한 반복문에서도 안전할 수 있습니다.

예시

ㅇㅂㅇ 블린:ㅇㅇ
ㅇㅈㅇ 정수:10
$ㅅ$ 블린 ㄸ 정수 ㅇ>ㅇ 11 {
   ㅆㅁㅆ 안녕
   블린:ㄴㄴ
}

생략가능 파라미터 생략이 가능한 파라미터 값은 숫자형, 블린형 이며 파라미터 입력값이 숫자와 블린형이여야 적용됩니다. 버전 차이로 인해서 미적용이 된 파라미터가 있을 수 있다는 점 참고 바랍니다.

초기값 변수

기본 타입의 변수의 초기값은 반드시 정의해주어야합니다.

  • ㅇㅁㅇ 변수명 (×)
  • ㅇㅁㅇ 변수명:값 (○)

휘발성 변수

특정 횟수많큼 사용하면 사라지는 변수를 말합니다. 변수를 생성 할때 사용할 횟수를 정의 할 수 있습니다. 출시 버전 : 3.1.0 형태 : <변수타입> [횟수]<변수명>:<초기값>

ㅇㅁㅇ [1]변수:안녕
ㅆㅁㅆ :변수_ :변수_

출력
안녕 :변수_

기본값

존재하지 않는 변수일 경우 그대로 출력이 되는데 기본값을 정의해주면 그대로 출력되는 것을 방지 할 수 있습니다. 출시 버전 : 3.1.0 형태 : :<동작>_<기본값>;

ㅆㅁㅆ :변수명_기본값;

출력
기본값

타입

Primitive

출시 버전 : 1.0.0

  • ㅇㅈㅇ 정수형(Integer)
  • ㅇㅉㅇ 쩡수형(Long)
  • ㅇㅂㅇ 블린형(Boolean)
  • ㅇㅁㅇ 문자형(String)
  • ㅇㄱㅇ 글자형(Character)
  • ㅇㅅㅇ 실수형(Float)
  • ㅇㅆㅇ 씰수형(Double)

데이터 표현 범위 정수형: –2,147,483,648 ~ 2,147,483,647 쩡수형: -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 블린형: ㅇㅇ, ㄴㄴ 글자형: \u0000 ~ \uFFFF 실수형: 3.4E–38 ~ 3.4E+38 씰수형: 4.94065645841246544E-324~1.79769313486231570E+308 문자형: -

Set

출시 버전 : 2.0.0 값을 Set의 형태로 가지게 됩니다. 중복 값을 허용하지 않습니다.

데이터 형태 : [값1, 값2] 변수 정의 <타입> <변수명> <타입> <변수명>:[값1, 값2] <타입> <변수명><[값1, 값2]

  • ㄴㅈㄴ 정수형(Set<Integer>)
  • ㄴㅉㄴ 쩡수형(Set<Long>)
  • ㄴㅂㄴ 블린형(Set<Boolean>)
  • ㄴㅁㄴ 문자형(Set<String>)
  • ㄴㄱㄴ 글자형(Set<Character>)
  • ㄴㅅㄴ 실수형(Set<Float>)
  • ㄴㅆㄴ 씰수형(Set<Double>)

ADD

출시 버전 : 2.0.0 Set에 값을 넣을 수 있습니다. 형태 : [변수명]<[값]

ㄴㅈㄴ 변수명
변수명<1
변수명<[2,3]
ㅆㅁㅆ :변수명_

출력
[1, 2, 3]

DELETE

출시 버전 : 2.0.0 Set의 값을 제거할 수 있습니다. 형태 : <변수명>!-<인덱스>

ㄴㅈㄴ 변수명:[1,2,3]
변수명!-1
ㅆㅁㅆ :변수명_

출력
[2, 3]

GET

출시 버전 : 2.0.0 Set의 값을 가져올 수 있습니다. 형태 : :[변수명]>[인덱스]_

ㄴㅈㄴ 변수명:[1,2,3]
ㅆㅁㅆ :변수명>1_

출력
1

ISEMPTY

출시 버전 : 2.0.0 Set이 비어있는지 확인합니다. 형태 : :<변수명>?_

ㄴㅈㄴ 변수명
ㅆㅁㅆ :변수명_
ㅆㅁㅆ :변수명?_
변수명<1
ㅆㅁㅆ :변수명_
ㅆㅁㅆ :변수명?_


출력
[]
ㅇㅇ
[1]
ㄴㄴ

SUM

출시 버전 : 2.0.0 Set의 총합을 구할 수 있습니다. 단, 숫자인 값을 가지는 ㄴㅈㄴ, ㄴㅉㄴ, ㄴㅅㄴ, ㄴㅆㄴ에서만 사용할 수 있습니다. 형태 : :<변수명>+_

ㄴㅈㄴ 변수명:[1,2,3]
ㅆㅁㅆ :변수명+_

출력
6

CLEAR

출시 버전 : 2.0.0 Set값을 전부 삭제할 수 있습니다. 형태 : <변수명>!

ㄴㅈㄴ 변수명:[1,2,3]
ㅆㅁㅆ :변수명_
변수명!
ㅆㅁㅆ :변수명_

출력
[1, 2, 3]
[]

SORT

출시 버전 : 3.1.0 Set를 순서대로 정렬합니다. 형태 : <변수명>&

ㄴㅈㄴ 변수명:[3,1,2]
변수명&
ㅆㅁㅆ :변수명_

출력
[1, 2, 3]

LENGTH

출시 버전 : 3.1.0 Set의 길이를 구하게 됩니다. 형태 : :<변수명>'_

ㄴㅈㄴ 변수명:[1,2,3]
ㅆㅁㅆ :변수명'_

출력
3

CONTAINS

출시 버전 : 3.1.0 Set에 해당 값이 존재하는지 확인합니다. 형태 : :<변수명>?<값>_

ㄴㅈㄴ 변수명:[1,2,3]
ㅆㅁㅆ :변수명?1_
ㅆㅁㅆ :변수명?5_

출력
ㅇㅇ
ㄴㄴ

List

출시 버전 : 2.0.0 값을 List의 형태로 가지게 됩니다. Set과 다르게 중복값을 허용합니다.

데이터 형태 : [값1, 값2] 변수 정의 <타입> <변수명> <타입> <변수명>:[값1, 값2] <타입> <변수명><<[값1, 값2]

  • ㄹㅈㄹ 정수형(List<Integer>)
  • ㄹㅉㄹ 쩡수형(List<Long>)
  • ㄹㅂㄹ 블린형(List<Boolean>)
  • ㄹㅁㄹ 문자형(List<String>)
  • ㄹㄱㄹ 글자형(List<Character>)
  • ㄹㅅㄹ 실수형(List<Float>)
  • ㄹㅆㄹ 씰수형(List<Double>)

ADD

출시 버전 : 2.0.0 List의 값을 추가합니다. 형태 : [변수명]<<[값]

ㄹㅈㄹ 변수명
변수명<<1
변수명<<[2, 3]
ㅆㅁㅆ :변수명_

출력
[1, 2, 3]

DELETE

출시 버전 : 2.0.0 List의 값을 제거합니다. 형태 : <변수명>--<인덱스>

ㄹㅈㄹ 변수명:[1,2,3]
변수명--1
ㅆㅁㅆ :변수명_

출력
[2, 3]

GET

출시 버전 : 2.0.0 특정 List 값을 반환합니다. 형태 : :[변수명]>>[인덱스]_

ㄹㅈㄹ 변수명:[1,2,3]
ㅆㅁㅆ :변수명>>1_

출력
1

ISEMPTY

출시 버전 : 2.0.0 List가 비어있는지 확인합니다. 형태 : :<변수명>??_

ㄹㅈㄹ 변수명
ㅆㅁㅆ :변수명??_
변수명<<1
ㅆㅁㅆ :변수명??_

출력
ㅇㅇ
ㄴㄴ

SUM

출시 버전 : 2.0.0 List의 총합을 반환합니다. 단, 숫자인 값을 가지는 ㄹㅈㄹ, ㄹㅉㄹ, ㄹㅅㄹ, ㄹㅆㄹ에서만 사용할 수 있습니다. 형태 : :<변수명>++_

ㄹㅈㄹ 변수명:[1,2,3]
ㅆㅁㅆ :변수명++_

출력
6

CLEAR

출시 버전 : 2.0.0 List값을 전부 삭제합니다. 형태 : <변수명>!!

ㄹㅈㄹ 변수명:[1,2,3]
ㅆㅁㅆ :변수명_
변수명!!
ㅆㅁㅆ :변수명_

출력
[1, 2, 3]
[]

SORT

출시 버전 : 3.1.0 List값을 정렬합니다. 형태 : <변수명>&&

ㄹㅈㄹ 변수명:[3,2,1]
변수명&&
ㅆㅁㅆ :변수명_

출력
[1, 2, 3]

LENGTH

출시 버전 : 3.1.0 List의 길이를 반환합니다. 형태 : :<변수명>''_

ㄹㅈㄹ 변수명:[1, 2, 3]
ㅆㅁㅆ :변수명''_

출력
3

CONTAINS

출시 버전 : 3.1.0 List에 값이 있는지 확인합니다. 형태 : :<변수명>??<값>_

ㄹㅈㄹ 변수명:[1, 2, 3]
ㅆㅁㅆ :변수명??1_
ㅆㅁㅆ :변수명??5_

출력
ㅇㅇ
ㄴㄴ

Map

출시 버전 : 2.0.0 **키(Key)와 값(Value)**가 한쌍으로 이루어진 타입입니다. 키값은 중복으로 존재하지 않습니다.

데이터 형태 : {키1=값2, 키2=값2} 변수 정의 <타입> <변수명> <타입> <변수명>:{키1=값1, 키2=값2} <타입> <변수명><<<{키1=값1, 키2=값2}

  • ㅈㅈㅈ 정수형(Map<String, Integer>)
  • ㅈㅉㅈ 쩡수형(Map<String, Long>)
  • ㅈㅂㅈ 블린형(Map<String, Boolean>)
  • ㅈㅁㅈ 문자형(Map<String, String>)
  • ㅈㄱㅈ 글자형(Map<String, Character>)
  • ㅈㅅㅈ 실수형(Map<String, Float>)
  • ㅈㅆㅈ 씰수형(Map<String, Double>)

CLEAR

출시 버전 : 2.0.0 Map값을 전부 삭제합니다. 형태 : <변수명>!!!

ㅈㅈㅈ 변수명:{a=1, b=2}
ㅆㅁㅆ :변수명_
변수명!!!
ㅆㅁㅆ :변수명_

출력
{a=1, b=2}
{}

DELETE

출시 버전 : 2.0.0 특정 Map값을 삭제합니다. 형태 : <변수명>!---<키 값>

ㅈㅈㅈ 변수명:{a=1, b=2}
ㅆㅁㅆ :변수명_
변수명!---a
ㅆㅁㅆ :변수명_

출력
{b=2}

ADD

출시 버전 : 2.0.0 Map값을 추가합니다. 형태1 : [변수명]<<<{키=값, 키1=값1, ...} 형태2 : [변수명] 키<<<값(버전 3.1.0)

ㅈㅈㅈ 변수명
변수명<<<{a=1}
변수명 b<<<2
ㅆㅁㅆ :변수명_

출력
{a=1, b=2}

GET

출시 버전 : 2.0.0 Map의 특정 값을 가져옵니다. 형태 : :[변수명]>>>[키]_

ㅈㅈㅈ 변수명:{a=1, b=2}
ㅆㅁㅆ :변수명>>>a_

출력
1

ISEMPTY

출시 버전 : 3.1.0 Map이 비어있는지 확인합니다. 형태 : :<변수명>???_

ㅈㅈㅈ 변수명
ㅆㅁㅆ :변수명???_
변수명 a<<<1
ㅆㅁㅆ :변수명???_

출력
ㅇㅇ
ㄴㄴ

LENGTH

출시 버전 : 3.1.0 Map의 길이를 반환합니다. 형태 : :<변수명>'''_

ㅈㅈㅈ 변수명:{a=1, b=2}
ㅆㅁㅆ :변수명'''_

출력
2

CONTAINS

출시 버전 : 3.1.0 Map에 키값을 기준으로 값이 존재하는지 확인합니다. 형태 : :<변수명>???<키>_

ㅈㅈㅈ 변수명:{a=1, b=2}
ㅆㅁㅆ :변수명???a_
ㅆㅁㅆ :변수명???c_

출력
ㅇㅇ
ㄴㄴ

List

집합

ㅎㅈㅎ

합집합 출시 버전 : 3.1.2 파라미터 갯수 : 2개 형태 : <리스트>~ㅎㅈㅎ[<리스트 변수명>][<리스트>] 목록

  • ㄹㅈㄹ~ㅎㅈㅎ[<리스트 변수명>][<리스트>]
  • ㄹㅉㄹ~ㅎㅈㅎ[<리스트 변수명>][<리스트>]
  • ㄹㅂㄹ~ㅎㅈㅎ[<리스트 변수명>][<리스트>]
  • ㄹㅁㄹ~ㅎㅈㅎ[<리스트 변수명>][<리스트>]
  • ㄹㄱㄹ~ㅎㅈㅎ[<리스트 변수명>][<리스트>]
  • ㄹㅅㄹ~ㅎㅈㅎ[<리스트 변수명>][<리스트>]
  • ㄹㅆㄹ~ㅎㅈㅎ[<리스트 변수명>][<리스트>]
ㄹㅈㄹ 리스트1:[1, 2, 3]
ㄹㅈㄹ 리스트2:[4, 5]
ㄹㅈㄹ~ㅎㅈㅎ[리스트1][리스트2]
ㅆㅁㅆ :리스트1_
ㄹㅈㄹ~ㅎㅈㅎ[리스트1][[6, 7]]
ㅆㅁㅆ :리스트1_

출력
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 6, 7]

ㄱㅈㅎ

교집합 출시 버전 : 3.1.2 파라미터 갯수 : 2개 형태 : <리스트>~ㄱㅈㅎ[<리스트 변수명>][<리스트>] 목록

  • ㄹㅈㄹ~ㄱㅈㅎ[<리스트 변수명>][<리스트>]
  • ㄹㅉㄹ~ㄱㅈㅎ[<리스트 변수명>][<리스트>]
  • ㄹㅂㄹ~ㄱㅈㅎ[<리스트 변수명>][<리스트>]
  • ㄹㅁㄹ~ㄱㅈㅎ[<리스트 변수명>][<리스트>]
  • ㄹㄱㄹ~ㄱㅈㅎ[<리스트 변수명>][<리스트>]
  • ㄹㅅㄹ~ㄱㅈㅎ[<리스트 변수명>][<리스트>]
  • ㄹㅆㄹ~ㄱㅈㅎ[<리스트 변수명>][<리스트>]
ㄹㅈㄹ 리스트1:[1, 2, 3, 4]
ㄹㅈㄹ 리스트2:[4, 5]
ㄹㅈㄹ~ㄱㅈㅎ[리스트1][리스트2]
ㅆㅁㅆ :리스트1_

리스트1:[1, 2, 3, 4]
ㄹㅈㄹ~ㄱㅈㅎ[리스트1][[1, 3]]
ㅆㅁㅆ :리스트1_

출력
[4]
[1, 3]

ㅊㅈㅎ

차집합 출시 버전 : 3.1.2 파라미터 갯수 : 2개 형태 : <리스트>~ㅊㅈㅎ[<리스트 변수명>][<리스트>] 목록

  • ㄹㅈㄹ~ㅊㅈㅎ[<리스트 변수명>][<리스트>]
  • ㄹㅉㄹ~ㅊㅈㅎ[<리스트 변수명>][<리스트>]
  • ㄹㅂㄹ~ㅊㅈㅎ[<리스트 변수명>][<리스트>]
  • ㄹㅁㄹ~ㅊㅈㅎ[<리스트 변수명>][<리스트>]
  • ㄹㄱㄹ~ㅊㅈㅎ[<리스트 변수명>][<리스트>]
  • ㄹㅅㄹ~ㅊㅈㅎ[<리스트 변수명>][<리스트>]
  • ㄹㅆㄹ~ㅊㅈㅎ[<리스트 변수명>][<리스트>]
ㄹㅈㄹ 리스트1:[1, 2, 3, 4]
ㄹㅈㄹ 리스트2:[4, 5]
ㄹㅈㄹ~ㅊㅈㅎ[리스트1][리스트2]
ㅆㅁㅆ :리스트1_

리스트1:[1, 2, 3, 4]
ㄹㅈㄹ~ㅊㅈㅎ[리스트1][[1, 3, 6]]
ㅆㅁㅆ :리스트1_

출력
[1, 2, 3]
[2, 4]

ㅂㅈㅎ

부분집합 출시 버전 : 3.1.2 파라미터 갯수 : 2개 형태 : :<리스트>~ㅂㅈㅎ[<리스트>][<리스트>]_ 목록

  • ㄹㅈㄹ~ㅂㅈㅎ[<리스트>][<리스트>]
  • ㄹㅉㄹ~ㅂㅈㅎ[<리스트>][<리스트>]
  • ㄹㅂㄹ~ㅂㅈㅎ[<리스트>][<리스트>]
  • ㄹㅁㄹ~ㅂㅈㅎ[<리스트>][<리스트>]
  • ㄹㄱㄹ~ㅂㅈㅎ[<리스트>][<리스트>]
  • ㄹㅅㄹ~ㅂㅈㅎ[<리스트>][<리스트>]
  • ㄹㅆㄹ~ㅂㅈㅎ[<리스트>][<리스트>]
ㄹㅈㄹ 리스트1:[1, 2, 3, 4]
ㄹㅈㄹ 리스트2:[1, 3, 4]
ㅆㅁㅆ :ㄹㅈㄹ~ㅂㅈㅎ[리스트1][리스트2]_

리스트1:[1, 2, 3, 4]
ㅆㅁㅆ :ㄹㅈㄹ~ㅂㅈㅎ[리스트1][[1, 3, 6]]_
ㅆㅁㅆ :ㄹㅈㄹ~ㅂㅈㅎ[[1, 6]][[1, 3, 6]]_
ㅆㅁㅆ :ㄹㅈㄹ~ㅂㅈㅎ[[1, 3, 5, 6]][[1, 3, 6]]_

출력
ㅇㅇ
ㄴㄴ
ㄴㄴ
ㅇㅇ

콘솔

출력

출시 버전 : 1.0.0

ㅅㅁㅅ

형태 : ㅅㅁㅅ <출력 내용> 출력 내용을 출력합니다.

코드
ㅅㅁㅅ 안녕
ㅅㅁㅅ 하세요?

출력
안녕하세요?

ㅆㅁㅆ

출시 버전 : 1.0.0 형태 : ㅆㅁㅆ <출력 내용> 개행 문자가 들어간 출력 내용을 출력합니다.

코드
ㅆㅁㅆ 안녕
ㅆㅁㅆ 하세요?

출력
안녕
하세요?

ㅅㅁㅆ

출시 버전 : 3.0.0 형태 : ㅅㅁㅆ <출력 내용> 탭(\t)이 들어간 출력 내용을 출력합니다.

코드
ㅅㅁㅆ 안녕
ㅅㅁㅆ 하세요?

출력
안녕		하세요?

ㅆㅁㅅ

출시 버전 : 3.0.0 형태 : ㅆㅁㅅ <출력 내용> 공백(" ")이 들어간 출력 내용을 출력합니다.

코드
ㅆㅁㅅ 안녕
ㅆㅁㅅ 하세요?

출력
안녕 하세요?

강제 출력

출력 내용을 유지하며 출력합니다. 강제 출력은 우선순위가 최상위이기 때문에 입력한 내용에 영향없이 그대로 출력할 수 있습니다.

!ㅅㅁㅅ!

출시 버전 : 2.0.0 형태 : !ㅅㅁㅅ! <출력 내용> 출력 내용을 수정 없이 출력합니다.

ㅇㅈㅇ 변수명:1234
!ㅅㅁㅅ! :변수명_
!ㅅㅁㅅ! :ㅅㅇㅅ_

출력
:변수명_:ㅅㅇㅅ_

!ㅆㅁㅆ!

출시 버전 : 2.0.0 형태 : !ㅆㅁㅆ! <출력 내용> 개행 문자가 들어간 출력 내용을 수정 없이 출력합니다.

ㅇㅈㅇ 변수명:1234
!ㅆㅁㅆ! :변수명_
!ㅆㅁㅆ! :ㅅㅇㅅ_

출력
:변수명_
:ㅅㅇㅅ_

!ㅅㅁㅆ!

출시 버전 : 3.0.0 형태 : !ㅅㅁㅆ! <출력 내용> 탭(\t)이 들어간 출력 내용을 수정 없이 출력합니다.

ㅇㅈㅇ 변수명:1234
!ㅅㅁㅆ! :변수명_
!ㅅㅁㅆ! :ㅅㅇㅅ_

출력
:변수명_		:ㅅㅇㅅ_

!ㅆㅁㅅ!

출시 버전 : 3.0.0 형태 : !ㅆㅁㅅ! <출력 내용> 공백(" ")이 들어간 출력 내용을 수정 없이 출력합니다.

ㅇㅈㅇ 변수명:1234
!ㅆㅁㅅ! :변수명_
!ㅆㅁㅅ! :ㅅㅇㅅ_

출력
:변수명_ :ㅅㅇㅅ_

입력

ㅅㅇㅅ

출시 버전 : 1.0.0 형태 : :ㅅㅇㅅ_ 사용자로부터 입력을 받을 수 있습니다.

사용 예시

ㅆㅁㅆ :ㅅㅇㅅ_

입력
10
출력
10

논리연산

기호

ㅇㅇ

출시 버전 : 1.0.0 형태 : ㅇㅇ 참(true)를 의미합니다.

ㄴㄴ

출시 버전 : 1.0.0 형태 : ㄴㄴ 거짓(false)를 의미합니다.

ㅇㄴ

출시 버전 : 1.0.0 형태 : ㅇㄴ 반전(not)를 의미합니다.

  • ㅇㄴ ㅇㅇ => ㄴㄴ
  • ㅇㄴ ㄴㄴ => ㅇㅇ

출시 버전 : 1.0.0 형태 : 또는(or)을 의미합니다.

  • ㅇㅇ ㄸ ㅇㅇ => ㅇㅇ
  • ㅇㅇ ㄸ ㄴㄴ => ㅇㅇ
  • ㄴㄴ ㄸ ㄴㄴ => ㄴㄴ

출시 버전 : 1.0.0 형태 : 그리고(and)를 의미합니다.

  • ㅇㅇ ㄲ ㅇㅇ => ㅇㅇ
  • ㅇㅇ ㄲ ㄴㄴ => ㄴㄴ
  • ㄴㄴ ㄲ ㄴㄴ => ㄴㄴ

비교 연산자

ㅇ>ㅇ

출시 버전 : 1.0.0 형태 : ㅇ>ㅇ 보다 클때 ㅇㅇ을 반환

  • 1ㅇ>ㅇ2 => ㄴㄴ
  • 2ㅇ>ㅇ1 => ㅇㅇ

ㅇ<ㅇ

출시 버전 : 1.0.0 형태 : ㅇ<ㅇ 보다 작을때 ㅇㅇ을 반환

  • 1ㅇ<ㅇ2 => ㅇㅇ
  • 2ㅇ<ㅇ1 => ㄴㄴ

ㅇ=ㅇ

출시 버전 : 1.0.0 형태 : ㅇ=ㅇ 값이 같을때 ㅇㅇ을 반환

  • 1ㅇ=ㅇ1 => ㅇㅇ
  • 1ㅇ=ㅇ0 => ㄴㄴ

ㅇ>=ㅇ

출시 버전 : 1.0.0 형태 : ㅇ>=ㅇ 값이 크거나 같을때 ㅇㅇ을 반환

  • 1ㅇ>=ㅇ1 => ㅇㅇ
  • 1ㅇ>=ㅇ2 => ㄴㄴ
  • 2ㅇ>=ㅇ1 => ㅇㅇ

ㅇ<=ㅇ

출시 버전 : 1.0.0 형태 : ㅇ<=ㅇ 값이 작거나 같을때 ㅇㅇ을 반환

  • 1ㅇ<=ㅇ1 => ㅇㅇ
  • 1ㅇ<=ㅇ2 => ㅇㅇ
  • 2ㅇ<=ㅇ1 => ㄴㄴ

숫자

연산자

우선 순위

%, *, /를 먼저 계산한 뒤에 +, -가 계산이 됩니다. 먼저 계산을 하고 싶다면(, )사이에 식을 사용하여 구할 수 있습니다.

ㅇ+ㅇ

출시 버전 : 1.0.0 형태 : ㅇ+ㅇ 덧셈(+)을 의미합니다. 각 값을 더한 값을 구하게 됩니다.

  • 1ㅇ+ㅇ1 => 2

ㅇ-ㅇ

출시 버전 : 1.0.0 형태 : ㅇ-ㅇ 빼기(-)를 의미합니다. 각 값을 뺀 값을 구하게 됩니다.

  • 2ㅇ-ㅇ1 => 1

ㅇ*ㅇ

출시 버전 : 1.0.0 형태 : ㅇ*ㅇ 곱하기(*)를 의미합니다. 각 값을 곱한 값을 구하게 됩니다.

  • 2ㅇ*ㅇ1 => 2

ㅇ/ㅇ

출시 버전 : 1.0.0 형태 : ㅇ/ㅇ 나누기(/)를 의미합니다. 각 값을 나눈 값을 구하게 됩니다.

  • 10ㅇ/ㅇ2 => 5

ㅇ%ㅇ

출시 버전 : 1.0.0 형태 : ㅇ%ㅇ 나머지(%)를 의미합니다. 각 값을 나눈 나머지값을 구하게 됩니다.

  • 10ㅇ%ㅇ3 => 1

ㅇㅁㅇ (문자열)

ㅉㅇㅉ

출시 버전 : 3.1.0 최신 업데이트 버전 : 3.1.2 Join를 의미합니다. 형태 : :ㅇㅁㅇ~ㅉㅇㅉ[값][리스트]_

ㄹㅈㄹ 리스트:[1,2,3,4]
ㅆㅁㅆ :ㅇㅁㅇ~ㅉㅇㅉ[ ][리스트]
ㅆㅁㅆ :ㅇㅁㅇ~ㅉㅇㅉ[,][리스트]

출력
1 2 3 4
1,2,3,4

ㅅㅍㅅ

출시 버전 : 3.1.0 최신 업데이트 버전 : 3.1.2 Split를 의미합니다. 문자열을 조건기준으로 나눕니다. 형태 : :ㅇㅁㅇ~ㅅㅍㅅ[문자열][조건]_

ㅆㅁㅆ :ㅇㅁㅇ~ㅅㅍㅅ[안ㅁ녕ㅁ하ㅁ세ㅁ요][ㅁ]_

출력
[안, 녕, 하, 세, 요]

ㅆㅍㅆ

출시 버전 : 3.1.0 최신 업데이트 버전 : 3.1.2 Split를 의미합니다. 하지만 조건값은 정규식에 의존합니다. 형태 : :ㅇㅁㅇ~ㅆㅍㅆ[문자열][조건]_

ㅆㅁㅆ :ㅇㅁㅇ~ㅆㅍㅆ[안 녕 하 세 요][\s]_

출력
[안, 녕, 하, 세, 요]

CONTAINS

출시 버전 : 3.1.0 최신 업데이트 버전 : 3.1.2 형태 : :ㅇㅁㅇ~?[문자1][문자2]_ 문자1에 문자2가 포함되어 있으면 ㅇㅇ를 반환하고 포함되어있지 않으면 ㄴㄴ를 반환합니다.

ㅆㅁㅆ :ㅇㅁㅇ~?[안녕하세요.][안]_
ㅆㅁㅆ :ㅇㅁㅇ~?[안녕하세요.][ㄴ]_

출력
ㅇㅇ
ㄴㄴ

EQUALS

출시 버전 : 3.1.0 최신 업데이트 버전 : 3.1.2 형태 : :ㅇㅁㅇ~=?[문자1][문자2]_ 문자1과 문자2가 일치하면 ㅇㅇ를 반환하고 일치하지 않으면 ㄴㄴ를 반환합니다.

ㅆㅁㅆ :ㅇㅁㅇ~?[안][안]_
ㅆㅁㅆ :ㅇㅁㅇ~?[안][녕]_

출력
ㅇㅇ
ㄴㄴ

Lower

출시 버전 : 3.2.0 최신 업데이트 버전 : 3.2.0 형태 : ㅇㅁㅇ~ㅅㅁㅅ <값> 문자를 모두 소문자로 만들어줍니다.

ㅆㅁㅆ :ㅇㅁㅇ~ㅅㅁㅅ aA_

출력
aa

Upper

출시 버전 : 3.2.0 최신 업데이트 버전 : 3.2.0 형태 : ㅇㅁㅇ~ㄷㅁㄷ <값> 문자를 모두 대문자로 만들어줍니다.

ㅆㅁㅆ :ㅇㅁㅇ~ㄷㅁㄷ aA_

출력
AA

Index

출시 버전 : 3.2.0 최신 업데이트 버전 : 3.2.0 형태 : ㅇㅁㅇ~ㅇㅊㅇ[<문자열 값>][<찾을 문자>] 문자열 값에서 찾을 문자의 위치를 정수형으로 반환합니다. 만약 존재하지 않으면 -1를 반환합니다.

ㅆㅁㅆ :ㅇㅁㅇ~ㅇㅊㅇ[aaa.aaa.aaa][.]_
ㅆㅁㅆ :ㅇㅁㅇ~ㅇㅊㅇ[aaa.aaa.aaa][!]_

출력
3
-1

LastIndex

출시 버전 : 3.2.0 최신 업데이트 버전 : 3.2.0 형태 : ㅇㅁㅇ~ㅇㅈㅇ[<문자열 값>][<찾을 문자>] 문자열 값에서 찾을 문자의 위치를 뒤에서 부터 찾으며 정수형으로 반환합니다. 만약 존재하지 않으면 -1를 반환합니다.

ㅆㅁㅆ :ㅇㅁㅇ~ㅇㅈㅇ[aaa.aaa.aaa][.]_
ㅆㅁㅆ :ㅇㅁㅇ~ㅇㅈㅇ[aaa.aaa.aaa][!]_

출력
7
-1

SubString

출시 버전 : 3.2.0 최신 업데이트 버전 : 3.2.0 형태1 : ㅇㅁㅇ~ㅋㅌㅋ[<문자열 값>][<위치 값>] 형태2 : ㅇㅁㅇ~ㅋㅌㅋ[<문자열 값>][<위치 값1>][<위치 값2>] 형태1은 위치 값에서 마지막까지 잘라서 출력하고, 형태2 위치 값1부터 위치 값2까지의 값까지를 잘라서 반환합니다.

ㅆㅁㅆ :ㅇㅁㅇ~ㅋㅌㅋ[Hello World][3]_
ㅆㅁㅆ :ㅇㅁㅇ~ㅋㅌㅋ[Hello World][3][6]_

출력
lo World
lo

조건문

?ㅅ?문

출시 버전 : 2.0.0 최신 업데이트 버전 : 3.1.2 형태 : ?ㅅ? <블린형> {...} if문으로 블린형이 ㅇㅇ이면 {...} 내용을 실행하고 ㄴㄴ이면 통과를 합니다.

0^10^1 {
		ㅆㅁㅆ :ㅁ_
}<=ㅇㅈㅇ ㅁ

?ㅈ?문

출시 버전 : 2.1.0 최신 업데이트 버전 : 3.1.2 형태 : ?ㅈ? <블린형> {...} else if문으로 ?ㅈ?앞에는 반드시 ?ㅅ?를 먼저 정의 해주어야 합니다.


?ㅉ?문

출시 버전 : 2.1.0 최신 업데이트 버전 : 3.1.2 형태 : ?ㅉ? <블린형> {...} else문으로 ?ㅈ?앞에는 반드시 ?ㅈ? 또는 ?ㅉ?를 먼저 정의 해주어야 합니다.



반복문

^^문

출시 버전 : 2.0.0 최신 업데이트 버전 : 3.1.2 형태1 : <숫자1>^<숫자2>^<숫자3> {...} <= <타입> <변수명> 형태2 : ^<리스트>^ {...} <= <타입> <변수명> 형태3 : <숫자1>^<숫자2>^<숫자3> {...} 형태4 : ^<리스트>^ {...} for 문으로 형태1, 형태3 에서는 숫자1부터 숫자3 만큼 증가하여 숫자2미만이 될때까지 루프를 돌면서 실행하게 됩니다.

마지막에 <= <타입> <변수명>를 넣어주게 되면 증가하는 값을 정의하여 가져 올수도 있습니다.

형태 3

0^10^1 {
	ㅆㅁㅆ :ㅁ_
}<=ㅇㅈㅇ ㅁ

출력
0
1
2
3
4
5
6
7
8
9

형태 2

^[1, 3, 5]^ {
	ㅆㅁㅆ :ㅁ_
}<=ㅇㅈㅇ ㅁ

출력
1
3
5

$ㅅ$

출시 버전 : 3.1.0 형태 : $ㅅ$ <블린> {...} 최신 업데이트 버전 : 3.1.2 while문으로 블린이 ㅇㅇ일 때 {...}를 동작하며, ㄴㄴ일때 루프를 빠져 나오게 됩니다.

ㅇㅈㅇ 포지션:0
$ㅅ$ ㅇㄴ :포지션_ ㅇ=ㅇ 10 {
	포지션: :포지션_ ㅇ+ㅇ 1
    ㅅㅁㅅ Hello
}

출력
HelloHelloHelloHelloHelloHelloHelloHelloHelloHello

반복문 제어

cut off zone원칙으로 ?ㅅ?안에 반복문 제어문을 사용하여도 ?ㅅ?존 안에서는 반복문 존에 영향이 가지 않으므로 반복문제어문이 가지고 있는 문법을 통해 조건을 맞추게 됩니다.

ㅂㅇㅂ

출시 버전 : 3.1.0 최신 업데이트 버전 : 3.1.2 형태1 : ㅂㅇㅂ 형태2 : <블린>?ㅂㅇㅂ break와 같은 동작으로 해당 라인이 실행 되면 루프문에서 빠져나가게 됩니다.

형태2같이 정의하게 된다면 ㅇㅇ일때는 해당 루프문을 빠져나가지만 ㄴㄴ이라면 빠져나가지 않습니다.

0^10^1 {
	ㄴㄴ?ㅂㅇㅂ
	ㅆㅁㅆ 패스
    ㅇㅇ?ㅂㅇㅂ
}

출력 
패스

ㅋㅇㅋ

출시 버전 : 3.1.0 최신 업데이트 버전 : 3.1.2 형태1 : ㅋㅇㅋ 형태2 : <블린>?ㅋㅇㅋ continue와 같은 동작으로 해당 라인이 실행 되면 다음 루프문으로 넘어가게 됩니다.

형태2같이 정의하게 된다면 ㅇㅇ일때는 해당 루프문을 빠져나가지만 ㄴㄴ이라면 빠져나가지 않습니다.

ㅇㅂㅇ ㅂ:ㄴㄴ
0^10^1 {
	ㅂ::ㅁ_ㅇ>ㅇ5
    :ㅂ_?ㅋㅇㅋ
	ㅆㅁㅆ 패스 :ㅁ_
}<=ㅇㅈㅇ ㅁ

출력
패스 0
패스 1
패스 2
패스 3
패스 4
패스 5

시스템

ㄲㅌㄲ

출시 버전 : 2.1.1 형태 : ㄲㅌㄲ 코드를 강제 종료합니다.

ㄲㅌㄲ

=_=

출시 버전 : 2.1.1 형태 : =_= <정수> (정수 값 / 1000) 초 만큼 멈추게 합니다.

=_= 1000

(1초 정지)


ㅍㅅㅍ

출시 버전 : 3.0.0 형태 : ㅍㅅㅍ <파일 경로> 파일 경로에 있는 코드를 실행합니다.

test/test2.otl

ㅆㅁㅆ :안녕_

main.otl

ㅇㅁㅇ 안녕:테스트
ㅍㅅㅍ test~test2

출력
테스트

메소드

ㅁㅅㅁ

메소드를 정의합니다. 안정화 버전 : 3.1.2 형태 : ㅁㅅㅁ <메소드명><파라미터> {...}

ㅁㅅㅁ 메소드명[] {
	ㅆㅁㅆ 메소드 출력
}

메소드명[]

출력
메소드 출력
ㅁㅅㅁ 메소드명[ㅇㅁㅇ 파라미터] {
	ㅆㅁㅆ 출력 :파라미터_
}

메소드명[값]

출력
출력 값
ㅇㅁㅇ 파라미터:안녕
ㅁㅅㅁ 메소드명[ㅇㅁㅇ 파라미터] {
	ㅆㅁㅆ :~파라미터_
	ㅆㅁㅆ :파라미터_
}

메소드명[하세요.]

출력
안녕
하세요.

클래스

ㅋㅅㅋ

출시 버전 : 3.2.0 최신 업데이트 버전 : 3.2.0 형태 : ㅋㅅㅋ <클래스명><파라미터> {...} 클래스 안에는 메소드를 생성할 수 있으며, 반복적인 동작을 해결할 수 있습니다.

ㅇㅈㅇ 정수:1
ㅋㅅㅋ 클래스명[] {
    ㅇㅈㅇ 정수:2
    ㅆㅁㅆ 클래스 생성됨
    ㅁㅅㅁ 메소드명[] {
        ㅇㅈㅇ 정수:3
        ㅆㅁㅆ :정수_
        ㅆㅁㅆ :~정수_
        ㅆㅁㅆ :~~정수_
    }
}

클래스명[]
클래스명~메소드명[]

출력
클래스 생성됨
3
2
1

기타 정보

개발 환경

  1. Visual Studio Code VSCODE Download Link OTLanguage Marketplace

  2. Vim Vim Download Link

Github 저장소

PersesTitan Github OTLanguage Github

Github 뱃지

HTML

<img src="https://raw.githubusercontent.com/OTLanguage/.github/main/image/OTLanguage-flat.svg"/>
<img src="https://raw.githubusercontent.com/OTLanguage/.github/main/image/OTLanguage-flat-square.svg"/>
<img src="https://raw.githubusercontent.com/OTLanguage/.github/main/image/OTLANGUAGE-for-the-badge.svg"/>
<img src="https://raw.githubusercontent.com/OTLanguage/.github/main/image/OTLanguage-plastic.svg"/>
<img src="https://raw.githubusercontent.com/OTLanguage/.github/main/image/OTLanguage-social.svg"/>

MarkDown

![](https://raw.githubusercontent.com/OTLanguage/.github/main/image/OTLanguage-flat.svg)
![](https://raw.githubusercontent.com/OTLanguage/.github/main/image/OTLanguage-flat-square.svg)
![](https://raw.githubusercontent.com/OTLanguage/.github/main/image/OTLANGUAGE-for-the-badge.svg)
![](https://raw.githubusercontent.com/OTLanguage/.github/main/image/OTLanguage-plastic.svg)
![](https://raw.githubusercontent.com/OTLanguage/.github/main/image/OTLanguage-social.svg)

출력


내용 수정 및 추가 예정 22/11/10 - ver 3.1.1

  • poison 동작 문제 확인
  • 확장자 에러 메세지 표시 문제
  • $ㅅ$ 동작 문제 확인

22/11/14 - ver 3.1.2

  • poison 동작 문제 해결
  • 확장자 에러 메세지 표시 문제 해결
  • $ㅅ$ 동작 문제 확인 해결
  • 메소드 문제 해결
  • 연산 속도 상향과 문법 간편화

22/11/23 - ver 3.2.0

  • install 버전 업
  • ㅇㅁㅇ index 추가
  • ㅇㅁㅇ lastIndex 추가
  • ㅇㅁㅇ subString 추가
  • 숫자 Abs 추가
  • 숫자 Min, Max 추가
  • 클래스 문법 추가
  • LCS (Line Cleanup System) 최적화

22/12/07 - ver x.x.x

  • 윈도우 프로토타입 버전 업로드

otlanguage's People

Contributors

asteriatitan avatar lockbell avatar persestitan avatar

Stargazers

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

Watchers

 avatar  avatar

otlanguage's Issues

Fix

When using an array, using ',' causes the array to be split in an undesirable way.

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.