返回

文章详情

SendLang: 一种电子邮件自动化的领域特定语言

Hacker News2026年7月15日 15:23

参考 完整的语法针对两种语言 SendLang 是两个小而专注的语言的家园。SendQL 描述消息的接收者。SendFlow 描述他们随时间发生的事情——并以 SendQL 为原生语言。由人和编码代理编写——一个发布的语法,一个可迭代的类型检查器,以及一个你批准的差异。看看如何进行。SendFlow trial-onboarding.flow 工作流 "试用入门" v1 { 进入段落 "trial-started" 退出 "converted" 当 属性 . plan != "trial" 发送 "welcome" 通过主题 "onboarding" 等待 2 天 如果不存在 ( 打开位置 = "welcome" ) { 发送 "welcome-reminder" 通过主题 "onboarding" 等待 2 天 } 发送 "activation-tips" 通过主题 "onboarding" 等待最多 7 天 直到 计数 ( 活动 . login 在 7 天内 ) >= 2 { 超时 : 发送 "need-a-hand" 通过主题 "onboarding" } } 已在 SendLang 中投入生产 一家族,两种语言 SendQL 是名词。SendFlow 是动词。它们共同将联系人数据和事件流转化为你可以在差异中读取的活动。SendQL who 一个段落定义查询语言。每个查询都是一个单一的布尔表达式,描述一组与之匹配的联系人。SendQL segment.sendql 属性 . plan = "pro" 且 属性 . country 在 [ "US", "CA", "MX" ] 且不被抑制 SendFlow what 一种滴灌工作流语言,存储在 .flow 文件中。它从上到下读取,并为每个条件嵌入 SendQL。SendFlow onboarding.flow 工作流 "Nudge" v1 { 进入段落 "trial-started" 等待 2 天 如果不存在 ( 打开在 2 天内 ) { 发送 "nudge" 通过主题 "onboarding" } } 为什么选择一种语言 你的生命周期邮件,版本控制 每一个工具将你的群体和生命周期活动锁定在可视化编辑器中。反而让它们成为一种语言,它们变成你可以进行差异、审查和交给编码代理的文本。winback.flow +3 −1 · 工作流 "Winback" v1 { · 进入段落 "inactive-90d" · 退出 "reactivated" 当 计数 ( 打开在 14 天内 ) >= 1 · ​ · 发送 "we-miss-you" 通过主题 "marketing" − 等待 3 天 + 等待最多 5 天 直到 存在 ( 点击在 5 天内 ) { + 超时 : 发送 "last-call" 通过主题 "marketing" + } · } 它存在于版本控制中 每个段落和工作流都是一个纯文本文件。进行差异、在拉取请求中进行审查、撤回。你的定位和滴灌逻辑获得与其余代码相同的严格性。它在发送之前失败 拼写错误的属性是一个类型错误,带有行和列——而不是一个悄然向无人发送一周的活动。一个编码代理可以编写它 这是关键。画布是代理的死胡同;语言是它已工作的循环。描述结果,让它草拟文件,经过审核后合并。编码代理 将活动交给代理 画布是编码代理的死胡同——它无法读取、修改或告诉你它做了什么。语言是一个代理已经工作的循环:读取文件、写入文件、运行检查器、打开拉取请求。这不是设计的副作用。这是设计的原因。 "试用结束前三天,给他们发邮件。如果他们在三天内没有点击,发送升级优惠。" SendFlow trial-ending.flow 工作流 "试用结束" v1 { 进入段落 3 天 前 属性 . trial_ends_at 退出 "upgraded" 当 属性 . plan != "trial" 发送 "trial-ending" 通过主题 "onboarding" 等待最多 3 天 直到 存在 ( 点击 位置 = "trial-ending" 在 3 天内 ) { 超时 : 发送 "upgrade-offer" 通过主题 "marketing" } } ci sendflow-fmt -l flows/ sendflow-lint -registry registry.json flows/*.flow flows/trial-ending.flow: ok 文档是机器可读的 每个页面都有一个 Markdown 版本,llms.txt / llms-full.txt 将整个语言交给代理,一次获取。无须抓取,无需猜测。 语法,而不是猜测 规范的 EBNF 和保留字列表由解析器自身发出,因此代理阅读的规范不能偏离判断其所写内容的代码。类型检查器是反馈循环 每个解析和类型错误都带有行、列和指出修复的消息。代理在检查器上进行迭代,直到运行干净——在此之前没有任何内容会发送。 你仍然是批准者 没有跳转,没有无界循环,没有待评估的内容。代理最坏的交给你是一个终止的工作流——在它到达联系人之前你已经阅读了它的差异。SendQL 精确描述你的意图 SendQL 读取事件作为与联系人属性齐平的第一来源——而不是仅仅依赖于只看到预先计算的汇总而从不看到原始流的引擎。 属性和列表 以运算符匹配联系人数据,在 [...] 集合中,包含 / 以...开始 / 以...结束,以及列表或段落成员关系。 事件作为第一来源 直接查询原始事件流——计数、存在、总和、平均、最后、第一次——不仅仅是预先计算的参与汇总。 同意和抑制 直接表达可交付性规则:订阅了 "topic",选择退出 "topic",取消订阅所有,没有被抑制。 窗口和最近性 将时间窗口绑定到任何事件。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡