是否可以在程序内部本地读取文件?



如果我这样做

u:=1;
save u, "test.txt";
u:=2:

然后

test1:=proc() local u;
read "test.txt";
end proc:
test1():
'u'=u;
u = 1

因此,当在过程中读取文件时,变量u被全局赋值。有可能确保它停留在本地吗?

编辑:过程test1()的目标是做一些事情,这些事情需要带有文件值的变量。这个文件是经过长时间的计算后做出的,这个计算是在其他一些工作中做出的。为了避免错误,我需要确保test1()不会改变我当前工作中的变量值,因为名称可以相同。

你的问题缺乏你试图用test1完成的内容,以及为什么你觉得需要一个复杂的机制。

也就是说,为什么不直接提供分配的u作为传递给test1的参数之一呢?

这里有两个备选方案,它们的任何后续调用/调用test1都不会导致全局名称u被重新分配。这两种方法都会导致该值实际上是过程体的一部分。

这是第一个选项

restart;
test1proto := proc() local u;
u := __dummyu;
end proc:
u := 1:
test1 := subs(__dummyu = u,
eval(test1proto)):
u:='u':
test1();
1
'u'=u; # global u is still unassigned
u = u

这样你就可以"鞋角"了。将您想要的任何值(例如,包括更高级别的运行值u)输入test1,以便其本地u获得该值。您还可以重复subs调用,以在其他值处再次实例化模板过程。

注意,这种机制可以替换模板过程中的虚拟名称,而不必将其分配给u。例如,

restart;
test1proto := proc() local u;
u := __dummyu;
end proc:
test1 := subs(__dummyu = 1,
eval(test1proto));
test1 := proc () local u; u := 1 end proc
test1();
1
'u'=u; # global u was never unassigned
u = u

您可以进行这种subs调用,并替换任何您想要的虚拟名称。

这里是另一种选择,其中test1过程的源代码也在其自己的文本文件中。我将test1的源文件命名为"test1.mpl"就像这样,输入

test1 := proc() local u;
$include "u.mm"
end proc:

现在,在我的枫叶课上,

restart;
u := 1:
save u, "u.mm";
u:='u':
read "test1.mpl"
print(eval(test1));
proc () local u; u := 1 end proc
test1();
1
'u'=u; # global u is still unassigned
u = u

在这里您可以进一步save,u的不同值,然后再次read源文件"test1.mpl"并得到不同值的不同程序

请注意,我仍然怀疑您的实际目标(目前还不完全清楚)可能通过比这些更简单的机制来实现。但是,您究竟打算如何使用test1,以及您的编程流的任何限制,都是未知的。

最新更新