В Паскале я понимаю, что можно создать функцию, возвращающую указатель, который может быть разыменован, и затем присвоить ему значение, например, в следующем (неприятно бесполезном) примере:
type ptr = ^integer;
var d: integer;
function f(x: integer): ptr;
begin
f := @x;
end;
begin
f(d)^ := 4;
end.
Итеперь d
равно 4.
(Фактическое использование - доступ к части довольно сложной структуры данных массива записей. Я знаю, что класс будет лучше, чем массив вложенных записей, но это не так.Мой код (это TeX: The Program) и был написан до того, как реализации Pascal поддерживали объектную ориентацию.Код был написан с использованием языка, основанного на Pascal, который добавил макросы, которые расширяются до того, как компилятор их видит. Таким образом, вы можете определить некоторыемакрос m
, который принимает аргумент x
и расширяется до thearray[x + 1].f1.f2
вместо того, чтобы записывать это каждый раз; использование будет m(x) := somevalue
. Я хочу скопировать эту функцию с помощью функции вместо макроса.)
Однако возможно ли достичь этой функциональности без оператора ^
?Может ли функция f
быть написана так, чтобы f(x) := y
(без каретки) присваивал значение y
x
?Я знаю, что это глупо, и ответ, вероятно, нет, но мне просто (а) не очень нравится его внешний вид, и (б) я пытаюсь имитировать именно ту форму макроса, о которой я упоминал выше.