Red(R2)中如何调用通过命令行参数传入名称的多参函数?
问题分析与解决
你的代码问题出在两个核心点:
- 命令行参数类型不匹配:
system/options/args里的所有元素都是字符串,直接用ARGS/1作为函数名时,它是字符串而非可执行的函数词(Word),Do无法识别为函数调用。 - Do块的执行逻辑错误:
Do [ARGS/1 Remove ARGS]是顺序执行两个独立表达式——先取ARGS/1,再执行Remove ARGS(返回移除第一个元素后的参数列表),最终Do返回的是第二个表达式的结果,也就是剩余参数,而非函数调用结果。
修正后的代码示例
myfun: func [A B C] [ print ["参数:" A B C] return A + B + C ] ; 复制系统参数列表,避免修改原数据 ARGS: copy system/options/args ; 将第一个参数(字符串)转为函数词 func-word: to-word first ARGS ; 处理剩余参数:转为函数需要的类型(这里是整数,可根据需求调整) func-args: map-each arg next ARGS [to-integer arg] ; 构造调用块并执行 result: do compose [(func-word) (func-args)] print ["执行结果:" result]
关键说明
- 复制参数列表:直接操作
system/options/args会修改系统原始参数,复制后操作更安全。 - 字符串转函数词:
to-word将命令行传入的函数名字符串(如"myfun")转为Rebol可识别的函数词myfun。 - 参数类型转换:命令行参数都是字符串,需根据函数参数类型(整数、浮点数等)转换,这里用
map-each批量处理。 - 构造调用块:
compose用来将函数词和参数列表插入到调用块中,最终Do执行的是myfun 7 24 15这样的合法调用。
内容的提问来源于stack exchange,提问作者Slavko
相关产品推荐
相关产品推荐

