목록 생성 표현식에 대한 구문 선택 [폐쇄
문제
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