라쿠(프로그래밍 언어)
Raku (programming language)![]() 라쿠[1] 마스코트 카멜리아 | |
패러다임 | 다중 패러다임 |
---|---|
가족 | 펄 |
설계자 | 래리 월 |
개발자 | 라쿠 군락 |
처음 등장한 | 2015년 12월 | , 전(
안정된 릴리스 | 6.d '디왈리' / 2020년 10월 ; 전( |
타이핑 분야 | 동적, 점진적 |
OS | 크로스 플랫폼 |
면허증. | GNU General Public License 또는 Artistic License 2 |
파일 이름 확장자 | .p6, .pm6, .pod6, .t6, .raku, .raku, .rakumod, .rakudoc, .rakutest |
웹 사이트 | raku |
주요 구현 | |
라쿠도 | |
영향을 받다 | |
Perl, Ruby, Smalltalk, Haskell,[4] JavaScript | |
영향받은 | |
Perl,[5] Haskell,[5] AntLang |
Raku는 Perl 계열의 프로그래밍 언어 [6]중 하나입니다.이전에 Perl 6로 알려졌으나 2019년 [7][8]10월에 이름이 변경되었습니다.라쿠는 많은 현대 및 역사 언어의 요소를 소개하고 있다.호환성 모드는 사양의 일부이지만 Perl과의 호환성은 목표가 아니었습니다.라쿠의 설계 과정은 2000년에 시작되었다.
역사
Perl 6에서는 언어를 수정하는 것이 사용자를 수정하는 것보다 낫다고 판단했습니다.
--
Raku의 디자인 프로세스는 2000년 7월 19일, 그 해 Perl [10]Conference의 4일째에 Larry Wall이 State of the Oion 2000에서 [11]발표한 것입니다.당시 언어에서 '역사적 사마귀'를 제거하는 것이 주요 목표였다. 쉬운 것은 쉬워야 하고 어려운 것은 쉬워야 하며 불가능한 것은 어려워져야 한다. 즉 내부 설계와 API의 전반적인 청소였다.이 과정은 코멘트 또는 "RFC"에 대한 일련의 요청으로 시작되었습니다.이 과정은 모든 기여자에게 열려 있었으며 언어의 어떤 측면도 [12]변경에 영향을 미치지 않았습니다.
RFC 프로세스가 완료되면 Wall은 수신한 361개의 요구를 각각 검토하고 분류했습니다.그리고 나서 그는 "발견"[13]이라는 용어의 원래 의미를 사용하여 여러 "아포칼립스"를 쓰는 과정을 시작했다.원래 목표는 Perl 프로그래밍의 각 장마다 하나의 묵시록을 쓰는 것이었지만, 각각의 묵시록이 쓰여지면서 이전의 묵시록은 이후의 변화에 의해 무효가 되고 있다는 것이 명백해졌다.이러한 이유로, 각각 묵시록의 내용과 관련된 일련의 시놉시스가 출판되었지만, 그 이후의 모든 변화는 업데이트에 반영되었다.현재 Raku 사양은 "로스트" 테스트 [14]스위트를 통해 관리되며 Synopses는 역사적 [15]참조로 유지됩니다.
데미안 콘웨이가 쓴 각 묵시록의 내용을 실제적인 용법으로 설명한 시편도 있다.각 Execies는 코드 예시와 [16]예제의 사용 및 의미에 대한 설명으로 구성됩니다.
오늘날 라쿠의 발전에 사용되는 통신수단은 크게 세 가지가 있다.첫 번째는 Libera Chat의 Raku IRC 채널입니다.두 번째는 [17]perl.org에 있는 Perl Foundation 서버에 있는 메일링 리스트 세트입니다.세 번째는 https://github.com/raku에서 호스팅되는 Git 소스 코드 저장소입니다.
초기 목표 및 시사점
월이 초기 연설에서 제시한 주요 목표는 역사적 사마귀를 제거하는 것이었다.여기에는 컨테이너의 표식 사용을 둘러싼 혼란, 컨테이너의 표식 사용 간의 모호성 등이 포함됩니다.select
bareword 파일 핸들링의 구문적 영향.Perl 프로그래머들이 수년 동안 수정에 대해 논의한 다른 많은 문제들이 그의 [citation needed]연설에서 월에 의해 명시적으로 다루어졌다.
이러한 목표의 의미는 Perl 6이 기존 Perl 코드베이스와 하위 호환성이 없다는 것입니다.즉, Perl 5 컴파일러에 의해 올바르게 해석된 일부 코드는 Perl 6 컴파일러에 의해 받아들여지지 않습니다.하위 호환성은 소프트웨어를 강화할 때 공통적인 목표이기 때문에 Perl 6의 변경 사항을 명시적으로 설명해야 합니다.Perl 5와 Perl 6의 차이는 매우 커졌고 결국 Perl 6은 Raku로 이름이 바뀌었습니다.
마스코트
이 언어의 마스코트는 "카멜리아, 라쿠 벌레"[1]이다.그녀의 이름은 Perl과 관련된 낙타 마스코트에게 고개를 끄덕이고, 그녀의 모습은 Perl 커뮤니티의 말장난을 좋아하는 전통에서 "소프트웨어 버그"에 대한 놀이입니다.그녀의 나비 같은 날개에 박힌 스파이럴 디자인은 Perl 6의 애칭인 캐릭터 "P6"를 닮았고, 중앙에서 벗어난 눈 위치는 "Wall-eyed"[18]에 대한 의도적인 말장난이다.
로고의 생동감 있고 화려한 디자인의 배경 중 하나는 지역사회의 여성혐오를 억제하고 남성적인 설득력을 가진 사람들이 그들의 민감한 [19]면을 보여줄 수 있는 기회가 되는 것이었다.
실장
2017년 현재[update] Rakudo 구현만이 개발 중에 있습니다.라쿠의 정식 실장은 하지 않고, 「라쿠는 정식 테스트 [20]스위트에 합격한 것」이라고 한다.
Rakudo Perl[21][22] 6은 MoarVM, Java Virtual Machine 및 JavaScript와 같은 여러 가상 머신을 대상으로 합니다.MoarVM은 Rakudo 및 NQP 컴파일러 [24]툴 체인용으로 특별히[23] 구축된 가상 머신입니다.Raku와 Not Quiet Perl 6(NQP)이라는 가상 머신 사이에는 추상 구문 트리와 백엔드 고유의 코드 생성뿐만 아니라 Raku를 구문 분석하는 Raku 규칙을 구현하는 계층이 있습니다.Rakudo의 대부분은 Raku 자체 또는 서브셋 NQP로 작성됩니다.Rakudo는 완전한 자기 호스팅 구현이 아니며, 현시점에서는 Rakudo를 부트스트래핑 컴파일러로 만들 구체적인 계획은 없습니다.
과거의 실장
Pugs는 Haskell로 작성된 Perl 6의 초기 구현입니다.Pugs는 Perl 6의 가장 고도의 구현이었지만 2007년 중반 이후 대부분 휴지 상태가 되었습니다(GHC의 현재 버전을 추적하기 위한 업데이트만 진행).2014년 11월 현재 Pugs는 적극적으로 [25]유지 보수되지 않고 있습니다.
2007년에는 Perl 5를 사용하여 Perl-6.0.0 STD를 부트스트랩하기 위한 수단으로 v6-MiniPerl6("mp6")과 그 재실장 v6-KindaPerl6("kp6")이 작성되었습니다.STD는 Perl 6의 완전한 문법이며 Perl 6으로 기술되어 있습니다.이론적으로 펄 6을 위해서라도와 실행 코드를 유발하기 위해 성병을 구문 분석할 수 있는 적합한 자동 처리 시스템. kp6 현재 mp6에 의해 여러 backends할 수 있게 해 수집되었습니다.[26][27]mp6과 kp6 펄 6구현과 최소한만을 featureset 완전한 펄 6컴파일러 혼자 힘으로 해내기로 자존심이 요구를 이행할 의도 있지 않다.
Yapsi는 Perl 6 컴파일러이며 Perl 6 자체에서 작성된 런타임입니다.그 결과 [28]Rakudo Star 릴리즈 중 하나와 같은 기존 Perl 6 인터프리터가 필요했습니다.
또 다른 주요 Perl 6 구현 작업인 Niecza는 최적화와 효율적인 구현 연구에 초점을 맞췄습니다.공통 언어 [29]인프라스트럭처를 대상으로 합니다.
모듈 시스템
Raku 사양에서는 모듈을 이름, 버전 및 [30]권한으로 식별하도록 요구하고 있습니다.특정 버전의 모듈만 로드하거나 버전 또는 권한이 다른 같은 이름의 두 모듈만 로드할 수 있습니다.편의상 짧은 이름에 대한 별칭을 제공합니다.
Perl 모듈 배포 시스템인 CPAN은 아직 Raku 모듈을 처리하지 않습니다.대신 시제품 모듈 시스템이 [31]사용되고 있습니다.
Perl로부터의 주요 변경 사항
Perl과 Raku는 근본적으로 다르지만 일반적으로 "Raku Perl을 유지하는 것"을 의도하고 있기 때문에 Raku는 분명히 "Perl 프로그래밍 언어"입니다.대부분의 변경은 언어를 정상화하고, 초보자와 전문 프로그래머가 이해하기 쉽게 하며, "쉬운 것과 어려운 것"을 더 가능하게 하기 위한 것입니다.
사양서
Perl과 Raku의 기술적인 차이점이 아닌 주요 차이점은 Raku가 [20]사양으로 시작되었다는 것입니다.이는 Raku를 필요에 따라 재실장할 수 있음을 의미하며 프로그래머가 특정 기능에 대한 최종 권한의 소스 코드를 읽을 필요가 없음을 의미합니다.반면 Perl에서는 공식 문서는 신뢰할 수 있는 것으로 간주되지 않고 실제 Perl 인터프리터의 동작만 비공식적으로 기술하고 있습니다.문서와 구현 사이에 불일치가 발견되면 다른 하나를 반영하도록 변경될 수 있습니다.이것은 Perl 릴리스의 지속적인 개발과 개선을 촉진하는 동적인 요소입니다.
A형식
Raku에서는 정적 [32]타입이 추가되어 Perl의 동적 타입 시스템이 강화되었다.예를 들어 다음과 같습니다.
내 내부 $i = 0, 내 Rat $r = 3.120, 내 Str $s = "안녕, 세상";
그러나 정적 타이핑은 여전히 선택 사항이기 때문에 프로그래머는 명시적 타이핑 없이 대부분의 작업을 수행할 수 있습니다.
내 $i = "25" + 10; # $i는 35
Raku는 점진적인 타이핑 시스템을 제공하며 프로그래머는 정적 타이핑을 사용하거나 동적 타이핑을 사용하거나 두 가지를 혼합할 수 있습니다.
정식 서브루틴 파라미터 리스트
Perl은 정식 파라미터 리스트가 전혀 없는 서브루틴을 정의합니다(단순한 파라미터 카운트 및 일부 타입 체크는 Perl의 "프로토타입"을 사용하여 수행할 수 있습니다).전달된 서브루틴 인수는 배열 요소에 별칭으로 지정됩니다.@_
의 요소가@_
변경 내용이 원본 데이터에 반영됩니다.
Raku는 언어에 [33]진정한 형식적 매개 변수를 도입합니다.Raku에서는 서브루틴 선언은 다음과 같습니다.
sub do_something(Str $thing, Int $other) {...}
Perl과 마찬가지로 형식 파라미터(파라미터 리스트의 변수)는 실제 파라미터(전달된 값)에 대한 에일리어스이지만 기본적으로 에일리어스는 일정하기 때문에 변경할 수 없습니다.이러한 에일리어스는 원래 값의 읽기/쓰기 에일리어스로 명시적으로 선언되거나is rw
또는is copy
프로그래머가 로컬에서 수정하도록 요구하는 경우 각각 지시사항입니다.
파라미터 전달 모드
Raku는 위치 파라미터, 명명된 파라미터 및 슬러피 파라미터의 세 가지 기본 파라미터 전달 모드를 제공합니다.
위치 파라미터는 대부분의 프로그래밍 언어가 사용하는 파라미터의 일반적인 순서 목록입니다.모든 파라미터는 이름을 순서대로 사용하여 전달될 수도 있습니다.Named-only 파라미터(로 표시):
매개 변수 이름 앞)은 이름을 지정해야 전달할 수 있습니다. 즉, 위치 인수를 캡처하지 않습니다.슬러피 파라미터(로 표시됨)*
파라미터 이름 앞)은 Raku의 Variadic 함수 작성하기 위한 도구입니다.slurpy 해시는 나머지 passed-by-name 파라미터를 캡처하고 slurpy 어레이는 나머지 passed-by-position 파라미터를 캡처합니다.
다음으로 3가지 파라미터 전달 모드를 모두 사용하는 예를 나타냅니다.
sub somebunctiona, $b, :$c, :$d, *@e) {...} 일부 함수(1, 2, :d(3), 4, 5, 6), # $a=1, $b=2, $d=3, @e=(4,5,6)
위에서 사용한 것과 같은 위치 매개변수는 다음에 이어지지 않는 한 항상 필요합니다.?
옵션임을 나타냅니다.이름 있는 파라미터는 기본적으로 선택 사항이지만 다음을 추가하여 필수 항목으로 표시할 수 있습니다.!
변수 이름 뒤에 있습니다.slurpy 파라미터는 항상 옵션입니다.
블록 및 클로저지
매개변수는 닫힘 역할을 하는 임의 블록에도 전달될 수 있습니다.예를 들어 이렇게 하면for
그리고.while
루프 리터레이터가 지정됩니다.다음 예제에서는 목록이 한 번에 3개의 요소를 통과하여 루프의 블록에 변수로 전달됩니다.$a, $b, $c
를 클릭합니다.[34]
@list -> $a, $b, $c {...}
이것은 일반적으로 "점진 서브" 또는 "점진 블록"이라고 불리며 화살표는 거의 정확하게 동작합니다.sub
키워드: 익명 클로즈(Perl [33]용어로 어나니머스 서브루틴)를 도입합니다.
시그질 불변성
Perl에서는 변수 이름 앞에 오는 구두점 문자인 sigils는 변수 사용 방법에 따라 달라집니다.
# 내 @array =('a', 'b', 'c'), $array[1], # $array는 'b', # @array = @array[1, 2], #@array는 ''b'), #@array[1], #'b'는 경고(510 옵션과 함께 제공됩니다.
Raku에서는 시그널은 불변합니다.즉,[32] 필요한 어레이인지 어레이 요소인지에 따라 시그널이 변경되지 않습니다.
# Raku 코드 my @array = 'a', 'b', 'c', $array[1], # $array = 'b'; # @array = 'b'; # @array = 'b'; # @array = @array = '1', # @array = 'b'; # @array = 'b'
Perl의 차이는 영어 및 기타 많은 자연어에서의 번호 일치에서 영감을 얻었습니다.
"이 사과" # $a 정답 "이 사과들" # @a 정답 "이 세번째 사과" # $a[3] 정답 "이 세번째 사과" # @a[3] 틀렸다.
단, 이 개념 매핑은 참조가 스칼라임에도 불구하고 데이터 구조를 참조할 수 있기 때문에 참조를 사용할 때 분해됩니다.따라서 중첩된 데이터 구조를 다루려면 단일 용어로 단수 및 복수 형식의 표현이 필요할 수 있습니다.
# Perl 코드: 어레이를 포함하는 해시를 포함하는 해시의 리프에서 목록을 검색합니다. 나의 @trans_subsions = @{ $secondary{ '동사' }{ '과도적' } };
이 복잡성은 자연어 또는 다른 프로그래밍 [dubious ]언어에서는 동등하지 않으며 복잡한 데이터 구조를 조작하기 위해 코드를 작성할 때 높은 인지 부하를 유발합니다.Raku에서도 같은 코드입니다.
# Raku 코드: 내 @trans_busss = %transary <verb> <transitive > 배열을 포함하는 해시를 포함하는 해시의 리프에서 목록을 가져옵니다.
객체 지향 프로그래밍
Perl은 bless라고 불리는 메커니즘을 통해 객체 지향 프로그래밍을 지원합니다.어떤 언급도 특정 클래스의 대상이 될 수 있습니다.blessed 객체는 "화살표 구문"을 사용하여 호출되는 메서드를 가질 수 있습니다.이것에 의해 Perl은 적절한 서브루틴을 이름으로 찾거나 "디스패치"하고, blessed 변수를 첫 번째 인수로 호출합니다.
매우 강력하지만 가장 일반적인 개체 방향(일부 코드와 연관된 구조 같은 개체)을 불필요하게 어렵게 만듭니다.또한 Perl은 사용 중인 개체 모델에 대해 어떠한 가정도 할 수 없기 때문에 메서드 호출을 매우 적절하게 최적화할 수 없습니다.
「간단하고 어려운 일을 가능하게 한다」는 정신으로, 라쿠는 축복 모델을 유지하며,[35] 일반적인 경우에 보다 견고한 대상 모델을 제공하고 있다.예를 들어 데카르트 점을 캡슐화하는 클래스를 다음과 같이 정의하고 사용할 수 있습니다.
클래스 포인트는rw{달러 .y고, 메서드 distance(포인트달러 p){sqrt((달러!x-$p.x)**2+(달러!y-$p.y)**2)달러 .x다}법 distance-to-center{self.distance:Point.new()=>0, y=>0)}}를 포인트를 Point.new()=>, 1.2, y=>, -3.7),"점의 위치:(",달러point.x,','달러,point.y'이라고 말한다.)'이다;#(출력): 점 위치: (1.2, -3.7) # x 및 y 변경(lvalues로 사용되는 방법 "x" 및 "y"에 주목):$point.x = 3, $point.y = 4, "포인트 위치: ( , $point.x , ' , ' , ' , $point . y , ' ) ; #OUTPUT: 포인트 위치: ( 3, 4 ) my $otherpoint = point . new ( x = > -5, y = 10 ) ; $point distance - point > # otherpoint > # point.
이 점은 메서드 호출의 구문으로 점 주위에 병합된 다른 많은 언어(예: C++, Java, Python 등)에 대한 노드의 화살표를 대체합니다.
Raku 용어로는$.x
를 "사기"라고 합니다.일부 언어에서는 이러한 필드 또는 구성원을 호출합니다.속성에 액세스하는 데 사용되는 방법을 "액세서"라고 합니다.auto-accessor 메서드는 자동으로 생성되어 Atribute의 이름을 따서 명명된 메서드입니다.x
는 위의 예에 나와 있습니다.이러한 접근자 함수는 Atribute 값을 반환합니다.클래스 또는 개개의 Atribute가 다음과 같이 선언된 경우is rw
auto-accessor에 새로운 값을 전달하여 Atribute를 설정하거나 lvalue로 직접 할당할 수 있습니다(예시와 같이).프로그래머가 Atribute에 대해 보다 풍부한 인터페이스를 필요로 하는 경우, 자동 액세스기는 사용자 정의 메서드로 대체할 수 있습니다.속성은 클래스 정의 내에서만$!
구문 지정은 어트리뷰트의 선언 방법에 관계없이 이루어집니다.기타 모든 접근은 접근자 방식을 통과해야 합니다.
Raku 오브젝트 시스템은 [clarification needed]Raku의 OOP 기능의 대부분을 Perl에 도입하는 무스 프레임워크에 영감을 주었습니다.
상속, 역할 및 클래스
상속은 개체 또는 유형이 기존 개체 또는 유형의 코드 또는 정의를 재사용할 수 있는 기술입니다.예를 들어, 프로그래머는 표준 유형을 가지지만 추가 속성을 가질 수 있습니다.Java와 같은 다른 언어의 상속은 클래스를 기존 클래스의 하위 클래스로 허용함으로써 제공됩니다.
Raku는 다른 언어의 클래스와 유사한 클래스 및 역할을 통해 상속을 제공합니다.
Raku에서의 역할은 Java에서의 인터페이스 기능, Ruby에서의 믹스인, PHP와[36] Smalltalk의 변형 Squak에서의 특성을 담당합니다.이것들은 수업과 매우 비슷하지만, 더 안전한 [37]구성 메커니즘을 제공합니다.상속 체인에 추가하는 것이 아니라 클래스와 함께 사용할 때 구성을 수행하는 데 사용됩니다.역할은 명목 유형을 정의하며 동작 및 상태 컬렉션에 대한 의미적 이름을 제공합니다.역할과 클래스의 근본적인 차이점은 클래스를 인스턴스화할 수 있지만 역할은 인스턴스화할 [38]수 없다는 것입니다.
역할은 클래스와는 다르지만 직접 역할을 인스턴스화하거나 유형 객체로 사용하는 Raku 코드를 작성할 수 있습니다.Raku는 자동으로 역할과 같은 이름의 클래스를 생성하여 역할을 [39]클래스처럼 투명하게 사용할 수 있습니다.
기본적으로 역할은 상속을 사용하지 않고 클래스에 추가할 수 있는 (추상적일 수 있는) 메서드 및 속성 번들입니다.개별 객체에 역할을 추가할 수도 있습니다. 이 경우 Raku는 익명 서브클래스를 만들고 해당 서브클래스에 역할을 추가한 후 객체의 클래스를 익명 서브클래스로 변경합니다.
예를 들어, 개는 포유동물로부터 유선과 (포유류의 부모인 척추동물을 통해) 척추와 같은 특정한 특징을 물려받기 때문에 포유동물이다.반면에, 개들은 또한 몇 가지 뚜렷한 행동 유형 중 하나를 가질 수 있고, 이러한 행동들은 시간이 지남에 따라 변할 수 있다.예를 들어, 개는 애완동물, Stray(유기된 애완동물은 애완동물과 관련이 없는 생존을 위한 행동을 습득한다), 또는 시각장애인을 위한 가이드(안내견은 훈련을 받았기 때문에 안내견으로서의 삶을 시작하지 않는다)일 수 있다.그러나 이러한 동작은 도그에 추가할 수 있는 추가 동작 세트입니다.또한 이러한 행동을 다른 동물에게 유용하게 적용할 수 있는 방식으로 묘사할 수도 있습니다. 예를 들어, 고양이는 애완동물이나 스트레이가 될 수 있습니다.따라서 개와 고양이는 서로 다른 반면, 둘 다 더 일반적인 범주의 포유류에 속합니다.그래서 포유류는 계급이고 개와 고양이는 포유류로부터 물려받은 계급이다.그러나 Pet, Stray 및 Guide와 관련된 행동은 클래스에 추가할 수 있는 역할 또는 클래스에서 인스턴스화된 객체입니다.
포유류 분류는 척추동물 {...}이다.}급 개는 포유동물 {...} 역할 애완동물 {...}역할 Stray {...} 역할 가이드 {...}
역할이 클래스 또는 오브젝트에 추가됩니다.does
키워드를 지정합니다.클래스로부터의 상속을 표시하려면 , 다른 키워드가 있습니다.is
키워드는 두 가지 기능의 다른 의미를 반영합니다.역할 구성은 클래스에 역할의 동작을 제공하지만 역할과 실제로 동일한 것을 나타내지 않습니다.
Class GuideDog은 Dog do Guide {...} # 서브클래스는 my $dog = new Dog, $dog do Guide, # 개개의 객체가 역할을 구성합니다.
역할은 클래스와는 다르지만 둘 다 유형이기 때문에 일반적으로 클래스를 배치하는 변수 선언에 역할이 표시될 수 있습니다.예를 들어, 인간의 블라인드 역할에는 Guide 유형의 속성이 포함될 수 있습니다. 이 속성은 Guide Dog, Guide Horse, Guide Human 또는 Guide Machine을 포함할 수 있습니다.
클래스 휴먼 {에 개 $dog; # 어떤 종류의 개도 포함할 수 있습니다.# 가이드 역할 유무 } role Blind {에는 $guide가 있습니다.# 가이드 역할을 하는 모든 개체를 포함할 수 있습니다.# 개든 뭐든 간에 }
정규 표현
Perl의 정규 표현식 및 문자열 처리 지원은 항상 Perl의 정의 기능 [40]중 하나입니다.Perl의 패턴 매칭 구조가 정규 언어 표현의 기능을 상회한 지 [41]꽤 되었기 때문에, Raku 문서에서는 정규 표현이라고 배타적으로 언급하고, 이 용어를 정식 정의와 구별합니다.
Raku는 정규식에 관한 Perl 기능의 슈퍼셋을 제공하며, 이를 "규칙"이라고 불리는 큰 프레임워크로 접어서 문맥에 민감한 형식(예를 들어 표현 문법과 ANTLR의 구문적 술어)의 기능을 제공하고 어휘적 [42]범위에 대한 클로저 역할을 합니다.규칙은 에 도입되어 있습니다.rule
서브루틴 정의와 매우 유사한 사용법을 가진 키워드입니다.어나니머스 룰은, 에도 도입할 수 있습니다.regex
(또는rx
) 키워드 또는 regexps가 Perl에 존재했기 때문에 단순히 인라인으로 사용할 수 있습니다.m
(표준) 또는s
(중요) 연산자
아포칼립스 5에서 래리 월은 "현재 정규식 문화"의 20가지 문제점을 열거했다.그 중에서도 Perl의 정규식은 "너무 작고 귀엽고", "너무 적은 메타문자에 의존", "이름 있는 캡처에 대한 지원이 거의 없다", "문법에 대한 지원이 거의 없다", "실제"[43] 언어와의 통합이 불충분하다는 점이 있었다.
통사적
일부 Perl 구조는 Raku에서 변경되어 가장 일반적인 경우에서 다른 구문 신호에 최적화되어 있습니다.예를 들어 Perl의 제어 흐름구조에 필요한 괄호(둥근 괄호)는 현재 [34]옵션입니다.
if is-true() { for @array {...} }
또,,
(8) 연산자는 목록 생성자가 되었기 때문에 목록 주위에 괄호를 둘 필요가 없습니다.코드
@array = 1, 2, 3, 4;
지금 만들고 있다@array
요소 '1', '2', '3' 및 '4'가 정확히 포함된 배열입니다.
연쇄 비교
Raku는 체인에 비유할 수 있습니다.즉, 다음과 같은 일련의 비교가 허용된다.
20 < = $temperature < = 25 {"실온이 20 ~ 25 사이!"라고 말합니다.}
이는 각 왼쪽에서 오른쪽으로의 비교가 각각 단독으로 수행된 것으로 간주되며 결과는 를 통해 논리적으로 결합됩니다.and
작동.
게으른 평가
Raku는 Haskell과 [44]같은 일부 기능적 프로그래밍 언어의 특징이었던 목록을 느리게 평가하는 기술을 사용합니다.
@syslog = 0..Inf; 0 ~ 무한대 정수 수
어레이에 무한 크기 목록을 할당하려고 해도 위의 코드가 크래시되지 않습니다.@integers
또한 제한된 수의 슬롯이 검색될 경우 목록 확장을 시도할 때 무기한 중단되지 않습니다.
이것에 의해, 입출력 조작, 리스트 변환, 파라메타 전달 등, Raku의 많은 일반적인 태스크가 심플화됩니다.
모이다
게으름 평가와 관련된 것은 다음을 사용하여 게으름 목록을 구성하는 것입니다.gather
그리고.take
Icon이나 Python과 같은 언어의 생성기처럼 작동합니다.
my $120 = 0을 위한 게으른 수집..Inf { take $_ * $_;};
$squares
제곱수의 무한 리스트가 될 것입니다만, 느릿느릿한 평가입니다.gather
는 요소에 액세스할 때만 요소가 계산되도록 합니다.
접속점
Raku는 다른 [44]가치의 합성물인 가치의 결합 개념을 도입한다.가장 단순한 형태에서는 일련의 값을 결합 연산자와 결합함으로써 결합이 생성됩니다.
# ("임의") Junction의 예: $color eq 'white' 'black' 'black' 'grey' {die "Color printing not supported\n"; } # &("all") Junction의 예: $password = 'secret!123', if $password ~~~/</> </>
는 왼쪽 인수 또는 오른쪽 인수와 동일한 값을 나타냅니다. &
는 왼쪽 인수와 오른쪽 인수 모두와 동일한 값을 나타냅니다.이러한 값은 일반 값을 사용하는 모든 코드에서 사용할 수 있습니다.접합부에 대해 수행된 연산은 접합부의 모든 부재에 동일하게 작용하며 접합 연산자에 따라 결합된다.그렇게,("apple" "banana") ~ "s"
항복할 것이다"apples" "bananas"
. 이에 비해 결합은 비교를 위해 하나의 참 또는 거짓 결과를 반환합니다."any
"접점 요소 중 하나에 대한 비교가 참일 경우 참으로 반환됩니다."all
접점의 모든 요소에 대해 비교가 참이면 접점은 참을 반환합니다.
또한 다음과 같은 유형의 결합으로 제한된 일반 프로그래밍 스타일을 도입하여 유형 시스템을 더욱 풍부하게 증강할 수 있습니다.
RGB_Color CMYK_Color, sub get_tint(색상 $color, Num $opacity) {...}
매크로
저수준 언어에서는 C 프리프로세서가 널리 사용되고 있기 때문에 매크로의 개념은 소스 코드의 텍스트 치환과 동의어가 되었습니다.그러나 Lisp와 같은 고급 언어들은 훨씬 [45]더 강력한 매크로를 사용하는 데 있어서 C보다 먼저 사용되었습니다.Raku가 활용할 [33]수 있는 것은 리스프 같은 매크로 컨셉입니다.이러한 종류의 매크로의 힘은 단순한 텍스트가 아닌 고급 데이터 구조로서 프로그램에서 작동하며 프로그래밍 언어의 모든 기능을 자유자재로 사용할 수 있다는 사실에서 비롯됩니다.
Raku 매크로 정의는 서브루틴 또는 메서드 정의처럼 보이며, 구문 분석되지 않은 문자열, 사전 구문 분석된 코드를 나타내는 AST 또는 두 개의 조합으로 작동할 수 있습니다.매크로 정의는 다음과 같습니다.[46]
macro hello($what) {준 {hello {{$what}}}}}; }
이 예에서는 매크로가 C 스타일의 텍스트 치환보다 복잡하지는 않지만 매크로 파라미터의 해석은 매크로가 발신자 코드로 동작하기 전에 이루어지기 때문에 진단 메시지가 훨씬 더 유용합니다.그러나 매크로 본문은 사용할 때마다 컴파일 시에 실행되기 때문에 많은 최적화 기술을 사용할 수 있다.컴파일 시 작업을 수행함으로써 결과 프로그램에서 복잡한 계산을 제거할 수도 있습니다.
식별자
Perl에서는 식별자 이름에 ASCII 영숫자와 밑줄을 사용할 수 있습니다.Raku에서는 영숫자에 대부분의 유니코드 문자를 포함할 수 있습니다.또한 하이픈과 아포스트로피를 사용할 수 있습니다(숫자 뒤에 숫자가 붙지 않는 등 특정 제한이 있습니다).이름에 있는 단어를 구분하기 위해 밑줄 대신 하이픈을 사용하면 "kebab 대소문자"라는 이름의 스타일이 됩니다.
예
안녕 세계
hello world 프로그램은 언어를 소개하기 위해 사용되는 일반적인 프로그램입니다.Raku에서 hello world는 다음과 같습니다.
'안녕하세요, 세상'이라고 말하세요;
요인
Raku에서 요인 함수는 몇 가지 다른 방법으로 정의됩니다.
#회귀(`if\else`을 짓기로)를 사용하여 fact(UInt$n,>UInt){만약$n== 0{1}대신하다 다른{달러 n*fact(달러 n-1)}}#을 사용하여 반복(로 `if`로 성명 수식어)서브 fact(UInt$n,>UInt){복귀 1만약$n== 0;달러 n*fact(달러 n-1) 돌아오;}#을 사용하여 반복(`when`을 짓기로)대신하다 사실(UInt$n,>UIn.t={$n == 0 { 1 } default { $n * fact n n - 1 } } } # 3진 연산자 하위 팩트( UInt $n --> UInt ) { $n == 0 ? ? ? ? 1 !! $n * fact - 1 } } # 다중 디스패치 다중 팩트 사용 ( UI {nt nt } >$n } # 요인 연산자 생성 및 축소 메타 연산자 하위 포스트픽스 사용: <!> ( UInt $n --> UInt ) { [*]1 .$n } # 'state' 선언자를 사용하여 메모화된 요인 하위 팩트 생성(UInt $n --> UInt ) { state %known = 0 = > 1. %known {$n}을(를) 반환하고, %known {$n} = $n * factsechn-1; }을(를) 반환하고 있습니다.
퀵소트
QuickSort는 잘 알려진 정렬 알고리즘입니다.기능 프로그래밍 패러다임을 사용한 작업 구현은[a] Raku로 간결하게 기술할 수 있습니다.
# 빈 목록이 빈 목록으로 정렬됩니다. multi quicksort([]) {() } # 그렇지 않으면 첫 번째 항목을 피벗으로 추출하십시오.multi quicksort([$pivot, *@rest]) { # 파티션.my @before = @rest.svp)달러 전), my @after = @rest.svp)달러 후), # 파티션을 정렬합니다.플랫(quicksort(@before), $sort, quicksort(@after))}
- ^ 구현이 백그라운드에서 화려하고 신비로운 작업을 수행하지 않는 한 가능한 최대 재귀 깊이는 목록의 길이이기 때문에 이 구현은 빅데이터에 적합하지 않습니다.재귀 깊이는 다음과 같이 제한할 수 있습니다.
log2(list_length)
더 큰 칸막이로 반복함으로써before
그리고.after
작은 파티션에만 재귀합니다.
하노이 타워
하노이 타워는 컴퓨터 과학에서 재귀 프로그래밍을 도입하기 위해 자주 사용됩니다.이 실장에서는 Raku의 멀티 디스패치메커니즘과 파라미터 제약조건을 사용합니다.
multi sub honi(0, $, $, $) {} # 디스크가 없으므로 multi sub honi $n, $a = 'A', $b = 'B', $c = 'C') { # # # 디스크 $n과 pegs A, B, C 하노이 $n - 1, $a, C, $n, $n으로 시작합니다.마지막 디스크는 A에서 C 하노이 $n-1, $b, $a, $c; # 마지막으로 디스크 n-1개를 B에서 C로 이동합니다.
책들
라쿠의 역사에는 두 가지 서적의 물결이 있었다.첫 번째 물결은 2000년 Perl 6의 최초 발표에 이은 것입니다.그 책들은 당시의 언어 디자인 상태를 반영하고 있으며, 대부분 시대에 뒤떨어진 자료들을 포함하고 있다.2015년 버전 1.0의 발표에 이은 두 번째 물결에는 이미 출판된 여러 권의 책과 집필 중인 다른 책들이 포함되어 있다.
Perl 6 버전 1.0(버전 6.c로 알려져 있음)보다 전에 출판된 책
- A. 랜달, D.수갈스키, L. 토치Perl 6 및 Parrow Essentials, 초판, 2003, ISBN978-0596004996
- A. 랜달, D.수갈스키, L. 토치Perl 6 및 Parrow Essentials, Second Edition 2004.ISBN 978-0596007379
- S. 월터스Perl 6 지금 당장: Perl 5. 2004를 사용한 핵심 아이디어ISBN 978-1590593950
또, 최초의 Perl 6 가상 머신인 Parrow 전용의 책도 2009년에 출판되었습니다.
- A. 랜달, A.휘트워스.Parrow Developer's Guide: 2009년판.ISBN 978-0977920129
Perl 6 버전 1.0(버전 6.c) 이후 출판된 책
- 앤드류 시토프.Perl 6 개요2017. ISBN 978-90-821568-3-6 - 무료 공식 PDF 다운로드 또는 GitHub에서 다운로드
- 로랑 로젠펠트, 앨런 B다우니.Perl 6 2017을 생각해 보세요.ISBN 978-1-4919-8055-2
- 모리츠 렌츠.Perl 6 Fundamentals 2017.ISBN 978-1-4842-2898-2
- J. J. 메렐로Perl 6을 사용한 프로그래밍 학습: First Steps: 명령줄을 벗어나지 않고 프로그래밍을 시작합니다.ISBN 978-1521795781
- 앤드류 시토프.Perl 6 Deep Dive, 2017.ISBN 978-1-78728-204-9
- 앤드류 시토프.Perl 6. 2017을 사용합니다.ISBN 978-90-821568-1-2 - 무료 공식 PDF 다운로드 또는 GitHub에서 다운로드
- 모리츠 렌츠.Perl 6 Regex 2017을 사용한 검색 및 해석ISBN 978-1-4842-3228-6
- brian d foy.학습 Perl 6 2018 ISBN 978-1491977682
새로운 Raku 이름으로 출판된 책들
- 앤드류 시토프.2019년 제2판 Raku 사용 ISBN 978-90-821568-8-1 - 무료 공식 PDF 다운로드 또는 GitHub에서 사본 다운로드
- 앤드류 시토프.Raku One-Liners, 2019년, ISBN 978-90-821568-9-8 — 무료 공식 PDF 다운로드 또는 GitHub에서 다운로드
출판 예정 도서
Perl 6의 현재 버전 1.0(버전 6.c로 알려진)을 기반으로 곧 출판될 신간 서적에 대한 여러[47] 저자들의 보고서가 있습니다.
- 앤드류 시토프.Perl 6으로의 이행 Perl 5로부터의 간단한 이행ISBN 978-90-821568-5-0.아마 절대 출판되지 않을 거야.
- 가보르 사보Perl 6에서의 웹 어플리케이션 개발.
레퍼런스
- ^ a b Jackson, Joab (23 July 2010). "Perl creator hints at imminent release of long-awaited Perl 6". IDG News Service. Retrieved 8 February 2015.
- ^ http://blogs.perl.org/users/zoffix_znet/2018/11/announce-raku-perl-6-diwali-6d-language-specification-release.html
- ^ "Modules".
- ^ "Glossary of Terms and Jargon". Perl Foundation Perl 6 Wiki. The Perl Foundation. 28 February 2011. Archived from the original on 21 January 2012. Retrieved 8 February 2015.
- ^ a b 唐鳳, a.k.a. Audrey Tang (21 April 2010). "How to Implement Perl 6 in '10".
- ^ "About Perl". perl.org. Retrieved 11 June 2020.
"Perl" is a family of languages, "Raku" (formerly known as "Perl 6") is part of the family, but it is a separate language which has its own development team. Its existence has no significant impact on the continuing development of "Perl".
- ^ "Perl 6 renamed to Raku". LWN.net. 15 October 2019. Retrieved 16 October 2019.
- ^ "TPF response to Raku rename". 29 October 2019.
- ^ Biancuzzi, Federico; Warden, Shane (2009). Masterminds of Programming: Conversations with the Creators of Major Programming Languages. ISBN 978-0596515171.
- ^ Kline, Joe (21 August 2000). "Report from the Perl Conference".
- ^ Wall, Larry (2000). "State of the Onion 2000". O'Reilly Network.
- ^ The Perl Foundation (2000). "About Perl 6 RFCs".
- ^ Wall, Larry (2 April 2001). "Apocalypse 1: The Ugly, the Bad, and the Good".
- ^ "Raku test suite". GitHub. 2019.
- ^ Larry Wall and the Perl 6 designers (2015). "Perl 6 Design Documents".
- ^ The Perl Foundation (2001). "Exegeses".
- ^ The Perl Foundation (2002). "Perl Development: Mailing Lists".
- ^ "Larry Wall in IRC chat log". 15 January 2016. Retrieved 10 November 2017.
- ^ "Archived "Logo considerations" email from Larry Wall". GitHub. 24 March 2009. Retrieved 10 November 2017.
- ^ a b Wall, Larry (10 August 2004). "Synopsis 1: Overview".
- ^ "rakudo/rakudo - GitHub". Github.com. Retrieved 21 September 2013.
- ^ Michaud, Patrick (16 January 2008). "The compiler formerly known as 'perl6'". Archived from the original on 18 February 2012.
- ^ Worthington, Jonathan (31 May 2013). "MoarVM: A virtual machine for NQP and Rakudo". 6guts. Retrieved 24 July 2013.
- ^ "NQP - Not Quite Perl at github". GitHub. 29 May 2022. Retrieved 29 May 2022.
- ^ "Feature comparison of Perl 6 compilers". Archived from the original on 7 February 2019.
- ^ Wall, Larry; et al. (2007). "Perl 6 STD". GitHub.
- ^ "mp6/kp6 FAQ". Perl 6 development team. 2006.
- ^ "Yapsi README". GitHub. 2011.
- ^ O'Rear, Stefan (29 November 2011). "Niecza README.pod". GitHub. Retrieved 12 January 2012.
- ^ Wall, Larry (2004). "Synopsis 11: Modules".
- ^ "Perl 6 Modules Directory". Modules.raku.org. Retrieved 17 May 2020.
- ^ a b Wall, Larry (20 May 2009). "Synopsis 2: Bits and Pieces".
- ^ a b c Wall, Larry (21 March 2003). "Synopsis 6: Subroutines".
- ^ a b Wall, Larry (20 May 2009). "Synopsis 4: Blocks and Statements".
- ^ Wall, Larry (18 August 2006). "Synopsis 12: Objects".
- ^ The Software Composition Group (2003). "Traits". Archived from the original on 11 August 2006. Retrieved 22 September 2006.
- ^ Worthington, Jonathan (2009). "Day 18: Roles".
- ^ chromatic (2009). "The Why of Perl Roles".
- ^ "Object orientation". docs.raku.org. Retrieved 24 October 2019.
- ^ Parlante, Nick (2000). "Essential Perl: String Processing with Regular Expressions".
- ^ Christiansen, Tom (1996). "PERL5 Regular Expression Description". Archived from the original on 31 March 2010. Retrieved 25 March 2010.
Perl's regexps "aren't" -- that is, they aren't "regular" because backreferences per sed and grep are also supported, which renders the language no longer strictly regular
- ^ Wall, Larry (20 May 2009). "Synopsis 5: Regexes and Rules".
- ^ Wall, Larry (4 June 2002). "Apocalypse 5: Pattern Matching".
- ^ a b Wall, Larry (13 September 2004). "Synopsis 9: Data Structures".
- ^ Lamkins, David B. (8 December 2004). Successful Lisp: How to Understand and Use Common Lisp. bookfix.com. Archived from the original on 12 September 2006. Retrieved 13 September 2006.
- ^ "Macros".
- ^ Perl 6에 관한 서적