일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- gradle
- Baekjoon
- kotlin
- react
- boj
- Shell
- 개발노트
- JS
- plugin
- 루비
- Godot
- IntelliJ
- rubymine
- Android
- ruby2d
- Java
- Spring
- GitHub
- CPP
- Python
- gnuplot
- C
- ruby
- jetbrains
- OAuth
- maven
- Vane
- error
- OTLanguage
- RaspberryPi
- Today
- Total
PersesTitan(페르) 기술블로그
OTLanguage (문법/정보 총 정리) 본문
![](https://blog.kakaocdn.net/dn/yCSFP/btrUTI4keSu/oy9NtmVigKRAHKcoinAxA1/img.png)
정보
한줄 설명
이모티콘으로 제작하는 난해한 프로그래밍 언어
이름 유례
절망하는 자세인 OTL 과 언어라는 뜻인 Language가 합쳐져 만들어진 언어입니다.
OTL + Language
제작자
추진 배경
제작하게 된 계기는 실용성이 존재하는 난해한 프로그래밍 언어면 재미 있을 것 같아 제작하게 되었습니다.
처음은 제미로 시작하였지만 해당 언어 구현에 가능성을 느끼게 되었고 기능 추가 및 수정, 확장등을 진행 중입니다.
파일 확장자
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 {)를 에러에서 출력하게 됩니다.
![](https://blog.kakaocdn.net/dn/bjcroJ/btrUMJxpc4Z/mapqmuTvuv7r6S7lrvbRYk/img.png)
철학&원칙
기본 철학
코드가 깔끔하지 않아도 동작만 되게 하자예초에 깔끔한 프로그래밍 언어는 아니다.
설계 철학
- " 와 ' 도 문자이다.
- 난해한 프로그래밍언어로 실용적인 동작을 구현하자
- 한글로 프로그래밍을 해보자
원칙
- One Line Role Principle - 한 줄 단위 역할 원칙
1줄에 1개의 역할를 가지며, 1줄당 1개의 동작을 가지게 됩니다. - String Non-Tokenization Principle - 문자열 비토큰화 원칙
모든 문자는 문자이므로 " 나 ' 를 사용하지 않습니다. - Cut Off Zone Principle - 공간 단절의 원칙
각 중괄호 공간은 단절 공간으로 각각 별개의 공간이 됩니다. - Replace Oriented Principle - 치환 지향 원칙
치환을 하는 방식으로 값을 사용합니다. - Induction Deduction Principle - 유도 도출 원칙
원하는 결과가 발생하지 않았을때 방법을 바꾸어서 원하는 결과를 불러오는 원칙을 말합니다.
변수
파라미터
OTLanguage에서 파라미터 단위는 []대괄호로 사용됩니다.
단, 파라미터가 1개 일때는 대괄호를 생략하고 공백을 대체 할 수 있습니다.
예시
ㅆㅁㅆ[Hello World]
ㅆㅁㅆ Hello World
위 코드는 같은 동작을 합니다.
변수명
네이밍 컨벤션
OTLanguage에서는 케밥 케이스를 사용합니다.
ex) 변수명 변수명-정의
명명 규칙
변수명은 숫자, 한글, 영어, 하이픈(-) 으로 이루어진 변수를 정의 할 수 있습니다.
변수명은 숫자로만 구현할 수 없으며, 변수명 가장 앞 글자는 문자이여야 합니다.
ex)
변수1 (O) 올바른 예
1변수 (X) 틀린 예
예약어
예약어는 이미 정의된 단어로 변수명으로 사용할 수 없는 단어를 말합니다.
- 예약어 : ㅅㅇㅅ, ㅇㅇ, ㄴㄴ, ㅇㄴ, ㄸ, ㄲ, ㅇ-ㅇ, ㅈㅈㅈ, ㅈㅉㅈ, ㅈㅂㅈ, ㅈㅁㅈ, ㅈㄱㅈ, ㅈㅅㅈ, ㅈㅆㅈ
- 사용 불가 예시 : ㅇㅅㅇ ㅅㅇㅅ:3.14
- 참고
- 예약어는 이미 사용하고 있는 존재하는 단어나 Map정의 단어와 같은 경우 아이템을 추가하는 과정중 ㅈㅁㅈ 키<<<값 과 같은 형태가 Map변수를 정의하는 형태와 일치하여 사용이 불가합니다.
List 및 Set 정의 단어를 사용할때도 띄어쓰기등을 주의해주어야 합니다.
포함 불가능 단어
계산 및 분석을 진행할때 기준을 애매하게 만들 수 있는 단어들은 변수명에서 사용할 수 없습니다.
포함 불가능한 단어 : ㅇㅇ, ㅇㄴ, ㄴㄴ, ㄸ, ㄲ
사용 불가 예시 : ㅇㅅㅇ 변ㅇㄴ수: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
기타 정보
개발 환경
- Visual Studio Code
VSCODE Download Link
OTLanguage Marketplace - 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
- 윈도우 프로토타입 버전 업로드
'Language > OTLanguage' 카테고리의 다른 글
Parsing (파싱), Parser (파서) 에 대해서 (0) | 2023.01.21 |
---|---|
[OTLanguage][안내] window 프로토타입 업로드 (0) | 2022.12.07 |
[OTLanguage] vscode에서 난해한 프로그래밍언어 작업해보기 (0) | 2022.11.24 |