Files
Endorphin-Document/guide/09-functions-and-calls.md

4.3 KiB

9. 函数与调用

函数定义可调用的逻辑,包括名称、输入参数、结果类型和函数体。调用表达式提供输入,并取得函数定义的结果。

9.1 函数声明

代码归属:atelier:shop.pricing。

function discountedPrice(price: Number, discount: Number): Number {
    return price - discount
}

声明的组成如下:

部分 含义
function 函数声明关键字
discountedPrice 函数名
price: Number, discount: Number 两个输入参数及其类型
参数列表后的 : Number 返回类型
花括号内的内容 函数体

参数按逗号分隔,每个参数都有名称与类型。本文基本函数体由零个或多个 let 绑定和一个末尾 return 组成;完整控制流另列于规范状态。

9.2 返回值

return 表达式 产生函数结果。表达式的类型必须符合返回类型。

discountedPrice 返回两个数值的差值。对于输入 100 与 10,成功结果为 90。定义函数不立即执行它;执行发生在 inflight 调用中。

9.3 跨 namespace 调用

代码归属:market:shop.checkout。

use atelier:shop.pricing

function payable(price: Number, discount: Number): Number {
    let amount = discountedPrice(price, discount)
    return discountedPrice(amount, 5)
}

payable 引用定价 namespace,先使用原价与优惠额计算 amount,再从 amount 中扣除 5。对于输入 100 与 10,两次成功结果依次为 90 和 85。

该例采用第 4 章所述的无名称冲突、被引用函数可见的条件。use 定位依赖来源,函数调用使用其中的逻辑;二者分别承担引用和执行职责。

9.4 调用组合

代码归属:market:shop.ui。业务函数声明:

use market:shop.checkout

function checkoutAmount(): Number {
    return payable(100, 10)
}

checkoutAmount 的成功结果为 85。它不需要重复实现价格计算,也不需要为跨 namespace 调用另写客户端、网络请求或编排配置。

相同的普通调用形式用于本地逻辑和跨执行位置的逻辑。执行位置和通信方式不改变输入、结果类型与数据依赖。

9.5 Preflight 检查

在名称和类型规则确定的范围内,Preflight 检查:

  • 调用目标是否存在且允许使用。
  • 参数数量和类型是否符合声明。
  • return 表达式是否符合返回类型。
  • 使用调用结果的后续表达式是否合法。

例如,discountedPrice 需要两个数值参数。discountedPrice(100) 数量不符;discountedPrice("100", 10) 在本文不进行隐式文本到数值转换的示例条件下类型不符。

9.6 inflight 行为

inflight 使用实际参数执行函数,并把成功结果交给调用表达式。依赖关系必须保留:payable 的第二次优惠计算使用第一次调用的 amount。

情况 行为要求
调用成功 结果的值和类型符合函数定义
结果未就绪 依赖该结果的代码不能提前将它作为成功值使用
调用失败 失败可被观察,不伪造成功结果
执行位置变化 已定义的值、类型、依赖与业务效果保持一致

函数不默认被视为纯计算。对带业务修改效果的调用,系统不能为了执行组织而任意重复或并行执行;相关顺序、失败和取消语义见规范状态。

9.7 函数查看与结果呈现

客户端可以将函数本身作为资源查看,也可以在输入满足要求后调用函数。查看定义不会取得函数返回值;调用成功后,结果才可按类型呈现或供后续计算使用。

界面逻辑使用同样的 function、表达式与 return 规则。可渲染结果的正式类型和构造形式尚未定义;本章普通函数示例不因此获得专用 UI 语法。

参数未就绪、调用等待和结果呈现的主要规则见资源访问与呈现。源码中缺少必填参数的调用与客户端查看函数定义属于不同情况。

上一章:表达式与绑定 · 下一章:数据读取 · 目录