용어집
용어집 (Glossary)
Raku 커뮤니티와 문서에서 자주 등장하는 용어들이 많아요. "6model이 뭐지?", "TIMTOWTDI가 뭐지?" 같은 궁금증이 들 때, 이 용어집이 Raku 세상의 어휘를 정리해 주는 입구가 돼요. 기술 용어부터 IRC 속어까지, 하나씩 정의가 붙어 있어요.
본문
6model
6model은 MoarVM에서 사용되며, 객체 시스템을 만드는 데 쓰이는 원시 요소들을 제공해요. Jonathan Worthington의 이 프레젠테이션에 설명되어 있고, MoarVM에 이렇게 구현돼 있어요.
Abstract class (추상 클래스)
컴퓨터 과학의 일반 용어 "abstract class"는 클래스의 인터페이스 또는 API를 정의해요. Raku에서는 이것이 스터빙된(stubbed) 메서드를 가진 roles를 사용해 구현돼요.
Advent calendar
Raku 맥락에서, 12월 1일부터 25일까지 매일 하나씩 게시되는 연례 블로그 포스트 모음이에요. https://raku-advent.blog 에서 찾을 수 있어요.
Adverb
일반적으로 adverb는 함수에 대한 이름 인자(named argument)예요. adverb를 편리한 곳에 끼워 넣을 수 있게 해 주는 몇 가지 특별한 문법 형태도 있어요.
adverb는 보통 콜론 쌍 표기(colon pair notation)로 표현돼요. 그래서 콜론 쌍 표기는 adverbial pair 형태로도 알려져 있어요.
콜론을 adverb와 같은 의미로 쓰는 다른 형태들은 adverbial 형태라고 불러요. 하나의 특별한 형태는 정수 값으로 시작하고, 그다음에 (키를 위한) 이름이 나와요.
Colon pair와 colon list도 참고하세요.
Adverbial pair
pair notation의 일반화된 형태예요. 모두 콜론으로 시작해요. 다음 예제에서 볼 수 있듯이요.
| adverbial pair | pair notation |
|---|---|
| :foo |
foo => |
| :foo('bar') | foo => 'bar' |
| :foo(42) | foo => 42 |
| :42foo | foo => 42 |
| :foo | foo => True |
| :!foo | foo => False |
| :$foo | foo => $foo |
첫 줄의 꺾쇠 <…>와 비슷하게, 평소 의미를 가진 다른 circumfix 연산자로 값을 나타낼 수 있어요. 예: 배열용 :foo[…], 해시나 심지어 Block용 :foo{…}. 두 번째와 세 번째 줄처럼 괄호를 쓰면, 인용 구성체와 정규식을 포함해 거의 모든 구성을 안에 쓸 수 있어요.
Adverb와 Colon pair and colon list 섹션도 참고하세요.
Anonymous (익명)
이름으로 호출할 수 없는 서브루틴, 메서드 또는 서브메서드를 익명(anonymous) 이라고 불러요.
이름을 가질 수는 있지만 그 이름으로 호출할 수는 없다는 점에 유의하세요.
API
Application Programming Interface. 이상적으로는 시스템이나 라이브러리를 사용하는 사람이 API만 알면 사용할 수 있어야 해요. 내부나 구현 세부 사항에 대해 반드시 알 필요는 없어요.
abstract class도 참고하세요.
Apocalypse
원래 TimToady가 쓴 문서로, Perl 커뮤니티에서 나온 초기 RFC들의 물결을 처리한 문서예요. 이제는 참고용 역사 문서로만 남아 있어요. Exegesis와 Synopsis도 참고하세요.
Arity
연산자, 서브루틴, 메서드 또는 호출 가능 블록이 기대하는 Positional 피연산자(operand)의 개수예요.
Callable의 arity는 multi-dispatch의 주요 선택자 중 하나예요. 필수 이름 인자(예: (:$foo!))가 arity로 계산된다는 점에 유의하세요.
ASCII operator
비-ASCII 유니코드 연산자나 심볼의 ASCII 변형이에요. 예를 들어 (elem)은 집합론에서 온 ∈("이것이 저 집합의 요소인가?") 연산자에 대응해요. ASCII 연산자는 사람들이 아직 유니코드 입력을 모른다는 문제의 해결책이에요. 문화적으로 우리는 유니코드 심볼을 어느 정도 쓰도록 권장하지만, ASCII 변형을 쓰는 걸 비난하지는 않아요. 음, 아주 조금은 비난할지도...?
Autothreading
Junction을 Any 타입이나 그 하위 타입(예: 어떤 Cool)의 파라미터를 기대하는 서브루틴에 전달하면 autothreading이 일어나요. 그러면 그 호출은 junction의 각 값에 대해 실행돼요. 이 호출들의 결과는 원래 junction과 같은 타입의 새 junction으로 조합돼요.
여기서 f()는 파라미터 하나를 가진 sub이고, 명시적 타입이 없으므로 암묵적으로 Any로 타입이 지정돼요. Junction 인자는 f(1|2|3) 호출이 내부적으로 f(1)|f(2)|f(3)로 실행되게 하고, 결과 junction은 2|4|6이 돼요. 이것들은 모두 4와 비교돼 False|True|False junction이 돼요. junction 인자를 함수 호출 여러 개로 분리하는 이 과정을 autothreading 이라고 불러요.
결과 junction을 if 같은 Boolean 컨텍스트에서 사용하면, junction 안의 값 중 하나라도 True이면 True인 단일 Boolean으로 축소돼요.
Backtracking (역추적)
Backtracking은 정규식이 매치되는 기본 방식이에요. 엔진은 정규식의 모든 조각이 무엇인가를 매치하게 하기 위해 문자열 문자들을 역방향으로 탐색하는 여러 방법을 모색할 수 있어요. 자세한 내용은 Regexp Backtracking 섹션을 참고하세요.
binder
함수(또는 메서드·블록 같은 다른 호출 가능한 것)에 인자 목록을 전달하면, 그 인자 목록은 시그니처의 파라미터에 바인딩돼요. 그 일을 하는 코드를 binder 라고 불러요.
block
블록은 자신의 어휘 스코프를 가진 코드 객체예요. 이를 통해 포함하는 블록의 다른 변수들을 간섭하지 않고 변수를 정의할 수 있어요.
bytecode
Raku는 #! 형태로 스크립트를 실행하므로(그래서 스크립트라고 부르죠) 해석형 언어처럼 보일 수 있지만, 사실 가상 머신에서 실행되도록 컴파일돼요. 컴파일러(현재는 Rakudo)는 MoarVM 또는 Java Virtual Machine, 즉 현재 지원되는 두 VM에서 실행되는 바이트코드를 생성해요.
Camelia
주로 Raku, The Language를 대표하기 위한 나비 이미지예요.
Colon pair and colon list
콜론 쌍(colon pair)은 Pair 객체를 만들거나 시각적으로 제시하는 데 쓰는 축약 문법이에요. 가장 흔한 두 형태는:
이것은 adverbial pair 형태로도 알려져 있어요.
참고: 콜론 뒤와 균형 잡힌 구분자 앞의 부분이 유효한 식별자가 아니면 다른 의미가 적용되며, 그 모두가 Pair 객체를 만들지는 않아요.
다른 흔한 두 형태는:
콜론 리스트(colon list)는 콜론 쌍만 포함하는 목록을 말해요. 쉼표나 심지어 공백도 필요하지 않아요.
마지막으로 의도한 adverbial pair와 같은 이름의 변수가 있으면 이름을 두 번 지정할 필요 없이, 적절한 시길로 adverb만 지정하면 돼요.
| variable only | same as |
|---|---|
| :$foo | foo => $foo |
| :@bar | bar => @bar |
| :%mapper | mapper => %mapper |
| :&test | test => &test |
Adverb도 참고하세요.
Community
친근한 Raku 커뮤니티에 참여하는 방법은 https://raku.org/community 를 참고하세요.
Compilation unit 또는 compunit
compunit은 단일 단위로 분석되고 컴파일되는 Raku 코드 조각이에요. 일반적으로 이 코드 조각은 단일 파일에 담기지만, EVAL 안의 코드도 compunit으로 간주돼요.
Damian Conway
(많은 것들 중에서도) Exegesis의 원작자예요. https://en.wikipedia.org/wiki/Damian_Conway 도 참고하세요.
decont
"decontainerize"의 줄임말로, 항목을 Scalar 컨테이너에서 꺼내는 것을 의미해요. 종종 그것을 가진 항목에 대해 다른 동작을 얻기 위해 쓰여요.
diffy
operator를 참고. 연산자 결과의 타입이 인자와 충분히 달라서 op=이 거의 의미가 없음을 뜻해요.
ecosystem
모듈 에코시스템은 Raku에 사용 가능한 모든 게시된 모듈로 구성돼요. Raku Land에서 검색할 수 있어요. 다른 기술에 기반한 다른 에코시스템이 존재하지만, 이것은 보통 fez 에코시스템을 가리켜요.
Exegesis
원래 TheDamian이 쓴 문서로, Apocalypse들을 평범한 사람에게 설명하려 했던 문서예요. 이제는 참고용 역사 문서로만 남아 있어요. Synopsis도 참고하세요.
fiddly
메타연산(metaop)을 적용하기엔 너무 복잡함. operator를 참고하세요.
Forward declarations (전방 선언)
기능적 개체(클래스나 루틴)의 스코프 및/또는 타입을, 실제로 코드를 선언하지 않고 "stub" 연산자로 선언하는 것. 코드는 같은 파일의 나중에 선언될 거예요.
이 경우 정규식은 메서드처럼 작동해요. 스코프는 한 번만 선언된다는 점에 유의하세요.
gradual typing (점진적 타입)
변수와 파라미터의 타입을 지정할 필요는 없지만, 지정하면 불가능한 디스패치의 조기 판별과 더 나은 최적화에 도움이 돼요. https://en.wikipedia.org/wiki/Gradual_typing 도 참고하세요.
Handle
핸들은 파일이나 소켓 읽기·쓰기 같은 어떤 입출력 연산에 대한 정보를 저장하는 데 쓰는 데이터 구조예요. Raku는 파일핸들용 기본 클래스로 IO::Handle을, 소켓용으로 IO::Socket을 써요.
Huffmanize
Huffman 코딩과 관련해, "huffmanizing"은 자주 쓰는 것을 더 쉽고, 종종 더 짧게 입력하게 만드는 것이에요. 덜 자주 쓰는 것에는 더 긴 코드를 입력하는 게 덜 귀찮고, 잘 쓰지 않는 기능이 무엇을 하는지 쉽게 떠올리게 하려면 종종 더 길고 더 설명적인 이름이 필요해요.
예를 들어 출력을 찍는 것은 흔한 작업이지만, 네이티브 원자성 안전 정수에서 스레드 안전한 원자 덧셈을 수행하는 것은 훨씬 덜해요. 출력 작업을 "huffmanize"할 필요가 있어서 put이라는 세 글자만 입력하면 되는 거예요. 하지만 드물게 필요한 원자 연산자들은 "huffmanize"할 필요가 없어서 atomic-inc-fetch 같은 더 긴 이름을 입력하는 거예요. put이라는 이름은 다소 모호하지만 자주 쓰이므로 무엇을 하는지 배우기 쉽고, 반면 atomic-inc-fetch는 드물게 쓰이므로 더 설명적인 이름이 그 목적을 더 잘 떠올리게 해 줘요.
iffy
종종 Boolean 값으로 쓰여요. operator를 참고. use 키워드로 만들어져요.
import
모듈의 함수를 현재 네임스페이스에 포함해요.
infix stopper
infix stopper 는 문법이 그 지점에서 infix를 파싱하려 하지 말라고 알려주는 무언가예요. "abc42def" ~~ m|\d+|을 고려해 보세요. 보통 regex의 |는 분기(alternation)로 취급되지만, infix stopper가 현재 regex 종결자와 매치하므로 계속해 그 지점에서 infix를 파싱하려 하지 않아요. 그래서 |는 regex의 끝으로 취급돼요.
Instance (인스턴스)
클래스의 인스턴스(instance) 는 다른 프로그래밍 언어에서 객체(object) 라고도 불려요. 속성을 위한 저장 공간이 있고, 종종 new라는 메서드 호출의 반환값이거나 리터럴이에요.
대부분 타입의 인스턴스는 True로 정의돼요. 예: defined($instance)는 True.
다르게 말하면, 클래스는 메서드와 속성의 청사진을 담고 있고, 인스턴스는 그것을 현실로 옮겨요.
Interface
인터페이스는 추상 클래스예요.
Invocant
호출자(caller), 부르거나 호출하는 쪽. 메서드의 invocant는 그 메서드가 호출되고 있는 객체이거나, 어떤 경우에는 클래스 자체일 수 있어요. caller 대신 Invocant 를 쓰는 이유는, caller가 스코프를 가리키기 때문이에요.
IRC
Internet Relay Chat. Raku 개발자와 사용자는 보통 irc.libera.chat의 #raku 채널에 있어요. 이 채널에는 Raku와 그 코드베이스와 상호작용하고, 지연 메시지를 보내고 다른 좋은 것들을 할 수 있게 해 주는 친근한 봇들도 살아요. 전체 목록은 raku.org의 community 페이지를 참고하세요.
IRC 속어
Raku 관련 IRC 채널에서 자주 쓰이는 용어들:
- ALAP — As Late As Possible
- backlog — IRC 채널 토론 중 당신이 놓친 부분. IRC 클라이언트에서 더 이상 볼 수 없으면 로그를 확인할 수 있어요.
- Bot — IRC 서버가 보기에 일반 사용자처럼 행동하면서 사용자 요청에 답하는 작업 같은 자동 작업을 하나 이상의 IRC 채널에서 수행하는 프로그램. 예시는 raku.org의 IRC 섹션에서 찾을 수 있어요.
- DWIM — Do What I Mean. 프로그래밍 언어 설계자의 모토. DWIM의 반대는 WAT예요.
- flap — 어떤 조건에서는 실패하지만 다른 조건에서는 실패하지 않는 테스트. 이 테스트가 어떤 테스트 실행에서는 통과하고 다른 실행에서는 실패하면 flapping이라고 불러요.
- fossil — 일반적으로 현재의 문서에 있지만 더 이상 사실이 아니며 아직 고치거나 제거로 수정되지 않은 것.
- FSVO — For Some Value Of...
- FTFY — Fixed That For You
- IIRC — If I Read (or Remember) Correctly.
- IMHO — In My Humble Opinion.
- IWBN — It Would Be Nice
- LHF — Low Hanging Fruit. 보통 (상대적으로) 초보자가 수행할 (상대적으로) 단순한 작업의 맥락에서 쓰여요.
- LGTM — Looks Good To Me
- LTA — Less Than Awesome. 보통 실제 오류와 관련이 없거나 설명이 부족한 오류 메시지의 맥락에서 쓰여요.
- Opt — "optimization"의 줄임말. 보통 spesh나 JIT 맥락에서.
- PR — Pull request 참고.
- P5 — Perl 5
- RSN — Real Soon Now.
- TIMTOWTDI — "There's"의 "is"를 명시적으로 포함한 TIMTOWTDI의 대체 형태.
- TMI — Too Much Information.
- TMTOWTDI — "There's More Than One Way To Do It", Perl의 모토.
- UGT — "Universal Greeting Time" — 즉 항상 "아침"이라는 뜻.
- WFM — Works For Me
- WIP — Work In Progress
- WW —
wrong window의 줄임말. IRC에서 누군가 다른 채널이나 개인 메시지를 위한 내용을 어떤 채널에 입력했을 때.
Larry Wall
무엇보다도 Perl의 평생 자비로운 독재자. https://en.wikipedia.org/wiki/Larry_Wall 도 참고.
Lexing
어휘 분석(lexical analysis)을 수행하는 것. 보통 파싱에 앞서는 단계예요.
LHS
left-hand side의 약자로, 보통 표현식의 좌변을 가리켜요. 더 구체적으로는 $lhs = "this would be the right-hand side" 같은 표현식의 좌변을 가리켜요. 이런 표현식의 좌변은 그 값을 수정하므로, 무언가가 LHS처럼 동작한다는 것은 읽고 쓸 수 있다는 뜻이에요. Sides of an equation도 참고하세요.
Literal (리터럴)
리터럴(literal) 은 (종종 내장된) 객체를 직접 나타내는 코드 조각이며 그 객체 자체를 가리켜요.
다른 종류의 리터럴은 syntax 문서에 설명돼 있어요.
lvalue
lvalue(left value) 는 할당 연산자 =의 좌변에 나타날 수 있는 무엇이든 돼요. 할당할 수 있는 무엇이든이죠.
전형적인 lvalue 는 변수, private 속성과 is rw 속성, 변수 목록, lvalue 서브루틴이에요.
lvalue의 예:
| Declaration | lvalue | Comments |
|---|---|---|
| my $x; | $x | |
| my ($a, $b); | ($a, $b) | |
| has $!attribute; | $!attribute | Only inside classes |
| has $.attrib is rw; | $.attrib | |
| sub a is rw { $x }; | a() |
lvalue가 아닌 것의 예:
| 3 | literals |
| constant x = 3; | constants |
| has $.attrib; | attributes; you can only assign to $!attrib |
| sub f { }; f(); | "normal" subs are not writable |
| sub f($x) { $x = 3 }; | error - parameters are read-only by default |
이것들은 보통 rvalue라고 불러요.
Mainline
mainline 은 어떤 종류의 블록에도 속하지 않는 프로그램 텍스트예요.
class, module, grammar 같은 package류 선언자의 mainline도 가질 수 있어요. 이것들은 보통 그 class/module/grammar가 컴파일된 직후(또는 프리컴파일 파일에서 로드될 때) 실행돼요.
Mayspec
"Maybe Specification"의 줄임말. 보통 언어 사양의 기존 테스트를 가리켜요. 화자는 그 테스트가 spectest인지 propspec test인지(즉, 출시된 언어 사양에 포함된 테스트인지, 다음 사양 버전에 제안된 새 테스트인지) 확인하지 않았다는 것을 나타내요.
MoarVM
MoarVM은 Metamodel On A Runtime Virtual Machine의 줄임말이에요. NQP와 그 MOP인 6model을 위해 특별히 설계된 가상 머신이에요. MoarVM의 목적에 대한 문서. MoarVM은 Hotspot VM과 비슷한 점이 있으므로 여기 빠진 항목은 그 용어집을 훑어볼 수 있어요.
Multi-dispatch
같은 이름의 다른 루틴(Method 또는 Sub)을 호출하는 데 쓰는 메커니즘으로, Parameter 프로토타입과 그것이 호출된 인자에 기반해 올바른 것을 선택해요.
선택 과정은 주로 타입과 인자 개수(arity)에 기반하며, 가장 좁고 구체적인 후보가 보통 선언 순서와 무관하게 이겨요. 필수 이름 인자(예: (:$foo!))가 arity로 계산된다는 점에 유의하세요. is default 트레잇은 이 첫 단계의 타이브레이커로 쓸 수 있어요. 또한 메서드나 sub의 선언 순서로 몇 가지 다른 타이브레이커가 평가되는 2차 단계도 있어요.
multi-method
같은 이름으로 여러 후보가 있고 Multi-Dispatch의 대상이 되는 메서드예요.
NFG
Normal Form Grapheme은 Raku가 grapheme을 구현하는 방식이에요. 같은 grapheme을 가진 문자열을 상수 시간에 쉽게 비교할 수 있는 정규 형식을 사용해요. 이에 대한 더 자세한 내용은 Jonathan Worthington의 이 글들과 NFG가 어떻게 동작하는지에 대한 재미있는 설명(이 IRC 로그)에서 볼 수 있어요.
Niecza
.NET 플랫폼을 대상으로 하는 Raku 구현. 더 이상 활발히 유지되지 않아요.
Not Quite Perl
NQP 참고.
NQP
NQP는 Raku 문법의 부분집합을 사용해 서브루틴과 메서드를 쓰기 위한 원시 언어예요. 완전한 프로그래밍 언어로 의도되지 않았고, 기본 VM 프리미티브 너머의 런타임 환경도 제공하지 않아요. (Rakudo 같은) 컴파일러는 보통 NQP로 액션 메서드를 컴파일하는데, 이 액션 메서드는 파스 트리를 그에 상응하는 추상 구문 트리 표현으로 변환해요.
NYI
Not Yet Implemented
opcode
opcode(operation code)는 바이트코드 연산으로, 가상 머신에서 실제로 사용되는 언어의 명령이에요. 보통 사람이 직접 보려는 용도는 아니지만, MoarVM용 이 문서 같은 곳에 특정되어 있어요.
Operator (연산자)
표현식은 연산자와 피연산자로 만들어져요. 더 정확히는 연산자와, 하위 표현식이거나 값일 수 있는 피연산자들로 만들어져요. 연산자는 multi-method에 대한 대체 문법이에요. 그 문법에서는 함수의 인자가 되는 것이 피연산자라고 불러요. 연산자는 범주의 범주(categories of categories)로 분류돼요. 범주는 우선순위, arity를 가지며 fiddly, iffy, diffy일 수 있어요. Raku는 무엇이 연산자인지에 대해 매우 창의적이어서 범주가 많아요. 연산자는 아마도 하위 표현식을 가진 많은 토큰으로 만들어져요. 예를 들어 @a[0]은 postcircumfix 범주에 속하며, 피연산자 @a와 postcircumfix 연산자 [0](여기서 0은 postcircumfix 하위 표현식)로 분해돼요.
<O(I<...>)> 구성은 연산자에 대한 정보를 주며, 그 범주가 제공하는 정보를 완성해요. 아래 %conditional은 범주고, :reducecheck<ternary>는 파스 하위 트리를 후처리하기 위해 .ternary를 호출하도록 지정하며, :pasttype<if>는 파스 하위 트리로부터 AST에서 생성되는 NQP opcode를 지정해요.
Parameter
Parameter는 Sub루틴, Method, Callable 블록의 파라미터를 정의하는 클래스예요. 서브루틴/메서드/호출 가능 블록을 호출할 때 지정하는 인자와는 반대 개념이에요.
Parrot
Raku와 다른 동적 언어를 실행하도록 설계된 가상 머신. 더 이상 유지되지 않아요.
Parse tree (파스 트리)
파스 트리는 문법에 따라 문자열이나 문장의 구조를 나타내요. Raku의 Grammar는 문자열을 성공적으로 매치하면 파스 트리를 출력해요.
PAST
Parrot AST.
Perl
Perl 프로그래밍 언어.
Perl 6
2019년 10월 이전에 Raku를 가리키던 이름.
POD
Plain Ol' Documentation, Raku가 이해하는 문서 형식. 자세한 내용은 여기를 참고하세요.
POV
"Proof Of Viability"의 줄임말. 언어 사양에 포함되려면, 기능의 "실현 가능성 증명" 구현이 적어도 하나의 대부분 준수하는 Raku 컴파일러에 존재해야 해요.
priming
Priming(다른 프로그래밍 언어에서는 부분 함수 적용(partial function application)이라고도 함)은 기존 함수에 일부 인자만 제공해 새 함수를 만드는 행위예요. 예를 들어 인자 하나를 받아 42를 더하는 함수를 만들려면, 덧셈 연산자를 42 단일 인자로 prime할 수 있어요: * + 42. Whatever-priming과 assuming 참고.
property
이 맥락에서, 객체 속성(인스턴스 변수의 값) 또는 유니코드 속성(코드포인트가 그것이 나타내는 개체의 종류, 즉 문자인지 숫자인지 제어 문자 같은 완전히 다른 무엇인지를 프로그램이 식별하게 해 주는 코드포인트 기능)을 가리켜요.
Propspec
"Proposed Specification"의 줄임말. 보통 다음 릴리스에 포함되도록 제안된 언어 사양의 기존 테스트를 가리켜요.
pugs
pugs는 Raku를 위해 쓰여진 최초의 인터프리터/컴파일러 중 하나였어요. Audrey Tang이 Haskell로 작성했어요.
Pull request
GitHub와 GitLab 같은 다른 git 호스트의 기능으로, GitHub 웹 사용자 인터페이스를 사용해 패치를 쉽게 적용되게 해요. 당신의 리포지토리에서 그녀의 리포지토리로 git pull을 해 달라고 누군가에게 요청한다는 뜻이에요. 보통 약자는 PR이에요.
QAST
PAST의 후계자('Q'는 'P' 다음 알파벳).
Rakudo
Rakudo는 MoarVM과 JVM에서 실행되는 Raku 구현의 이름이에요. Rakuda-do의 약자이며, 일본어로 번역하면 "낙타의 길"이에요. 또한 일본어로 "Rakudo"는 "낙원"을 뜻해요.
Reify
영어에서 reify는 "구체적인 것으로 변환하거나 간주하다"는 뜻이에요. Raku에서의 의미도 매우 비슷해요. "무한 목록의 요소" 같은 개념적인 것들이, 그 일부에 대해 연산하려 할 때 재화(reified) 되죠. 일반적으로 reification은 잠재적인 요소(아직 계산되지 않은 지연 목록의 요소든, 아직 추출되지 않은 컨테이너의 요소든)를 실제 값으로 바꾸는 것을 의미해요.
Repository
보통 git인 버전 관리 소프트웨어의 통제 아래 있는 파일시스템으로, 프로젝트·라이브러리·애플리케이션의 소스를 담아요. 예를 들어 이 파일은 GitHub 리포지토리에 있어요. 리포지토리는 파일뿐 아니라 변경 이력도 저장하며, 개발·작성 팀이 이슈나 코드에 대한 코멘트를 통해 상호작용하는 데 쓸 수 있어요.
하지만 Raku 맥락에서 repository는 컴파일 유닛 리포지토리(compilation unit repository) 의 짧은 이름이기도 하고, 모듈을 찾고 로드하며 설치와 프리컴파일을 관리하는 시스템을 구성해요. 연결 목록으로 구조화되어 있으며, 기본 Compunit::Repository::Installation으로 끝나는 리포지토리 체인을 포함해요.
RHS
right-hand side의 약자로, 보통 할당 연산자와 my $bound := $rhs나 my $a = 5; $a //= $rhs 같은 표현식의 우변을 가리켜요. Sides of an equation도 참고하세요.
roast
Raku 사양 테스트로, 여기 살아 있어요: https://github.com/Raku/roast/. 원래 pugs를 위해 개발됐지만 이제 모든 Raku 구현에 도움이 돼요. 왜 roast일까요? repository of all spec tests ("모든 사양 테스트의 저장소")이기 때문이에요.
Roles
Roles, mix-ins, 또는 traits는 인터페이스 및/또는 그 인터페이스의 구현과 그것을 사용하는 인스턴스 변수를 정의하며, 그 인터페이스를 따르는 클래스를 선언할 때 믹스인돼요. 추상 클래스는 실제 구현이 그 Role을 사용하는 클래스로 연기되는 특별한 Roles 예시예요.
Roles는 Raku 객체 시스템의 일부로, role 키워드로 선언되고 does로 클래스 선언에서 사용돼요.
rvalue
할당의 우변에 쓸 수 있는 값. lvalue도 참고하세요.
SAP
"Specification APpendices"의 줄임말. SAP는 구현이 따르기로 선택할 수 있지만 반드시 따를 필요는 없는 선택적 테스트를 포함해요.
동사로 쓸 수 있어요. 무언가를 SAP 한다는 것은 그것을 Specification Appendices에 넣는 거예요.
Semilist
semilist는 1;3;5 같은 세미콜론으로 구분된 목록이에요. 사실 목록의 목록이며, semilist의 각 구성 요소는 특정 차원의 슬라이스예요. @array[1;3;5]는 @array[1][3][5]와 동일해요.
Sigil
sigil은 변수 이름의 첫 문자예요. 각각 Scalar, Array, Hash, Code 변수에 대해 $, @, %, & 중 하나여야 해요. Twigil과 role도 참고하세요. 또한 sigiled 변수는 큰따옴표 문자열에서 변수 보간, 또는 그런 변수로 시작하는 postcircumfix 표현식에 대한 짧은 관례를 허용해요.
Sigilless variable
sigilless 변수는 사실 컨테이너가 아니므로 할당된 값에 대한 별칭(alias)이에요. sigilless 변수(탈출 문자 \ 사용)에 할당하면 그 값을 바꿀 수 없어요.
Spesh
MoarVM 플랫폼의 기능으로, 런타임에 수집한 데이터로 흔히 쓰는 바이트코드 조각을 개선해요. JIT 컴파일러와 매우 비슷한데, 다만 JIT는 보통 기계 코드를 출력하지 바이트코드를 출력하지 않아요.
STD
STD.pm은 Raku를 구현하는 데 사용된 "표준" Raku 문법 정의예요(https://github.com/perl6/std/ 참고). STD.pm은 더 이상 규범(normative) 의미의 "사양"이 아니에요. Raku 구현이 따르는 지침이나 모델에 가깝죠.
Stub
스터브는 구현이 다른 클래스로 연기된 메서드의 이름과 시그니처를 정의해요.
스터브가 있는 클래스는 Abstract 클래스예요.
Symbol
이름을 나타내는 멋진 대체 방식. 보통 OS 레벨이든, 이러한 VM을 대상으로 하는 언어에서 생성된 모듈의 Raku 가상 머신 레벨이든 모듈 연결의 맥락에서 쓰여요. 가져오거나 내보낸 심볼 집합을 심볼 테이블(symbol table)이라고 불러요.
Synopsis
Raku 언어의 현재 사람이 읽을 수 있는 설명. 아직 개발 중이에요. Apocalypse와 Exegesis보다 훨씬 커뮤니티 노력이에요. 언어의 현재 상태는 synopsis가 아니라 그 테스트 스위트인 roast에 반영돼요. synopsis에서는 추측성 자료가 항상 그렇게 표시되지 않고 더 최근 추가 사항이 문서화되지 않았을 수 있기 때문이에요. 아직 구현되지 않은 자료는 더욱 그렇죠.
Syntax analysis
문법 분석 또는 구문 분석은 문자열을 파싱해 파스 트리를 생성하는 것과 동등해요.
Test suite
Raku 테스트 스위트는 roast예요.
TheDamian
원래 Exegeses를 쓴 Damian Conway의 IRC 스크린 이름.
Thunk
즉시 실행되지 않지만 독립적인 스코프가 없는 코드 조각.
Tight and loose precedence
이 맥락에서 tight 또는 tighter는 우선순위 규칙을 말하며 looser의 반대예요. 새 항(term)의 우선순위 규칙은 항상 다른 항과의 관계로 표현돼요. 그래서 is tighter는 그 연산자를 가진 피연산자가 더 느슨한(looser) 연산자의 피연산자보다 먼저 그룹화된다는 뜻이에요. tight 우선순위를 가진 연산자는 다른 것보다 우선해 그룹화되고 일반적으로 대부분보다 더 tight해요. loose는 정확히 반대예요. 그래서 표현식에 사용된 모든 연산자의 정확한 우선순위를 인지하는 게 항상 편리해요.
TimToady
Perl 창시자 Larry Wall의 IRC 스크린 이름. 이름은 TIMTOWTDI를 단어로 발음한 데서 왔어요.
token
이 맥락에서 token은 역추적하지 않는 정규식이에요. 일반적으로 토큰은 lexing 중 소스 프로그램에서 추출돼요.
Truthy and Falsy
값이 Boolean 컨텍스트에서 True로 평가되면 "truthy", False로 평가되면 "falsy"라고 해요.
예를 들어 비어 있지 않은 문자열은 True, 빈 문자열은 False로 간주돼요.
Numeric은 0이 아닐 때 True로 간주돼요.
twine
내장된 포맷팅 코드를 가진 POD 문자열을 담는 데 쓰는 데이터 구조예요. 예를 들어:
출력은 다음과 같아요.
twine은 단순 문자열로 시작해 포맷팅 코드 객체와 단순 문자열을 번갈아 가며 포함하고 단순 문자열로 끝나는 홀수 개 요소의 배열이에요. 포맷팅 코드 객체는 문자열과 intertwine(끼워 감김)돼요. 문자열은 (예제에서 보듯) 비어 있을 수 있어요. 포맷팅 코드가 없는 twine은 단순 문자열 하나를 포함할 거예요.
Type objects (타입 객체)
타입 객체는 타입이나 클래스를 나타내는 데 사용되는 객체예요. 객체 지향 프로그래밍에서 모든 것이 객체이므로 클래스도 객체이고, Mu에서 상속받아요.
Type smiley
타입 스마일리는 타입이 가질 수 있는 접미사로, 그것에 대해 타입체크할 수 있는 값의 정의성(definiteness)을 나타내요. :D는 정의된 값(즉 인스턴스)만 타입체크할 수 있음을, :U는 정의되지 않은 값(즉 타입 객체)만 타입체크할 수 있음을, :_는 정의된 값과 정의되지 않은 값 모두 타입체크할 수 있음을 나타낼 수 있어요. 이것들이 이모티콘처럼 보여서 그런 이름이 붙었어요.
UB
"Undefined Behavior"의 줄임말. 즉 언어 사양이 명시적으로 정의하지 않은 무언가예요.
value (값)
값은 변수 같은 컨테이너에 실제로 담긴 것. lvalue 같은 표현에서 그 특정 컨테이너가 할당될 수 있음을 나타내는 데 쓰여요.
Value type (값 타입)
타입이 불변이고, 그 타입의 어떤 인스턴스든 "같은 값을 가진" 다른 인스턴스와 교체 가능하다면 그 타입을 값 타입(value type) 이라고 해요. 즉 같은 방식으로 구성된 어떤 인스턴스든 말이죠. 값 타입의 인스턴스는 종종 값(value) 이라고 불려요 (하지만 lvalue나 rvalue와 혼동하면 안 돼요).
예를 들어 숫자는 값 타입이에요. 그래서 프로그램의 한 곳에서 리터럴 3으로 구성한 숫자는 어떤 식으로든 바꿀 수 없어요 — 단순히 3 일 뿐이죠 — 그리고 리터럴 3의 나중 사용은 아무 나쁜 결과 없이 메모리의 같은 곳을 안전하게 가리킬 수 있어요.
Numeric과 Stringy 역할을 하는 클래스들은 내장 값 타입의 몇 가지 예시예요.
값 타입은 값 타입의 인스턴스가 불변(즉 그 속성이 구성 후 수정될 수 없음)이고, WHICH 메서드가 같은 값을 가진 인스턴스가 구성될 때마다 같은 것을 반환(그리고 반대로 다른 값을 가진 인스턴스가 구성될 때마다 다른 것을 반환)하도록 보장해 만들어져요.
언어는 값 타입의 동등한 인스턴스가 교체 가능하다는 가정에 기반해 자유롭게 최적화할 수 있지만, 그런 최적화에 의존해서는 안 돼요. 예를 들어 clone이 self의 인스턴스를 반환하게 하거나, 인스턴스 구성을 메모화해 이전에 구성된 값의 재구성이 항상 같은 인스턴스를 반환하게 하고 싶다면, 현재는 이 동작을 직접 오버라이드해야 해요.
(객체 종료(object finalization)에도 같은 것이 성립하지만, 인스턴스에 특별한 파괴 동작이 필요하다면 거의 확실히 실제 값 타입이 아닐 거예요. 값은 프로그램 메모리 밖의 어떤 이상적 형태로 존재하는 "시대를 초월한" 것으로 생각해야 해요. 자연 값들처럼요.)
Variable (변수)
변수는 컨테이너의 이름이에요.
Variable interpolation (변수 보간)
변수의 값을 문자열에 그 변수를 그냥 삽입함으로써 보간할 수 있어요.
어떤 영숫자가 앞에 오는 경우 중괄호가 필요할 수 있어요.
보간은 문자열 컨텍스트에서 일어나므로, 그 클래스에는 유효한 문자열화(stringification) 메서드가 있어야 해요. 더 일반적인 보간은 double q 인용 구성체로 달성할 수 있어요.
Virtual machine (가상 머신)
가상 머신은 바이트코드를 실행하는 Raku 컴파일러 개체예요. 바이트코드를 최적화하거나 Just in Time으로 기계 코드를 생성할 수 있어요. 예로는 (Raku를 실행하려는) MoarVM, Parrot, 그리고 JVM과 JavaScript 같은 더 일반적인 가상 머신들이 있어요.
WAT
DWIM의 반대. 반직관적 동작이에요. 모든 DWIM에는 대응하는 WAT가 있다고 하죠. https://www.destroyallsoftware.com/talks/wat 도 참고하세요.
whitespace
단어를 구분하는 데 쓰이는 공백 문자 하나 또는 공백 문자 그룹. 예는 공백 문자 « »예요.
zef
zef는 Raku 모듈 설치를 관리하는 도구예요.