#!style
.table > div {
margin: 5px 0;
}
.table td {
border-style: solid none;
}
.sub-title {
margin: 5px;
padding: 3px;
border-radius: 5px;
background: #154c79;
color: #fff;
font-weight: bold;
}
| 프로그래밍 언어 문법 | |
| {{{#!folding [ 펼치기 · 접기 ] {{{#!wiki class="table" | C(포인터 · 구조체 · 공용체 · size_t) · C++(이름공간 · 클래스 · 특성 · 상수 표현식 · 람다 표현식 · 템플릿/제약조건/메타 프로그래밍 · 코루틴) · C# · Forth · Java · Python(함수 · 모듈) · Kotlin · MATLAB · SQL · PHP · JavaScript(표준 내장 객체, this) · Haskell(모나드) · Uiua · 숨 |
HTML · CSS | |
자료형 · 함수(인라인 함수 · 고차 함수 · 콜백 함수 · 람다식) · 리터럴 · 문자열 · 식별자(예약어) · 네임스페이스 · 조건문 · 반복문 · 비트 연산 · 참조에 의한 호출 · 상속 · 예외 · eval · 호이스팅 | |
#! · == · === · deprecated · GOTO · NaN · null · undefined · S-표현식 · 배커스-나우르 표기법 | }}}}}} |
| 프로그래밍 언어 목록 · 분류 · 문법 · 예제 |
1. 개요
이 문서에서는 Uiua의 문법을 설명한다.또한 Uiua 글리프의 이름도 정리한다.
2. 주석
Uiua에서는 # 문자로 주석을 적을 수 있다.⇡₂5 # [2 3 4 5]
+1 # [3 4 5 6]
⊸⊢ # 3 [3 4 5 6]
+ # [6 7 8 9]
3. 실행 방식
Uiua 코드는 오른쪽에서 왼쪽으로, 위쪽에서 아래로 평가되고, 우선순위 규칙은 수식어 하나뿐이다.데이터는 순서대로 스택에 적재되며, 연산자는 스택의 데이터들을 pop하고 반환값을 push한다.
다음 코드를 보자.
+ 2 3
이 코드의 동작을 따라가보면 다음과 같다.3이 스택에 적재된다.
2가 스택에 적재된다.
+ 연산자가 위에서부터 2개의 데이터를 꺼낸다. 따라서 순서는 2, 3이 된다.
+ 연산자는 5를 반환해 스택에 적재한다.
스택에는 5가 남아있다.
2가 스택에 적재된다.
+ 연산자가 위에서부터 2개의 데이터를 꺼낸다. 따라서 순서는 2, 3이 된다.
+ 연산자는 5를 반환해 스택에 적재한다.
스택에는 5가 남아있다.
+× 2 4 6
이 코드에서는 먼저 [math(2 \times 4)]가 실행되어 스택에 8이 적재된다.그리고 [math(8 + 6)]가 실행되어 스택에는 14가 남게 된다.
이러한 특징으로 인해 Uiua는 중위표현식 등을 사용하지 않는다. 연산자 우선순위도 없다.
스택에 대한 연산자의 동작은 후술할 수식어로 다양하게 변경할 수 있다.
4. 배열
Uiua의 모든 값들은 배열이다. 스칼라도 0차원 배열이다.배열을 나타내는 표기법에는 두 가지가 있다.
표준 표기법은 원소를 언더바 _ 로 구분한다.
1_2_3
이는 [1 2 3]과 같다.배열 표기법은 대괄호로 원소를 감싸고 공백으로 구분한다.
[1_2 [3 4]]
배열 표기법은 또한 함수를 넣을 수도 있다.
[+ 1 2 × 2 3]
위의 결과값은 [3 6]이다.배열 내에 들어있는 함수들은 인자가 부족한 경우 아래에서 인자를 끌어당겨온다.
[+×5] 7 3
위의 결과값은 [38]이다.후술할 문자 자료형 배열은 문자열로, 큰따옴표 " 로 감싸서 표기할 수 있다.
"Uiua"
[@U @i @u @a]
5. 자료형
Uiua의 모든 값은 배열이며, 배열은 한 자료형의 데이터만을 가질 수 있다.Uiua의 자료형에는 다음 네 가지가 있다.
- 수(Number)
- 복소수(Complex)
- 문자(Character)
- 박스(Box)
수는 IEEE-754 배정밀도 부동소수점 포맷을 사용하는 자료형이다.
Uiua에는 몇몇 상수들이 정의되어있어 이를 사용할 수 있다.
수 리터럴에 사용할 수 있는 표기법들로 /, e 등이 있다.
또한 음수 부호를 나타낼 때는 -가 아닌 ¯를 사용해야 한다.
[0 ∞ ¯τ/2 4e4 3.2 1/3]
위의 결과값은 [0 ∞ ¯π 40000 3.2 0.333…]이다.복소수는 실수부와 허수부 각각 IEEE-754 배정밀도 부동소수점 포맷을 사용하는 자료형이다.
ℂ 연산자를 통해 표기할 수 있다.
ℂ 5 1
위의 결과값은 1+5i이다.실수부 뒤에 r, 허수부 뒤에 i를 붙여 표기할 수도 있다. 또한 한 쪽만 표기해도 복소수로 처리된다.
[3r4i 2r0i i/2 4i ℂ 5 1 πr]
위의 결과값은 [3+4i 2 0.5i 4i 1+5i π]이다.+ 기호는 Uiua REPL의 printer에 의해 포맷팅되어 출력되는 것이지 수 리터럴의 일부가 아니다.
3+4i
위 코드는 오류를 발생시킨다.6. 침투성 연산
침투성(Pervasive) 연산자는 인자로 배열을 받았을 때 배열 내의 원소들에 대하여 연산을 수행한다.이항 침투성 연산자인 +를 예로 들어보자.
+ 1 [2 3 5 6]
의 결과는 [3 4 6 7]이다.연산이 배열 겉에서만 수행되는 것이 아니라 내부까지 침투하여 수행된다.
배열과 배열을 인자로 받은 이항 침투성 연산자도 배열의 원소들에 대해 각각 연산을 수행한다.
× [5 3 4] [13 5 12]
위의 결과값은 [65 15 48]이다.그러나 서로 차원이 다른 배열끼리는 연산할 수 없다.
× [5 3] [13 5 12]
위 코드는 오류를 발생시킨다.6.1. 단항 침투성 연산자
- ¬ not
¬[0 1 2 3]
위의 결과값은 [1 0 ¯1 ¯2]이다.- ± sign
± [0 42 ¯ 8 4r3i]
위의 결과값은 [0 1 ¯1 0.8+0.6i]이다.문자에 대해서는 대소문자를 구분한다. 대문자면 1, 소문자면 0, 대소문자 구분이 없으면 0을 반환한다.
± "Hello, World!"
위의 결과값은 [1 ¯1 ¯1 ¯1 ¯1 0 0 1 ¯1 ¯1 ¯1 ¯1 0]이다.- ¯ negate
¯ [1 2 ¯3]
위의 결과값은 [¯1 ¯2 3]이다.Uiua에서 음수를 표기할 때는 ¯ 글리프가 사용된다. -는 뺄셈 연산자이다.
문자에 대해서는 대소문자를 반전한다.
¯ "Hello, World!"
위의 결과값은 "hELLO, wORLD!"이다.`로 입력될 수 있다.
- ⨪ reciprocal
⨪ [¯9 2 0 ∞]
위의 결과값은 [¯0.111… 0.5 ∞ 0]이다.- ⌵ absolute value
⌵ [3 ¯4 3r4i]
위의 결과값은 [3 4 5]이다.- √ sqrt
√ [16 2 ¯2]
위의 결과값은 [4 √2 ¯NaN]이다.인자가 음수인 경우 복소수 타입인 경우에만 복소수 결과값을 얻을 수 있다.
√ [2r0i ¯8r6i]
위의 결과값은 [√2 1+3i]이다.- ₑ exponential
ₑ 2
위의 결과값은 7.38905609893065이다.- ∿ sine
∿ [0 η π/6]
의 결과값은 [0 1 0.499…94]이다.- cos
- tan
- sinh
- cosh
- tanh
- ⌊ floor
⌊ [¯1.5 ¯0.5 0.5 1.5]
위의 결과값은 [¯2 ¯1 0 1]이다.- ⌈ ceiling
⌈ [¯1.5 ¯0.5 0.5 1.5]
위의 결과값은 [¯1 ¯0 1 2]이다.- ⁅ round
⁅ [¯1.5 ¯0.7 ¯0.5 ¯0.1 0.1 0.5 0.7 1.5]
위의 결과값은 [¯2 ¯1 ¯1 ¯0 0 1 1 2]이다.6.2. 이항 침투성 연산자
몇몇 이항 침투성 연산자는 비가환이므로 인자의 순서가 중요해진다.연산자는 스택에서 더 위에 있는걸 첫번째 인자로, 더 아래에 있는걸 두번째 인자로 취한다.
헷갈릴 수 있으나, 많은 비가환 연산자는 두번째 인자가 연산을 당하는 형식을 가진다.
- = equals
eq로 입력할 수 있다.
- ≠ not equals
ne, neq로 입력할 수 있다.
- < less than
lt, less로 입력할 수 있다.
- ≤ less or equal
le, leq, lte로 입력할 수 있다.
- \> greater than
gt, greater로 입력할 수 있다.
- ≥ greater or equal
ge, geq, gte로 입력할 수 있다.
- + add
- - substract
- 2 1
위의 결과값은 ¯1이다.- × multiply
mul, mult, *로 입력할 수 있다.
- ÷ divide
÷ 3 15
위의 결과값은 5이다.%로 입력할 수 있다.
- ◿ modulo
결과값은 항상 양수로 반환된다.
◿ 5 ¯8
위의 결과값은 2이다.- ⁿ power
ⁿ 2 3
위의 결과값은 9이다.- ↧ minimum
- ↥ maximum
- ∠ atangent
범위는 [math((-\pi,\pi])]이다.
∠ ¯1 0
위의 결과값은 ¯η이다.- ℂ complex
+×i 3 5
ℂ 3 5
위의 결과값은 모두 5+3i이다.7. 배열 연산자
배열 연산자는 배열을 다루거나 반환하는 연산자들이다.7.1. 단항 배열 연산자
- ⧻ length
⧻5
위의 결과값은 1이다.⧻[]
위의 결과값은 0이다.⧻[1_2_3 4_5_6]
위의 결과값은 2이다.- △ shape
△ [1_2 3_4 5_6]
위의 결과값은 [3 2]이다.△ 5
위의 결과값은 []이다.△ []
위의 결과값은 [0]이다.- ⇡ range
인자가 0 미만의 스칼라일 때는 ¯1부터 인자까지의 정수 1차원 배열을 반환한다.
인자가 1차원 배열일 때는 가장 큰 수에 맞춰서 다차원 배열을 반환한다.
인자는 정수여야 하고, rank가 0 또는 1이어야 한다.
⇡ 0
위의 결과값은 []이다.⇡ ¯3
위의 결과값은 [¯1 ¯2 ¯3]이다.⇡ 5
위의 결과값은 [0 1 2 3 4]이다.⇡ ¯3_5
위의 결과값은 아래와 같다.╭─
╷ ¯1 0 ¯2 0 ¯3 0
╷ ¯1 1 ¯2 1 ¯3 1
¯1 2 ¯2 2 ¯3 2
¯1 3 ¯2 3 ¯3 3
¯1 4 ¯2 4 ¯3 4
╯
- ⊢ first
⊢ [1_2 3_4 5_6]
위의 결과값은 [1 2]이다.- ⊣ last
⊣ [1_2 3_4 5_6]
위의 결과값은 [5 6]이다.- ⇌ reverse
⇌ [1 2 3 9]
위의 결과값은 [9 3 2 1]이다.- ♭ deshape
♭ 5
위의 결과값은 [5]이다.♭ [[1_2 3_4] [5_6 7_8]]
위의 결과값은 [1 2 3 4 5 6 7 8]이다.flat, fla로 입력할 수 있다.
- ¤ fix
¤ 5
위의 결과값은 [5]이다.△¤¤ 1_2_3
위의 결과값은 [1 1 3]이다.- ⋯ bits
인자는 정수의 배열이어야 하고, 음수인 경우 비트에 ¯가 붙는다.
⋯ [0 ¯37 5 31]
위의 결과값은 아래와 같다.╭─
╷ 0 0 0 0 0 0
¯1 ¯0 ¯1 ¯0 ¯0 ¯1
1 0 1 0 0 0
1 1 1 1 1 0
╯
- ⍉ transpose
⍉ [[1_2 3_4] [5_6 7_8]]
위의 결과값은 아래와 같다.╭─
╷ 1 5 3 7
╷ 2 6 4 8
╯
- ⍆ sort
⍆ [3 9 1 8 2 7]
위의 결과값은 [1 2 3 7 8 9]이다.다차원 배열의 경우 사전순 정렬한다.
- ⍏ rise
⍏ 6_2_7_0_¯1_5
위의 결과값은 [4 3 1 5 0 2]이다.4번째 원소인 ¯1이 최소값, 3번째 원소인 0이 그 다음으로 작은 것을 볼 수 있다.
값이 같을 경우 인덱스가 더 작은 것을 먼저 넣는다.
- ⍖ fall
⍏ 6_2_7_0_¯1_5
위의 결과값은 [2 0 5 1 3 4]이다.2번째 원소인 7이 최대값, 0번째 원소인 6이 그 다음으로 큰 것을 볼 수 있다.
값이 같을 경우 인덱스가 더 작은 것을 먼저 넣는다.
- ⊚ where
인자가 1보다 크면 인자의 값만큼 인덱스를 여러번 넣는다.
인자의 원소는 0 또는 자연수여야 한다.
⊚ [0 1 0 1 0 0 0 0 3 1 0]
위의 결과값은 [1 3 8 8 8 9]이다.- ◴ deduplicate
◴ 7_7_8_0_1_2_0
위의 결과값은 [7 8 0 1 2]이다.- ⊛ classify
⊛ "Hello, World!"
위의 결과값은 [0 1 2 2 3 4 5 6 3 7 2 8 9]이다.- ⧆ occurrences
⧆ "aabccdab"
위의 결과값은 [0 1 0 0 1 0 2 1]이다.- □ box
bx로 입력할 수 있다.
7.2. 이항 배열 연산자
- ≍ match
= 연산자는 수와 복소수에 대하여 타입이 서로 다르더라도 값이 같으면 1을 반환했다.
그러나 ≍는 타입까지 정확히 같아야 하기 때문에 0을 반환할 수 있다.
≍ 5 5r
위의 결과값은 0이다.- ⊟ couple
따라서 ⊟ 반환값의 ⧻는 항상 2이다.
- ⊂ join
두 인자가 같은 rank를 가질 경우 첫번째 인자의 끝에 두번째 인자의 시작이 붙는다.
⊂ [1 2] 3_4
위의 결과값은 [1 2 3 4]이다.두 인자의 rank 차이가 1일 경우 단순히 rank가 큰 쪽의 끝으로 rank가 작은 쪽이 들어간다.
⊂ 1 [2 3]
위의 결과값은 [1 2 3]이다.두 인자의 rank 차이가 2보다 클 경우 rank가 더 큰 쪽의 shape에 맞춰지도록 적절히 반복된다.
⊂ 0 [1_2 3_4]
위의 결과값은 아래와 같다.╭─
╷ 0 0
1 2
3 4
╯
- ⊏ select
첫번째 인자가 스칼라인 경우 지시하는 인덱스의 원소를 단순히 반환한다.
⊏ 1 [1_2 3_4]
위의 결과값은 [3 4]이다.첫번째 인자의 rank가 1인 경우 각 원소들이 지시하는 원소들의 배열을 반환한다.
⊏ 2_5 [3 1 4 1 5 9 2 6]
위의 결과값은 [4 9]이다.첫번째 인자의 rank가 1보다 클 경우 각 행들이 따로 선택된다.
⊏ [0_1 1_2 2_3] [2 3 5 7]
위의 결과값은 아래와 같다.╭─
╷ 2 3
3 5
5 7
╯
sel로 입력할 수 있다.
8. 스택 조작 연산자
- ∘ identity
id로 입력할 수 있다.
- ◌ pop
9. 수식어
수식어(Modifier)는 주로 함수를 수식해 동작을 변경하고 흐름을 제어하는데 쓰인다.10. 아랫첨자
쉼표 뒤에 수를 입력하면 아랫첨자를 쓸 수 있다.11. 선언
Uiua에서는 ← 문자로 이름을 바인딩할 수 있다.← 문자는 = 문자로 입력할 수 있다.
언더바 문자와 숫자는 이름에 포함될 수 없다. 단, 아랫첨자로 숫자를 넣을 수는 있다.
이름은 공식적으로 PascalCase를 권장한다. 소문자로 시작하는 이름은 충돌 위험이 있기 때문이다.
X,1 = 4
QuickBrownFox ← 2
+ X,1 QuickBrownFox
결과값은 6이다.Quadratic ← ⊃+-∩¯√-⊙(˙⊸×÷2)⊃⊣⊢÷⊙⊂
Quadratic 1 3 2
함수도 바인딩할 수 있다.D₂₀ ← ⌈×20⚂
D₆ ← (⌈×6⚂)
← 오른쪽의 코드는 평가된 뒤 바인딩된다.위 예시 코드에서 D₂₀은 [math(\left[1,20\right])]에서 랜덤한 함수를 선택하는 함수가 아니다.
인자가 모두 충족[1]되었기에 평가될 수 있고, 평가되어 바인딩되었다.
인자를 요구하지 않는 코드를 바인딩하려면 소괄호로 감싸서 바인딩 해야한다.
12. 상수
12.1. 재정의 불가능 상수
아래 네 상수는 바인딩으로 덮어씌워질 수 없다.- η eta
- π pi
- τ tau
- ∞ infinity
0으로 나누는 경우에도 결과값이 ∞이 된다.
12.2. 재정의 가능 상수
아래 상수들은 바인딩으로 덮어씌워질 수 있다.- e
- φ
- γ
[1] 인자를 요구하지 않으므로