在(免费)Pascal 中,函数 return 可以在不取消引用的情况下修改值吗?

In (Free) Pascal, can a function return a value that can be modified without dereference?

在 Pascal 中,我知道可以创建一个函数返回一个可以取消引用的指针,然后为其分配一个值,例如以下(令人讨厌的无用)示例:

type ptr = ^integer;
var d: integer;

function f(x: integer): ptr;
    begin
        f := @x;
    end;

begin
    f(d)^ := 4;
end.

现在 d 是 4。

(实际用法是访问相当复杂的记录数据结构数组的一部分。我知道 class 比嵌套记录数组更好,但这不是我的代码(它是 TeX:程序)并且是在 Pascal 实现支持面向对象之前编写的。代码基本上是使用一种构建在 Pascal 之上的语言编写的,它添加了在编译器看到它们之前扩展的宏。因此你可以定义一些宏 m 接受一个参数 x 并扩展为 thearray[x + 1].f1.f2 而不是每次都写那个;用法是 m(x) := somevalue。我想用函数而不是宏来复制这个功能。 )

但是,如果没有 ^ 运算符,是否可以实现此功能?函数 f 是否可以写成 f(x) := y(无插入符号)将值 y 赋值给 x?我知道这很愚蠢,答案可能是否定的,但我只是 (a) 不太喜欢它的外观并且 (b) 正在尝试完全模仿我上面提到的宏的形式。

Pascal 中的引用不是第一个 class 对象,这与 C++ 或 D 等语言不同。所以简单的答案是您无法直接实现您想要的。

使用您说明的指针是实现相同效果的一种方法,尽管在实际代码中您需要 return 对象的地址,该对象的生命周期超出了函数的生命周期。在您的代码中情况并非如此,因为参数 x 仅在函数 returns.

之前有效

您可以使用具有运算符重载的增强型记录来封装指针,从而封装指针取消引用代码。这可能是一个不错的选择,但这在很大程度上取决于您的整体问题,我们没有看到。