为什么'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"
我想做的是:
- 将文件
modules/b.red
和 modules/c.red
加载到文件 a.red
- 打印加载和评估的内容
我正在使用来自 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
仅设计为在函数内调用。
简介
假设我们有一个结构如下的项目:
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"
我想做的是:
- 将文件
modules/b.red
和modules/c.red
加载到文件a.red
- 打印加载和评估的内容
我正在使用来自 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
仅设计为在函数内调用。