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

REBOL中如何创建函数序列并按索引调用对应函数?

REBOL 函数存储与判定相关问题解答

块序列存储函数的实现方法

REBOL原生支持将函数存入block!块类型(即你所说的序列结构),取元素时识别为word!类型,核心原因是REBOL的块是惰性容器:写在方括号内的代码默认不会自动求值,只会原样存储符号、字面量等元素。你写[mul2 mul3]时,块内保存的是mul2、mul3两个word!类型的单词符号,并非单词绑定的函数值,取出来自然无法识别为函数类型。

正确实现方式分两种场景:

  • 直接存储函数值:用reduce先对块内元素求值,拿到实际函数值后存入块,取出即可直接调用
mul2: func [n] [2 * n]
mul3: func [n] [3 * n] ; 原示例此处笔误写为2*n,与mul2逻辑重复
func-list: reduce [mul2 mul3]
type? pick func-list 1 ; 返回function!
(pick func-list 1) 2 ; 返回4,(pick func-list 2) 2 返回6
  • 存储函数名动态查找:块内保留单词符号,取出元素时用get获取单词绑定的函数值再调用
func-list: [mul2 mul3]
f: get pick func-list 1 ; 等价于f: :mul2,拿到单词绑定的函数引用
type? f ; 返回function!
f 2 ; 返回4

function? mul2报错的原因

执行语句时报缺少参数,核心是REBOL遵循从左到右的严格求值规则:解释器从左到右扫描代码时,碰到mul2单词会先查询其绑定值,发现是一个需要传入1个参数的函数后,会直接尝试执行该函数要求传参,不会将mul2作为值传递给左侧的function?判定函数,因此触发参数缺失错误。

如果要获取函数本身的引用而非调用它,使用REBOL的取单词值语法即可:

; 两种写法均可正确判定,返回true
function? :mul2
function? get 'mul2

内容的提问来源于stack exchange,提问作者Attila Karoly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 09:36:26