如果我这样做
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
,以及您的编程流的任何限制,都是未知的。