제너레이터(컴퓨터 프로그래밍)
Generator (computer programming)컴퓨터 과학에서 제너레이터는 루프의 반복 동작을 제어하는 데 사용할 수 있는 루틴입니다.모든 제너레이터는 [1]반복기이기도 합니다.제너레이터는 파라미터를 가지며 호출할 수 있으며 일련의 값을 생성한다는 점에서 어레이를 반환하는 함수와 매우 유사합니다.단, 모든 값을 포함하는 배열을 구축하여 한꺼번에 반환하는 것이 아니라 제너레이터에 의해 값이 1개씩 생성되므로 필요한 메모리가 적어지고 발신자가 처음 몇 개의 값 처리를 즉시 시작할 수 있습니다.즉, 제너레이터는 기능처럼 보이지만 반복기처럼 작동합니다.
제너레이터는 코루틴이나 퍼스트 클래스 [2]연속과 같은 보다 표현적인 제어 흐름 구조 측면에서 구현될 수 있습니다.생성기([3]세미코루틴이라고도 함)는 코루틴의 특수한 경우로, 점프하는 코루틴을 지정하는 것이 아니라(값을 반환할 때) 항상 발신자에게 제어를 반환한다는 점에서(및 그 보다 약한) 코루틴의 특수한 경우입니다.코루틴과 제너레이터의 비교를 참조해 주십시오.
사용하다
제너레이터는 보통 [4]루프 내부에서 호출됩니다.생성기 호출이 루프에서 처음 도달하면 생성기 루틴의 시작 상태를 캡슐화하는 반복기 개체가 생성되고 인수가 대응하는 파라미터에 바인딩됩니다.그런 다음 특별한 항복 액션이 발생할 때까지 제너레이터의 본문이 해당 반복기의 컨텍스트에서 실행됩니다. 이 때 항복 액션과 함께 제공된 값이 호출 식의 값으로 사용됩니다.후속 반복에서 동일한 생성기 호출에 다음 번 도달하면 생성기 본문의 실행은 다른 생성기 작업이 발생할 때까지 반복 작업 후에 재개됩니다.또, 항복 동작에 가세해, 피니시 동작에 의해서 발전기 본체의 실행을 종료할 수도 있고, 이 때 발전기 호출을 둘러싼 최내 루프가 종료된다.보다 복잡한 상황에서는 루프 외부에서 제너레이터를 수동으로 사용하여 반복기를 만들 수 있으며, 이 경우 다양한 방법으로 사용할 수 있습니다.
제너레이터는 산출된 값을 온 디맨드로만 계산하기 때문에 비용이 많이 들거나 한 번에 계산할 수 없는 시퀀스 등 스트림을 나타내는 데 유용합니다.여기에는 무한 시퀀스 및 라이브 데이터 스트림이 포함됩니다.
신속한 평가가 필요한 경우(주로 시퀀스가 유한한 경우, 그렇지 않으면 평가가 종료되지 않음)에는 목록으로 변환하거나 생성기 대신 목록을 생성하는 병렬 구성을 사용할 수 있습니다.예를 들어 Python에서는 생성기g
목록까지 평가할 수 있다l
경유로l = list(g)
단, F#에서는 시퀀스 식입니다.seq { ... }
(발생기 또는 시퀀스)를 게으르게 평가하지만[ ... ]
열심히 평가하다
생성기가 있는 경우 언어의 루프 구성(예: for 및 while)을 단일 루프로 줄일 수 있습니다.엔드 루프 구조. 그 후 적절한 발전기를 올바른 방법으로 사용하여 모든 통상적인 루프 구조를 편안하게 시뮬레이션할 수 있습니다.예를 들어 다음과 같은 원거리 루프가 있습니다.for x = 1 to 10
Python의 경우처럼 생성기를 통해 반복 구현될 수 있습니다.for x in range(1, 10)
.더,break
발전기에 피니시를 전송한 후 다음을 사용하여 구현할 수 있습니다.continue
루프에 있습니다.
타임라인
생성기는 CLU(1975년)[5]에서 처음 등장했으며 문자열 조작 언어 아이콘(1977년)에서 중요한 기능이었으며 현재는 Python(2001년),[6] C#,[7] Ruby, [8]PHP, ECMAScript(ES6/ES2015년) 및 기타 언어로 제공되고 있습니다.CLU 및 C#에서는 생성기를 반복기, 루비에서는 열거기라고 부릅니다.
리스프
최종 Common Lisp 표준은 기본적으로 제너레이터를 제공하지 않지만 CLTL2에서 문서화된 Series 또는 pygen과 같은 다양한 라이브러리 구현이 존재합니다.
클루
수율문은 사용자 [9]정의 데이터 추상화에 반복기를 구현하기 위해 사용됩니다.
string_chars = 반복자(s: string), 인덱스: int : = 1; limit : = string $ size (s), 인덱스 <= limit do yield (s, index), 인덱스: = index + 1; end string_chars; c: chars; string_chrings: chars: chars: chars: chars...종료.
아이콘
모든 식(루프 포함)은 제너레이터입니다.이 언어에는 많은 제너레이터가 내장되어 있으며 제너레이터 메커니즘을 사용하여 논리 의미론의 일부를 구현하기도 합니다(논리 분리 또는 "OR"은 이러한 방식으로 이루어집니다).
0 ~ 20 의 정사각형을 인쇄하려면 , 코루틴을 사용합니다.
단, 대부분의 경우 커스텀제너레이터는 CLU의 "yield" 키워드와 똑같이 기능하는 "suspend" 키워드를 사용하여 구현됩니다.
C
C는 언어 구성체로서 생성기 함수를 가지고 있지 않지만 코루틴의 서브셋이기 때문에 libdill과 [10]같이 스택풀 코루틴을 구현하는 프레임워크를 사용하여 간단하게 구현할 수 있습니다.POSIX 플랫폼에서는 반복당 컨텍스트 전환 비용이 문제가 되지 않거나 단순히 동시성이 아닌 완전한 병렬화가 필요한 경우 pthread 및 파이프를 사용하여 매우 단순한 제너레이터 함수 프레임워크를 구현할 수 있습니다.
C++
프리프로세서 매크로를 사용하여 제너레이터를 C++에 도입할 수 있습니다.결과 코드에는 네이티브 C++와 매우 다른 측면이 있을 수 있지만 제너레이터 구문은 [11]매우 명확해질 수 있습니다.이 송신원에 정의되어 있는 프리프로세서 매크로 세트에서는, 다음의 예와 같이 구문으로 정의되어 있는 제너레이터를 사용할 수 있습니다.
$140(하강) { 인트 i; // 제너레이터의 생성자를 배치합니다. // descent(int minv, int maxv) {...} // $120에서 $stop은 당사 발전기의 본문입니다. $140(인트) // int 값을 내보냅니다.제너레이터 본체의 시작입니다. 위해서 (i = 10; i > 0; --i) 수익률(i); // Python의 yield와 비슷합니다. // [1..10]의 다음 숫자를 반환합니다(반전). $stop; // 정지, 시퀀스 종료.제너레이터 본체의 끝입니다. };
이 작업은 다음 방법으로 반복할 수 있습니다.
인트 주된(인트 argc, 차* argv[]) { 하강 생성하다; 위해서(인트 n; 생성하다(n);) // "다음 가져오기" 생성기 호출 인쇄물("다음 번호는 %d입니다.\n", n); 돌아가다 0; }
게다가 C++11을 사용하면, Foreach 루프를 C++11에 의해 제공하는 모든 클래스에 적용할 수 있습니다.begin
그리고.end
기능들.그런 다음 반복 가능한 메서드를 모두 정의함으로써 제너레이터와 같은 클래스를 작성할 수 있습니다.begin
그리고.end
및 반복기 메서드(operator!=
,operator++
그리고.operator*
)를 같은 반에 넣습니다.예를 들어, 다음과 같은 프로그램을 작성할 수 있습니다.
#실패하다 <iostream> 인트 주된() { 위해서 (인트 i: 범위(10)) { 표준::외치다 << > i << > 표준::끝; } 돌아가다 0; }
기본적인 범위의 실장은 다음과 같습니다.
학급 범위 { 사적인: 인트 지난; 인트 반복하다; 일반의: 범위(인트 끝.): 지난(끝.), 반복하다(0) {} // 반복 가능한 함수 컨스턴트 범위& 시작한다.() 컨스턴트 { 돌아가다 *이것.; } 컨스턴트 범위& 끝.() 컨스턴트 { 돌아가다 *이것.; } // 반복기 기능 부울 교환입니다.!=(컨스턴트 범위&) 컨스턴트 { 돌아가다 반복하다 < > 지난; } 무효 교환입니다.++() { ++반복하다; } 인트 교환입니다.*() 컨스턴트 { 돌아가다 반복하다; } };
펄
Perl은 기본적으로 제너레이터를 제공하지 않지만 Coro::Coro 코루틴 프레임워크를 사용하는 제너레이터 모듈.사용 예:
사용하다 엄격한.; 사용하다 경고.; # 제너레이터 {BLOCK } 활성화 및 항복 사용하다 Coro: 제너레이터; # 반복하는 어레이 참조 나의 $chars = ['A'...'Z']; # coderef와 같이 호출할 수 있는 새로운 발전기. 나의 $레터 = 발전기 { 나의 i달러 = 0; 위해서 나의 $letter($letter) (@$chars) { # $chars에서 다음 편지 받기 산출하다 $letter($letter); } }; # 발전기를 15번 호출합니다. 인쇄물 $레터->(), "\n" 위해서 (0..15);
TCL
Tcl 8.6에서는 제너레이터 메커니즘은 명명된 코루틴을 기반으로 합니다.
proc generator {body} {coroutine gen[incr :: dismarkuator] 적용 {{script} {# 생성 결과 생성, 생성자 이름 산출 [info coroutine] # 생성 평가 $script # 'break' 예외 반환 - 코드 브레이크 }}를 사용하여 호출자의 루프를 종료하여 실제 생성을 수행합니다. count [{set i 10} {$i <= 20} {incr i} { yield $i } } ]# 1 {가 [$count]을(를) 넣는 동안 생성기에서 값을 모두 꺼냅니다.
하스켈
Haskell에서는 느린 평가 모델을 통해 모든 것이 생성되며, 엄격한 데이터 생성자를 사용하여 생성된 모든 데이터는 온 디맨드로 생성됩니다.예를들면,
에서 카운트하다 n = n : 에서 카운트하다 (n+1) -- 사용 예: 10 ~20 의 정수를 출력합니다. 테스트 1 = 맵M_ 인쇄물 $ 시간이 걸린다 (<=> 20) $ 에서 카운트하다 10 소수점 = 2 : 3 : 넥스트 프라임 5 어디에 넥스트 프라임 n b = n : 넥스트 프라임 (n+2) 그렇지않으면 = 넥스트 프라임 (n+2) 어디에 b = 모든. ((/= 0).(기억하다 n)) $ 시간이 걸린다 ((<=> n).(^2)) $ 꼬리 소수점
어디에(:)
는 비표준 리스트컨스트럭터, 단점 및$
는 "called-with" 연산자로 괄호화에 사용됩니다.표준 어댑터 기능을 사용합니다.
시간이 걸린다 p [] = [] 시간이 걸린다 p (x:xs) p x = x : 시간이 걸린다 p xs 그렇지않으면 = []
는 술어와 일치하는 값을 재취득하고 비술어가 발견되면 즉시 새로운 값의 요구를 중지합니다.공유 스토리지 액세스는 Haskell에서 범용 중개자로 사용됩니다.목록 수집은 자유롭게 사용할 수 있습니다.
테스트 2 = 맵M_ 인쇄물 $ 시간이 걸린다 (<=> 20) [x*x x <-> 에서 카운트하다 10] 테스트 3 = 맵M_ 인쇄물 [x*x x <-> 시간이 걸린다 (<=> 20) $ 에서 카운트하다 10]
라켓
라켓은 발전기를 위한 몇 가지 관련 설비를 제공합니다.첫째, 그 for-loop 형식은 일종의 생산자인 시퀀스와 함께 작동합니다.
(위해서 ([i (범위 내의 10 20)]) (인쇄물 "i = ~s\n" i))
다음 시퀀스도 퍼스트클래스 값입니다.
(정의하다 10 ~ 20 (범위 내의 10 20)) (위해서 ([i 10 ~ 20]) (인쇄물 "i = ~s\n" i))
(프라이빗 스테이트 변수를 사용하여) 필수적으로 구현되는 시퀀스도 있고 (무제한일 가능성이 있는) 레이지리스트로서 구현되는 시퀀스도 있습니다.또한 새 구조 정의는 시퀀스로 사용할 수 있는 방법을 지정하는 속성을 가질 수 있습니다.
그러나 보다 직접적으로, Racket은 보다 전통적인 발전기 사양의 발전기 라이브러리와 함께 제공됩니다.예를들면,
#실패하다라켓 (요구하다 라켓/라켓) (정의하다 (ints-from의 부터) (발전기 () (위해서 ([i (자연 내 부터)]) ; 0부터의 정수 무한 수열 (산출하다 i)))) (정의하다 g (ints-from의 10)) (목록. (g) (g) (g)) ; -> '(10 11 12)
Racket 코어는 컴포넌트 가능한 일반(재엔트리) 연속성과 구분된 연속성을 제공하는 강력한 연속 기능을 구현합니다.이를 이용하여 발전기 라이브러리를 Racket에 구현합니다.
PHP
PHP 커뮤니티는 PHP 5.5에서 생성기를 구현했습니다.상세한 것에 대하여는, 코멘트 요구의 원문을 참조해 주세요. 발전기
무한 피보나치 시퀀스:
기능. 파이보나치() { 전회비 = 0; 현재 $current($current) = 1; 산출하다 1; 하는 동안에 (진실의) { 현재 $current($current) = 전회비 + 현재 $current($current); 전회비 = 현재 $current($current) - 전회비; 산출하다 현재 $current($current); } } 앞지르다 (파이보나치() ~하듯이 $number(숫자)) { 메아리치다 $number(숫자), "\n"; }
제한이 있는 피보나치 시퀀스:
기능. 파이보나치(인트 $한계):발전기 { 산출하다 $a = b달러 = i달러 = 1; 하는 동안에 (++i달러 < > $한계) { 산출하다 $a = (b달러 = $a + b달러) - $a; } } 앞지르다 (파이보나치(10) ~하듯이 $number(숫자)) { 메아리치다 "$number\n"; }
항복문을 포함하는 함수는 자동으로 생성기 함수입니다.
루비
Ruby는 내장 Enumerator 클래스의 형태로 제너레이터(1.9 버전 이후)를 지원합니다.
# Enumerator 객체의 생성기 문자 = 열거자.신규(['A', 'B', 'C', 'Z']) 4.시대 { 놓다 문자.다음 분. } # 블록의 발전기 세어보세요 = 열거자.신규 하다 산출자 i = 0 고리 { 산출자.산출하다 i += 1 } 끝. 100.시대 { 놓다 세어보세요.다음 분. }
자바
Java는 초기부터 반복기를 구현하기 위한 표준 인터페이스를 가지고 있으며 Java 5 이후, "전치" 구조는 이러한 기능을 제공하는 개체를 쉽게 루프할 수 있도록 합니다.java.lang.Iterable
인터페이스입니다.(Java 컬렉션 프레임워크 및 기타 컬렉션 프레임워크는 일반적으로 모든 컬렉션에 반복기를 제공합니다.)
그러나 자바에는 생성기가 내장되어 있지 않습니다.즉, 생성기가 내장된 언어(특히 생성 로직이 복잡한 경우)보다 반복기를 생성하는 것이 훨씬 더 까다롭다는 것을 의미합니다.항목이 반복기에서 생성될 때마다 모든 상태를 저장 및 복원해야 하므로 생성기를 사용할 수 있는 경우와 같이 로컬 변수에 상태를 저장하거나 내장 루프 루틴을 사용할 수 없습니다. 대신 로컬 상태 및 루프 카운터를 유지하기 위해 개체 필드를 사용하여 이 모든 상태를 수동으로 시뮬레이션해야 합니다.
이렇게 만들어진 단순한 반복기라도 발전기를 사용하는 것보다 훨씬 더 부피가 큰 경향이 있으며, 보일러 플레이트 코드가 많이 포함되어 있습니다.
위의 예시는 Java 5에서 다음과 같이 기술할 수 있습니다.
// 반복기가 익명 클래스로 구현되었습니다.제네릭스를 사용하지만 그럴 필요가 없습니다. 위해서 (인트 i: 신규 반복할 수 있다< >정수>() { @오버라이드 일반의 반복기< >정수> 리터레이터() { 돌아가다 신규 반복기< >정수>() { 인트 계산대 = 1; @오버라이드 일반의 부울 다음() { 돌아가다 계산대 <=> 100; } @오버라이드 일반의 정수 다음 분.() { 돌아가다 계산대++; } @오버라이드 일반의 무효 제거한다.() { 던지다 신규 지원되지 않는 조작예외.(); } }; } }) { 시스템..나가..인쇄(i); }
Java 5에서는 무한 피보나치 시퀀스를 반복기로 쓸 수도 있습니다.
반복할 수 있다< >정수> 섬유 = 신규 반복할 수 있다< >정수>() { @오버라이드 일반의 반복기< >정수> 리터레이터() { 돌아가다 신규 반복기< >정수>() { 인트 a = 1, b = 2; @오버라이드 일반의 부울 다음() { 돌아가다 진실의; } @오버라이드 일반의 정수 다음 분.() { 인트 임시직 = a; a = b; b = a + 임시직; 돌아가다 임시직; } @오버라이드 일반의 무효 제거한다.() { 던지다 신규 지원되지 않는 조작예외.(); } }; } }; // 이 경우 다음과 같이 사용할 수 있습니다. 위해서 (인트 f: 섬유) { 시스템..나가..인쇄("다음 피보나치 번호는" + f); 한다면 (어떤 조건(f)) 브레이크.; }
또한 Java 8 Stream 인터페이스를 사용하여 무한 피보나치 시퀀스를 작성할 수도 있습니다.
반복할 수 있다< >정수> 불가항력 = 개울. // 파이브 시퀀스를 생성합니다. .반복하다(신규 정수[]{ 1, 1 }, x -> 신규 정수[] { x[1], x[0] + x[1] }) .지도(x -> x[0])::리터레이터; 불가항력.각각(시스템..나가.::인쇄);
또는 Java 8 슈퍼 인터페이스 BaseStream of Stream 인터페이스에서 Iterator를 가져옵니다.
// 파이브 시퀀스를 생성하는 스트림의 반복자를 저장합니다. 반복기< >정수> 마이제너레이터 = 개울. // 파이브 시퀀스를 생성합니다. .반복하다(신규 정수[]{ 1, 1 }, x -> 신규 정수[] { x[1], x[0] + x[1] }) .지도(x -> x[0]).리터레이터(); // 처음 5개의 요소를 인쇄합니다. 위해서 (인트 i = 0; i < > 5; i++) { 시스템..나가..인쇄(마이제너레이터.다음 분.()); } 시스템..나가..인쇄("첫 번째 반복 완료"); // 다음 5가지 요소 인쇄 위해서 (인트 i = 0; i < > 5; i++) { 시스템..나가..인쇄(마이제너레이터.다음 분.()); } /* 출력: 1 1 2 3 5 첫 번째 반복으로 완료 8 13 21 34 55 */
C#
C# 2.0 제너레이터의 예(yield
는, C#버전 2.0 이후부터 이용 가능합니다.이러한 예에서는 모두 제네릭을 사용하고 있습니다만, 이것은 필수는 아닙니다.또한 이 [12]설명에서 설명한 대로 컬렉션에 대해 커스텀스테이트 풀 반복을 실장할 때도 도움이 됩니다.
// 반복 가능한 입력을 받는 메서드(배열일 수 있음 // 모든 짝수를 반환합니다. 일반의 정적인 IENumerable< >인트> 겟이벤트(IENumerable< >인트> 숫자) { 앞지르다 (인트 번호 에 숫자) { 한다면 ((번호 % 2) == 0) { 산출하다 돌아가다 번호; } } }
여러 개를 사용할 수 있습니다.yield return
각 반복에 순차적으로 적용됩니다.
일반의 학급 시티 컬렉션 : IENumerable< >스트링> { 일반의 IENumerator< >스트링> Get Enumerator() { 산출하다 돌아가다 '뉴욕'; 산출하다 돌아가다 파리; 산출하다 돌아가다 '런던'; } }
XL
XL에서는 반복기는 'for' 루프의 기초가 됩니다.
import IO = XL입니다.UI.CONSOLE 반복기 정수반복기(var out 카운터: 정수, 낮음, 높음: 정수)가 낮음으로 입력되었습니다.높음은 카운터 := 낮음인 반면 카운터 <= 높음 루프 수율 카운터 += 1 // 반복기에서 'var out'으로 선언되었기 때문에 선언할 필요가 없습니다. // 따라서 I를 정수로 암시적으로 선언합니다. 따라서 여기서 I는 1.15 루프 IO에서 I에 대해.쓰기Ln "I=", I
F#
F#은 버전 1.9.[13]1 이후 시퀀스 식을 통해 제너레이터를 제공합니다.이것들은, 다음의 순서를 정의할 수 있습니다(간단하게 평가된, 시퀀셜 액세스).seq { ... }
목록(평가된 목록, 순차적 액세스)은[ ... ]
또는 어레이(표준 평가, 인덱스 액세스)를 통해[ ... ]
값을 생성하는 코드를 포함합니다.예를들면,
인식하다 { 위해서 b 에 0 .. 25 하다 한다면 b < > 15 그리고나서 산출하다 b * b }
는 0 ~ 25 범위의 숫자에서 숫자를 필터링하여 0 ~14의 숫자의 제곱 시퀀스를 형성합니다.
파이썬
생성기는 2001년 [6]버전 2.2에서 Python에 추가되었습니다.제너레이터의 예:
부터 타자 치기 수입품 반복기 방어하다 에서 카운트하다(n: 인트) -> 반복기[인트]: 하는 동안에 진실의: 산출하다 n n += 1 # 사용 예: 10 ~20 의 정수를 출력합니다. # 이 반복은 정상적으로 종료되지만 # countfrom()은 무한 루프로서 쓰여집니다. 위해서 i 에 에서 카운트하다(10): 한다면 i <=> 20: 인쇄물(i) 또 다른: 브레이크. # 필요에 따라 소수를 무한정 생성하는 또 다른 발전기. 수입품 반복하다 방어하다 소수점() -> 반복기[인트]: 산출하다 2 n = 3 p = [] 하는 동안에 진실의: # n을 sqrt(n)까지를 포함한 p의 모든 숫자로 나누면 #는 0이 아닌 나머지를 생성하고 n은 소수입니다. 한다면 모든.(n % f > 0 위해서 f 에 반복하다.시간이 걸리다(람다 f: f*f <=> n, p)): 산출하다 n p.추가하다(n) n += 2
Python에서 제너레이터는 frozen stack frame을 포함하는 반복기로 간주할 수 있습니다.언제든지next()
Python은 frozen 프레임을 재개하여 다음까지 정상적으로 실행됩니다.yield
스테이트먼트에 도달했습니다.그런 다음 제너레이터의 프레임이 다시 프리즈되고 산출된 값이 호출자에게 반환됩니다.
PEP 380(Python 3.3에 구현됨)은 다음과 같은 기능을 추가합니다.yield from
expression: 제너레이터가 작업의 일부를 다른 제너레이터 또는 반복 [14]가능에 위임할 수 있도록 합니다.
생성기 식
Python은 생성기 생성에 도움이 되는 생성기 표현식이라고 하는 목록 통합 구문을 모델로 합니다.다음은 생성자 식을 사용하여 위의 첫 번째 예제를 확장한 것입니다.countfrom
제너레이터 기능:
정사각형 = (n * n 위해서 n 에 에서 카운트하다(2)) 위해서 j 에 정사각형: 한다면 j <=> 20: 인쇄물(j) 또 다른: 브레이크.
ECMAScript
ECMAScript 6(일명.k.a)조화) 발전기 기능 도입.
함수 발생기를 사용하여 무한 피보나치 시퀀스를 작성할 수 있습니다.
기능.* 파이보나치(제한.) { 허락하다 [프리브, 카루] = [0, 1]; 하는 동안에 (!제한. 카루 <=> 제한.) { 산출하다 카루; [프리브, 카루] = [카루, 프리브 + 카루]; } } // 상한 10으로 제한 위해서 (컨스턴트 n 의 파이보나치(10)) { 콘솔.로그.(n); } // 상한 없는 제너레이터 위해서 (컨스턴트 n 의 파이보나치()) { 콘솔.로그.(n); 한다면 (n > 10000) 브레이크.; } // 수동 반복 허락하다 파이버 생성 = 파이보나치(); 콘솔.로그.(파이버 생성.다음 분.().가치); // 1 콘솔.로그.(파이버 생성.다음 분.().가치); // 1 콘솔.로그.(파이버 생성.다음 분.().가치); // 2 콘솔.로그.(파이버 생성.다음 분.().가치); // 3 콘솔.로그.(파이버 생성.다음 분.().가치); // 5 콘솔.로그.(파이버 생성.다음 분.().가치); // 8 // 정지한 곳에서 픽업 위해서 (컨스턴트 n 의 파이버 생성) { 콘솔.로그.(n); 한다면 (n > 10000) 브레이크.; }
R
이 목적으로 [15][16]반복기 패키지를 사용할 수 있습니다.
도서관(리터레이터) # 예 ------------------------- abc <-> 반복하다(c('a','b','c')) 넥스트엘림(abc)
스몰토크
Pharo Smalltalk의 예:
아래의 황금 비율 생성기는 황금 비율에 더 가까운 'goldenRatio next' 호출로 돌아갑니다.
goldenRatio := 제너레이터 on : [ :g x y z r : = 0 . y : = 1.[ z : = x + y . r : = ( z / y )asFloat ]x := y. y := z. g 수율: r ] 반복. 다음으로는 goldenRatio.
다음 식은 다음 10개의 근사치를 반환합니다.
문자 cr join : ( ( 1 ~10 ) collect : [ : dummy ratio next ] )
파로의 숨겨진 보석: 발전기에서 자세히 알아보십시오.
「 」를 참조해 주세요.
- 값 시퀀스를 생성하는 다른 구성에 대한 이해 목록 표시
- 한 번에 한 요소씩 목록을 생성하는 개념의 반복자
- 다른 방법을 반복하다
- 필요할 때 가치를 창출하기 위한 게으른 평가
- 수율이 아닌 재귀에 의한 무한 가능성이 있는 데이터의 코어 커스터시
- 서브루틴에서 더 많은 일반화를 위한 Coroute
- 제어 흐름의 일반화를 위한 계속
메모들
- ^ 반복기와 제너레이터의 차이점은 무엇입니까?
- ^ Kiselyov, Oleg (January 2004). "General ways to traverse collections in Scheme".
- ^ Anthony Ralston (2000). Encyclopedia of computer science. Nature Pub. Group. ISBN 978-1-56159-248-7. Retrieved 11 May 2013.
- ^ Icon Programming Language는 제너레이터를 사용하여 목표 지향 평가를 구현합니다.Icon에서 제너레이터는 일반 루프 제어 구조 이외의 컨텍스트에서 호출할 수 있습니다.
- ^ Liskov, Barbara (April 1992). "A History of CLU" (PDF). Archived from the original (PDF) on 2003-09-17. Retrieved 2006-01-05.
- ^ a b Python 확장 제안: PEP 255: Simple Generators, PEP 289: Generator Expressions, PEP 342: Coroutines via Enhanced Generators
- ^ 수율(C# 참조)
- ^ "PHP: Generators overview - Manual".
- ^ Liskov, B.; Snyder, A.; Atkinson, R.; Schaffert, C. (1977). "Abstraction mechanisms in CLU". Communications of the ACM. 20 (8): 564–576. CiteSeerX 10.1.1.112.656. doi:10.1145/359763.359789. S2CID 17343380.
- ^ "Structured Concurrency for C".
- ^ "Generators in C++". 21 September 2008.
- ^ "What is the yield keyword used for in C#?". stackoverflow.com. Retrieved 2018-01-01.
- ^ "Some Details on F# Computation Expressions". Retrieved 2007-12-14.
- ^ PEP 380 -- 서브제너레이터에 위임하기 위한 구문
- ^ R의 제너레이터 기능
- ^ "Infinite generators in R". 5 January 2013.
레퍼런스
- Stephan Murer, Stephen Omohundro, David Stoutamire 및 Clemens Szyperski:Sather에서 추상화를 반복합니다.프로그래밍 언어와 시스템에 관한 ACM 트랜잭션, 18 (1):1-15 (1996) [1]