문제

C#에는 다음과 같은 구문이있는 생성기 기능이 있습니다.

IEnumerable<int> GetNats(int max)
{
   for (int i=0; i < max; ++i)
      yield return i;
}

내 프로그래밍 언어 (Java, Scala, Actionscript 및 C#과 유사한 간단한 객체 지향 프로그래밍)에 관심이있는 기능은 발전기 표현식입니다. 이들은 본질적으로 발전기 기능을위한 구문 설탕입니다.

내가 가장 좋아하는 후보자는 다음 구문입니다.

IEnumerable<int> nats = 
  witheach (i in range(0, 42)) 
     yield i * 2; 

표현식 range(0, 42) 내장 생성기 기능입니다.

그래서 제 질문은 C#/Java/Scala/Actionscript 유형 언어에서 발전기 표현식에 대해 어떤 구문을 선호 하시겠습니까?

응답에 영향을 줄 수있는 몇 가지 요소는 Scala 및 Actionscript와 같은 요소가 내 언어의 유형이 유형 후에 선언된다는 것입니다. 예를 들어:

var myVar : SomeType = initialValue;

또한 익명 기능은 다음과 같습니다.

var myFunc = function(int x) { 
  return x + 1; 
}

그 외에 내 언어 구문은 Java 또는 C#과 유사합니다. 내 언어에는 a foreach C#과 매우 유사한 진술.

도움이 되었습니까?

해결책

또한 있습니다 파이썬 접근-발전기를위한 특수 구문 없음; "수율"진술의 존재 만 있으면됩니다. 블록을 취하는 진술은 사용될 수 있지만 실제로 사용 된 루프 만 찾을 것으로 예상됩니다.

IEnumerable<int> nats = 
    for (i in range(0,42))
        yield i*2

String phrase = "I want to buy some cheese.";
IEnumerable<int> substrs =
    for (i in 0 .. phrase.length)
        for (j in i .. phrase.length+1)
            yield phrase[i..j]

여기서는 오른쪽 엔드 포인트가 범위에 포함되어 있지 않다고 가정합니다.

솔직히 말해서, 파이썬에서 이것을 보았을 때, 나는 "어떤 비용으로?"

다른 팁

F#이 무엇을하는지 확인하십시오. 넌 할 수있어

seq { seq-expr }    // IEnumerable<T>, a.k.a. seq<T>
[ seq-expr ]        // list<T>
[| seq-expr |]      // array<T>

여기서 seq-expr은 '수율'과 함께 대부분의 언어 구성을 포함하는 형태입니다. 예를 들어 쓸 수 있습니다

seq {
    for i in 0..9 do
        for j in someColl do
            if i <> j then
                yield i*j
}

F# 컴파일러는이 코드를 Ienumerable의 상태 머신 구현으로 변환합니다 (C# 반복자 블록의 경우).

나는이 구문이 마음에 들기 때문에 예를 들어 "지금 명령적인 일을하기"에 쓸 수있는 동일한 코드를 쓸 수 있다는 것을 의미하기 때문입니다.

    for i in 0..9 do
        for j in someColl do
            if i <> j then
                printfn "%d" i*j

그러나 해당 코드를 seq {}로 랩하고 '수율'을 사용하면 코드가 게으른 ienumerable이됩니다.

IEnumerable nats = 0...42

or for generators 

IEnumerable nats = yield 0...42
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top