최근 수정 시각 : 2026-10-01 20:23:19

Uiua/문법



#!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"
#!wiki class="sub-title"
프로그래밍 언어 문법
C(포인터 · 구조체 · 공용체 · size_t) · C++(이름공간 · 클래스 · 특성 · 상수 표현식 · 람다 표현식 · 템플릿/제약조건/메타 프로그래밍 · 코루틴) · C# · Forth · Java · Python(함수 · 모듈) · Kotlin · MATLAB · SQL · PHP · JavaScript(표준 내장 객체, this) · Haskell(모나드) · Uiua · 숨
#!wiki class="sub-title"
마크업 언어 문법
HTML · CSS
#!wiki class="sub-title"
개념과 용어
자료형 · 함수(인라인 함수 · 고차 함수 · 콜백 함수 · 람다식) · 리터럴 · 문자열 · 식별자(예약어) · 네임스페이스 · 조건문 · 반복문 · 비트 연산 · 참조에 의한 호출 · 상속 · 예외 · eval · 호이스팅
#!wiki class="sub-title"
기타
#! · == · === · deprecated · GOTO · NaN · null · undefined · S-표현식 · 배커스-나우르 표기법
}}}}}}
프로그래밍 언어 목록 · 분류 · 문법 · 예제

1. 개요2. 주석3. 실행 방식4. 배열5. 자료형6. 침투성 연산
6.1. 단항 침투성 연산자6.2. 이항 침투성 연산자
7. 배열 연산자
7.1. 단항 배열 연산자7.2. 이항 배열 연산자
8. 스택 조작 연산자9. 수식어10. 아랫첨자11. 선언12. 상수
12.1. 재정의 불가능 상수12.2. 재정의 가능 상수

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 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
1을 인자로 빼고 반환한다.
¬[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
두 인자를 비교해 서로 같으면 1, 다르면 0을 반환한다.
eq로 입력할 수 있다.
  • ≠ not equals
두 인자를 비교해 서로 같으면 0, 다르면 1을 반환한다.
ne, neq로 입력할 수 있다.
  • < less than
두 인자를 비교해 두번째 인자가 첫번째 인자보다 작으면 1을, 크거나 같으면 0을 반환한다.
lt, less로 입력할 수 있다.
  • ≤ less or equal
두 인자를 비교해 두번째 인자가 첫번째 인자보다 작거나 같으면 1을, 크면 0을 반환한다.
le, leq, lte로 입력할 수 있다.
  • \> greater than
두 인자를 비교해 두번째 인자가 첫번째 인자보다 크면 1을, 작거나 같으면 0을 반환한다.
gt, greater로 입력할 수 있다.
  • ≥ greater or equal
두 인자를 비교해 두번째 인자가 첫번째 인자보다 크거나 같으면 1을, 작으면 0을 반환한다.
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(y)], 두번째 인자를 [math(x)]로 둘 때 [math(x+yi)]의 편각을 호도법 기준으로 반환한다.
범위는 [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
인자가 1 이상의 스칼라일 때는 0부터 인자 미만까지의 정수 1차원 배열을 반환한다.
인자가 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
인자를 1차원 배열로 변환한다.
♭ 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
인자를 비트 배열로 인코딩한다. 순서는 LSB가 가장 먼저 온다.
인자는 정수의 배열이어야 하고, 음수인 경우 비트에 ¯가 붙는다.
⋯ [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
인자의 원소들 중 0이 아닌 원소의 인덱스들의 배열을 반환한다.
인자가 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을 반환한다.
= 연산자는 수와 복소수에 대하여 타입이 서로 다르더라도 값이 같으면 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
[math(\dfrac{\pi}{2})]의 값을 가지는 상수이다.
  • π pi
[math(pi)]의 값을 가지는 상수이다.
  • τ tau
[math(2pi)]의 값을 가지는 상수이다.
  • ∞ infinity
가장 큰 수로 처리된다.
0으로 나누는 경우에도 결과값이 ∞이 된다.

12.2. 재정의 가능 상수

아래 상수들은 바인딩으로 덮어씌워질 수 있다.
  • e
자연로그의 밑이다.
  • φ
황금비의 값이다.
  • γ
오일러-마스케로니 상수이다.
[1] 인자를 요구하지 않으므로