这让我感到困惑,因为一个编译器/解释器似乎可以递归解决这个问题。伪代码如下:
function isPure(functionMetadata): boolean;
begin
result = true;
for each variable in functionMetadata.variablesModified
result = result and variable.isLocalToThisFunction;
for each dependency in functionMetadata.functionsCalled
result = result and isPure(dependency);
end;
这就是基本思想。 显然,您需要某种检查来防止相互依赖的函数无限递归,但这不太难设置。
接受函数指针的高阶函数可能存在问题,因为它们无法在静态上进行验证,但我的原始问题假定编译器具有某种语言约束,以指定只能将纯函数指针传递给某个参数。 如果存在一个这样的约束条件,那么可以用它来满足要求。
显然,在编译语言中比在解释语言中更容易实现,因为所有这些数字运算都会在程序执行之前完成,因此不会减慢任何速度,但我真的看不出任何根本性问题会使其无法评估。
是否有更多了解这个领域的人知道我缺少什么?