为什么'do'(Red language native function)会改变当前的执行路径?

Why does 'do' (Red language native function) are changing the current execution path?

简介

假设我们有一个结构如下的项目:

project/
├── a.red
│
└───modules/
    ├── b.red
    └── c.red

源代码:

; -------- a.red --------
Red [ File: %a.red ]

b: do %modules/b.red
print b

c: do %modules/c.red
print c

; -------- modules/b.red --------
Red [ File: %b.red ]

return "B module loaded"

; -------- modules/c.red --------
Red [ File: %c.red ]

return "C module loaded"

我想做的是:

我正在使用来自 Red 的“do" and "do-file”函数,但意外地它们在从 modules 子目录加载第一个文件后更改了当前执行路径.

>> do %a.red
B module loaded
*** Access Error: cannot open: %modules/c.red
*** Where: read
*** Stack: do-file context do-file  

如您所见,modules/b.red 文件已成功加载,但 modules/c.red 未加载。


尝试次数

看看“pwd”函数的有趣输出,它显示了当前路径。在评估 modules/b.red 之后,路径发生了变化,所以我也将 do %modules/c.red 更改为 do %c.red 以使其工作。

; -------- a.red (modified) --------
Red [ File: %a.red ]

print pwd
b: do %modules/b.red
print b

print pwd
c: do %c.red
print c

执行:

>> do %a.red
%/home/mateusz/Red/project/
B module loaded
%/home/mateusz/Red/project/modules/
C module loaded

同样的情况我注意到等效的“do-file”红色函数。

我使用的是红色版本:0.6.3


问题

有人知道为什么“do”函数会改变当前执行路径吗?

也许这是 Rebol 的一些问题或惯例?

任何替代解决方案(如果存在的话)也会有所帮助。

您面临的问题是您在 module/ 目录中的脚本末尾调用 return。这是在绕过脚本处理的结束,因此当前工作目录在脚本结束时没有得到 re-set。

return 仅设计为在函数内调用。