You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Red(R2)中如何调用通过命令行参数传入名称的多参函数?

问题分析与解决

你的代码问题出在两个核心点:

  1. 命令行参数类型不匹配:system/options/args里的所有元素都是字符串,直接用ARGS/1作为函数名时,它是字符串而非可执行的函数词(Word),Do无法识别为函数调用。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 20:38:11