FlipFlopワンライナー
LLじゃないけど、C#でもやってみた。
using System; class FlipFlop { static void Main(string[] args) { Func<bool, Func<bool>> flipflop = f => () => {f = !f; return f;}; var ff = flipflop(false); Console.WriteLine(ff()); Console.WriteLine(ff()); Console.WriteLine(ff()); Console.WriteLine(ff()); } }
C#偉いな。核心部分はたった一行。素敵じゃないか。
でも、ここのところ、LINQかぶれの僕としては、IEnumerable
using System; using System.Collections.Generic; class FlipFlop { static IEnumerable<bool> flipflop(bool f = false) { for(int i = f ? 1 : 0;; i++) yield return (i & 1) == 1; } static void Main(string[] args) { foreach(bool v in flipflop(false)) Console.WriteLine(v); } }
本当は、
using System; using System.Collections.Generic; class FlipFlop { static void Main(string[] args) { // コンパイルできないよ〜。 Func<bool, IEnumerable<bool>> flipflop = f => {for(int i = f ? 1 : 0;; i++) yield return (i & 1) == 1;}; foreach(bool v in flipflop(false)) Console.WriteLine(v); } }
ってやりたいけど、
ff.cs(8,81): error CS1621: The yield statement cannot be used inside an anonymous method or lambda expression
っていう残念なエラーが。まぁ、これは、あえて切られた機能らしいので仕方ないでしょう。