操作数函数在过程中的工作方式不同

发布于 2025-01-10 05:43:14 字数 475 浏览 0 评论 0原文

我们来定义一个过程

[> f:=proc(s)
     s:={1}: {op(s),2};
   end proc:

那么

[> f('s');
                            {2, {1}}

,但是

[> s:={1}: {op(s),2};
                             {1, 2}

为什么我们会得到不同的结果呢?
使用局部变量我们可以获得预期的结果:

[> f:=proc(s) local S;
     S:={1}: s:=S; {op(S),2};
   end proc:
   f('s');
                             {1, 2}

Let's define a procedure

[> f:=proc(s)
     s:={1}: {op(s),2};
   end proc:

then

[> f('s');
                            {2, {1}}

but

[> s:={1}: {op(s),2};
                             {1, 2}

So why do we have a different result?
Using a local variable we can get the expected result though:

[> f:=proc(s) local S;
     S:={1}: s:=S; {op(S),2};
   end proc:
   f('s');
                             {1, 2}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

深海夜未眠 2025-01-17 05:43:14

您对过程的调用被编写为对作为参数传递的不带引号的名称产生副作用。 (我个人认为这是一种邪恶的编程实践,不良后果并不意外。)

由于您已将名称括在 uneval 引号中,因此额外的 eval 允许您访问。例如,

f:=proc(s)
   s:={1}; {op(eval(s)),2};
end proc:

f('s');

          {1, 2}

Your call to the procedure is written to have a side-effect on the uneval-quoted name passed as argument. (Personally I think that is an evil programming practice, and ill consequences are not unexpected.)

Since you have wrapped the name in uneval-quotes, then an extra eval allows you access. Eg,

f:=proc(s)
   s:={1}; {op(eval(s)),2};
end proc:

f('s');

          {1, 2}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文