Perl to Raku 가이드 — 문법

Perl to Raku 가이드 — 문법 (Syntax)

Perl에서 if, for 같은 구문을 쓸 때 간격을 어떻게 두는지, 괄호를 어떻게 쓰는지 같은 세부 관행은 대개 '그냥 그렇게 하는 거지' 하고 넘어가요. 그런데 Raku로 옮기면 이 미세한 관행 차이가 문법 오류가 되기도 해요. perl-syn 문서가 다루는 문법 요소들이 Perl에서 어떻게 동작했는지, 그리고 Raku에서는 그 상당식이 무엇인지 정리한 문서예요.

출처: Raku 공식 문서 — Perl to Raku guide: syntax

본문

이 문서는 perl-syn 문서에 기술된 문법 요소를 기준으로 Perl과 Raku의 차이를 (되도록) 빠짐없이 정리하려는 시도예요.

참고 (NOTE)

이 문서는 Raku 문법 자체를 상세히 설명하지 않아요. Perl에서 익숙한 방식이 Raku에서는 어떻게 되는지 안내하는 데 집중해요. Raku 문법 전체를 보려면 <Raku 문서 — Syntax>를 보세요.

자유 형식 (Free form)

Raku도 여전히 대체로 자유 형식이에요. 다만 공백의 유무가 의미를 갖는 경우가 몇 군데 생겼어요.

  • Perl에서는 키워드 다음에 공백을 생략할 수 있어요(while($x < 5), my($x, $y)). Raku에서는 이 공백이 필수예요. 그래서 while ($x < 5)my ($x, $y)로 써야 해요.
  • 그 대신 Raku에서는 괄호 자체를 생략할 수도 있어요. while $x < 5처럼요. if, for 등에도 동일하게 적용돼요.
  • Perl에서는 배열·해시와 그 첨자 사이, 그리고 후위 연산자 앞에 공백을 둘 수 있었죠($seen {$_} ++). Raku에서는 이게 안 돼요. 꼭 %seen{$_}++처럼 붙여 써야 해요.

공백이 있으면 안 되는 자리에 꼭 넣어야 한다면, 백슬래시(\)로 '공백 해제(unspace)'를 할 수 있어요. 자세한 건 문서를 보세요.

선언 (Declarations)

<함수(Functions) 가이드>에서도 언급하지만, Raku에는 undef가 없어요. 선언만 하고 초기화하지 않은 스칼라 변수는 자기 타입으로 평가돼요. 즉 my $x; say $x;(Any)를 출력하고, my Int $y; say $y;(Int)를 출력해요.

주석 (Comments)

  • #는 Perl처럼 줄 끝까지 주석이에요.
  • 임베디드 주석은 해시 기호와 백틱(`#``)으로 시작해서 여는 괄호 문자를 따라 나오고, 짝이 맞는 닫는 괄호 문자까지 이어져요. 예:
if #`( why would I ever write an inline comment here? ) True {
    say "something stupid";
}
  • Perl처럼 pod 지시문으로 여러 줄 주석을 만들 수도 있어요. =begin comment로 시작하고 =end comment로 끝나요.

참·거짓 (Truth and falsehood)

Perl의 참/거짓과 Raku의 참/거짓의 차이점은 하나예요. Perl과 달리 Raku는 문자열 "0"을 참으로 취급해요. 숫자 0은 여전히 거짓이고, 접두 +를 써서 문자열 "0"을 숫자로 강제 변환하면 거짓으로 만들 수 있어요. Raku에는 실제 Boolean 타입도 있어서, 어떤 값이 참/거짓인지 신경 쓰지 않고 True/False를 바로 쓸 수 있는 경우가 많아요.

문장 수식어 (Statement modifiers)

문장 수식어는 대부분 그대로 동작해요. 다만 예외가 몇 가지 있어요.

  • for 루프는 Perl의 foreach가 유일한 형태예요. Raku에서 for는 C 스타일 for 루프에 쓰지 않아요. 그 동작이 필요하면 loop를 쓰세요. loop는 문장 수식어로 쓸 수 없어요.
  • Raku에서는 do {...} while $x 형태를 쓸 수 없어요. 이 형태의 dorepeat로 바꿔야 해요. do {...} until $x도 마찬가지예요.

복합문 (Compound statements)

Perl과 비교해 큰 변화는, Raku에서 given이 기본적으로 실험적이지도 않고 비활성화되지도 않았다는 점이에요. given에 대한 자세한 내용은 <여기>를 보세요.

루프 제어 (Loop control)

next, last, redo는 Perl에서 Raku로 넘어오면서 바뀌지 않았어요.

continue는 Raku에 존재하지 않아요. 루프 본문 안에서 NEXT 블록을 쓰면 돼요.

# Perl
my $str = '';
for (1..5) {
    next if $_ % 2 == 1;
    $str .= $_;
}
continue {
    $str .= ':'
}
# Raku
my $str = '';
for 1..5 {
    next if $_ % 2 == 1;
    $str ~= $_;
    NEXT {
        $str ~= ':'
    }
}

for 루프

앞서 말한 대로, Raku에서 C 스타일 for 루프는 for가 아니라 그냥 loop예요. 무한 루프를 쓸 때 C 관용구 loop (;;) {...}처럼 쓸 필요 없이 그냥 스펙을 완전히 생략해서 loop {...}라고 해도 돼요.

foreach 루프

Perl에서 for는 C 스타일 for 루프에도 쓰이고 foreach의 동의어이기도 해요. Raku에서 forforeach 스타일 루프에만 쓰여요.

switch 문

Raku에는 실제 switch 문이 있어요. given이 제공하고, 각 case는 whendefault로 처리해요. 기본 문법은 이래요:

given EXPR {
    when EXPR { ... }
    when EXPR { ... }
    default { ... }
}

자세한 내용은 <여기>에서 볼 수 있어요.

goto

goto는 현재 (아직) 구현되지 않았어요. 레이블은 구현돼 있고, next, last, redo의 목표로 쓸 수 있어요:

FOO:                         # 레이블은 Perl처럼 콜론으로 끝나요
for ^10 {
    say "outer for before";
    for ^10 {
        say "inner for";
        last FOO;
    }
    say "outer for after";   # "last" 때문에 출력되지 않아요
}
# outer for before
# inner for

goto에 대한 계획은 <S04-control.pod의 goto 문>을 참고하세요.

줄임표 문 (Ellipsis statement)

...는 (!!!???와 함께) 스텁 선언을 만드는 데 쓰여요. Perl에서의 ... 사용보다 조금 더 복잡해서, 자세한 내용은 <S06-routines.pod의 Stub 선언>을 보는 게 좋아요. Raku에서 역할이 확장됐다고 해서 Perl에서 하던 역할을 못 할 이유는 딱히 없어 보여요.

POD: 임베디드 문서

Pod는 Perl과 Raku 사이에서 바뀌었어요. 가장 큰 차이는 pod를 =begin pod=end pod 지시문 사이에 감싸야 한다는 점이에요. 그 외에도 이리저리 조정된 부분이 있어요.

디버깅을 할 때는 Raku 인터프리터로 pod를 확인하는 게 가장 좋아요. --doc 스위치를 쓰면 되는데, 예를 들어 raku --doc Whatever.pod처럼 해요. 이렇게 하면 문제점이 표준 오류로 출력돼요.

Raku 스타일 pod에 대한 자세한 내용은 <여기>를 보세요.

더 알아보기 (Learn more)