为什么C#没有词法嵌套函数?

Ste*_*ten 12 c# scheme

为什么C#语言设计者可能不支持这样的东西(从计算机程序的结构和解释,第二版,第30页):

/// <summary>Return the square root of x.</summary>
double sqrt(double x) {
  bool goodEnough(double guess) {
    return Math.Abs(square(guess) - x) < 0.001;
  }
  double improve(double guess) {
    return average(guess, x / guess);
  }
  double sqrtIter(double guess) {
    return goodEnough(guess) ? guess : sqrtIter(improve(guess));
  }
  sqrtIter(1.0);
}
Run Code Online (Sandbox Code Playgroud)

yfe*_*lum 36

事实上,C#就是这样.

double sqrt(double x) {
    var goodEnough = new Func<double, bool>(guess =>
        Math.Abs(square(guess) - x) < 0.001
    );
    var improve = new Func<double, double>(guess =>
        average(guess, x / guess)
    );
    var sqrtIter = default(Func<double, double>);
    sqrtIter = new Func<double, double>(guess =>
        goodEnough(guess) ? guess : sqrtIter(improve(guess))
    );
    return sqrtIter(1.0);
}
Run Code Online (Sandbox Code Playgroud)

  • +1.除了正确的尾递归部分.:) (2认同)

con*_*tor 8

就像Justice说的那样,你可以用C#3.5和lambdas做到这一点; 如果你有C#2.0,你可以使用匿名函数,虽然它会不那么性感:

double sqrt(double x) {
    Func<double, bool> goodEnough = delegate(double guess) {
        return Math.Abs(square(guess) - x) < 0.001;
    };
    Func<double, double> improve = delegate(double guess) {
        return average(guess, x / guess);
    };
    Func<double, double> sqrtIter = null;
    sqrtIter = delegate(double guess) {
        return goodEnough(guess) ? guess : sqrtIter(improve(guess));
    };
    return sqrtIter(1.0);
}
Run Code Online (Sandbox Code Playgroud)

编辑:我忘了,Func没有在C#2.0中定义,所以你必须自己定义:

 public delegate TResult Func<T, TResult>(T guess);
Run Code Online (Sandbox Code Playgroud)