跳转至

魔法函数语法

用魔法函数来增强原有函数的功能。

语法

魔法函数是一种函数,传入的第一个参数是一个函数指针(需要增强的函数),返回的值是匿名函数或函数指针。 例如: 魔法函数memoize可以用来缓存函数调用的结果,代码如下:

function memoize(func);
begin
    cache := array();
    memoized_func := function (...args) // 匿名函数做闭包
    begin
        uplevel#1 cache, func;   // 用uplevel访问memoize的变量
        key := str(args);
        if key in cache then
            return cache[key];   // 如果已缓存结果,直接返回结果
        result := func(...args); // 否则调用函数,缓存结果
        cache[key] := result;
        return result;
    end

    return memoized_func;        // 返回闭包
end;

使用的时候在函数定义前加魔法函数调用,用@开头,没有参数可以省略()。 系统会自动传入要增强的函数做为第一个参数,所以不需要设置这个参数。 例如,使用memoize来缓存结果:

@memoize
function calc_func(x);
begin
     // 例如是很消耗时间的一些计算,这里只是简单的返回+1示例一下:
    return x+1;
end;


// 调用函数并缓存结果
x := calc_func(1);
x := calc_func(2);

用例

例如可以用于缓存结果,记录函数调用,调用时检查相关的权限等等,应用非常广泛和方便。