编程语言语言运行时编译器【免费下载链接】wrenThe Wren Programming Language. Wren is a small, fast, class-based concurrent scripting language.项目地址https://gitcode.com/gh_mirrors/wr/wren点击查看免费下载导读本文以 Wren 标准库文档中 Range 类 为核心系统讲解 Wren 中数值区间range的两种字面量语法、from/to/min/max/isInclusive等全部成员方法以及它如何通过Sequence协议驱动for循环、列表切片和字符串子串等高频场景。读完本文你将掌握 Range 的完整语义、边界行为空区间、反向区间、负索引并能从 wren_core.c 与 wren_primitive.c 的原生实现层面理解其工作原理。Range 是什么一段有界的连续数值按 Range 类官方文档 的定义Range 表示从起点starting point到某个可能为排他exclusive终点之间的一段有界数值区间。Wren 的 入门指南 中把 Range 形容为一个表示连续数值范围的小对象。Range 没有专属的字面量语法而是由Num数字类实现的两个运算符创建..闭区间inclusive终点包含在区间内例如3..8表示 3 到 8含 8...半开区间exclusive终点不包含在内例如4...6表示 4 和 5不含 6。这两类运算符是 Wren 方法调用体系中的运算符方法参见 method-calls.markdown其原生入口位于 wren_core.c..调用时以isInclusive true调用wrenNewRange...则以isInclusive false调用从而在对象创建阶段就固定了区间的开闭属性。Range 是 Sequence 的子类从源码看Wren 核心库中的 Range 声明极为简洁class Range is Sequence {}见 wren_core.wren。Range 继承自Sequence序列抽象基类因此自动获得Sequence提供的全部派生方法all、any、contains、count、each、map、where、reduce、join、skip、take、toList、isEmpty等这些实现在 wren_core.wren。Sequence是 Wren 标准库中所有可迭代集合String、List、Map 等的共同抽象层其完整方法列表见 Sequence 类文档。Range 的成员方法全解析Range 类自身只定义了一小组方法全部由 C 原生实现见 wren_core.c。官方文档给出了每个方法的语义与示例下面逐一展开。from起点from返回区间的起点。文档特别强调Range 允许是反向backwards的因此from可能大于to。System.print((3..5).from) // 3 System.print((4..2).from) // 4其实现直接读取ObjRange结构中的from字段并转为数值返回DEF_PRIMITIVE(range_from) { RETURN_NUM(AS_RANGE(args[0])-from); }见 wren_core.c。这意味着from永远返回创建区间时写在运算符左侧的那个数无论它是大是小。to终点to返回区间的终点。若区间是闭区间..该值包含在区间内若是排他区间...则该值不包含。System.print((3..5).to) // 5 System.print((4..2).to) // 2实现同样是对ObjRange-to字段的直接读取wren_core.c。结合上例可见反向区间4..2的to为 2小于from的 4。min / max最小与最大边界min返回from与to中较小者max返回较大者——这组方法把反向区间归一化让你不必自行比较两个端点System.print((3..5).min) // 3 System.print((4..2).min) // 2 System.print((3..5).max) // 5 System.print((4..2).max) // 4实现上直接使用 C 标准库的fmin/fmaxDEF_PRIMITIVE(range_min) { ObjRange* range AS_RANGE(args[0]); RETURN_NUM(fmin(range-from, range-to)); }见 wren_core.c。min/max通常用于需要以固定方向处理区间边界的场景例如数值裁剪clamp或区间碰撞检测。isInclusive是否包含终点isInclusive返回该区间是否包含to。注意一个关键细节from始终包含在区间内无论开闭属性如何System.print((3..5).isInclusive) // true System.print((3...5).isInclusive) // false实现直接返回结构中的布尔标志wren_core.cDEF_PRIMITIVE(range_isInclusive) { RETURN_BOOL(AS_RANGE(args[0])-isInclusive); }iterate(iterator) / iteratorValue(iterator)迭代协议Range 的迭代协议是从from出发每次向to方向递增或递减1直到抵达终点iterate(iterator)接受上一个迭代器值首次为null返回下一个迭代器值迭代结束时返回falseiteratorValue(iterator)把迭代器值转换为当前元素值。Range 的原生迭代实现在 wren_core.c逻辑如下DEF_PRIMITIVE(range_iterate) { ObjRange* range AS_RANGE(args[0]); // Special case: empty range. if (range-from range-to !range-isInclusive) RETURN_FALSE; // Start the iteration. if (IS_NULL(args[1])) RETURN_NUM(range-from); ... // Iterate towards [to] from [from]. if (range-from range-to) { iterator; if (iterator range-to) RETURN_FALSE; } else { iterator--; if (iterator range-to) RETURN_FALSE; } if (!range-isInclusive iterator range-to) RETURN_FALSE; RETURN_NUM(iterator); }几点值得注意的语义反向区间是合法的4..2会从 4 递减到 2迭代方向由from与to的大小关系自动决定空区间特判3...3起点等于终点且排他在第一次迭代时就返回false即空区间排他性在迭代层面兜底即便to是闭区间的终点...区间在迭代器抵达to时也会返回false迭代器值即元素值iteratorValue的实现直接返回迭代器本身wren_core.c因为 Range 的迭代器就是区间内的数值注释也写明了Assume the iterator is a number so that is the value of the range.。这一协议与 Wren 的for循环紧密结合参见 control-flow.markdownfor (i in 3..5)正是通过上述两个方法逐步取得 3、4、5 三个值。Range 的三大高频实战场景1. for 循环数值迭代Range 最常见的用途是驱动for循环for (i in 1..5) { System.print(i) // 依次输出 1 2 3 4 5 } for (i in 5..1) { System.print(i) // 依次输出 5 4 3 2 1反向区间 } for (i in 0...5) { System.print(i) // 依次输出 0 1 2 3 4排他终点 }2. 列表切片List subscriptRange 可作为 List 的下标参数返回子列表var list [a, b, c, d, e] var slice list[1..3] System.print(slice) // [b, c, d]此例出自 values.markdown 的 Ranges 章节list[1..3]取出索引 1 到 3含端点的三个元素。列表切片的底层实现是list_subscript原生函数wren_core.c其中关键的索引换算逻辑由calculateRange完成wren_primitive.c空区间特例list[0..-1]与list[0...list.count]在列表为空时被允许用于安全地复制空列表负索引负数从序列末尾倒数value 0时换算为length value排他转闭...区间在换算时终点会按方向偏移 1value value from ? -1 : 1从而统一按闭区间计算越界检查换算后的终点超出[0, length)时抛出运行时错误 Range end out of bounds.步长推导*step from to ? 1 : -1反向切片自动生成反向的子列表。3. 字符串子串String subscriptRange 同样可以作为 String 的下标取子串var string hello wren var wren string[-4..-1] System.print(wren) // wren负索引-4..-1从字符串尾部倒数取出末尾 4 个字符。字符串切片的原生入口在 wren_core.c同样经由calculateRange完成索引换算与列表切片共享同一套边界与方向规则。与 Sequence 高阶方法组合由于 Range 是 Sequence你可以直接链式调用序列方法例如System.print((1..10).where {|n| n % 2 0}.toList) // [2, 4, 6, 8, 10] System.print((1..5).reduce {|a, b| a b}) // 15 System.print((1..3).map {|n| n * n}.toList) // [1, 4, 9] System.print((1..100).any {|n| n 50}) // true System.print((1..5).join(-)) // 1-2-3-4-5这些方法定义在 wren_core.wren 的Sequence类中Range 无需重复实现即可复用。底层对象模型与边界语义ObjRange 结构与相等性Range 在 VM 内部以ObjRange结构表示创建入口为wrenNewRangewren_value.cValue wrenNewRange(WrenVM* vm, double from, double to, bool isInclusive) { ObjRange* range ALLOCATE(vm, ObjRange); initObj(vm, range-obj, OBJ_RANGE, vm-rangeClass); range-from from; range-to to; range-isInclusive isInclusive; return OBJ_VAL(range); }可见 Range 的三个核心状态就是from、to、isInclusive全部方法都是围绕这三者的投影与迭代展开。它作为普通对象参与 GC 标记wren_value.c并支持值相等比较——两个 Range 相等的条件是from、to、isInclusive三者全部相同wren_value.c这与运算符的语义一致。toString 输出Range 的字符串化实现wren_core.c会把from与to的数值以$格式拼接分隔符按开闭属性取..或...因此System.print(3..5)会原样输出3..5System.print(3...5)输出3...5。边界行为速查写法fromtominmaxisInclusive迭代结果3..53535true3, 4, 53...53535false3, 44..24224true4, 3, 24...24224false4, 33...33333false空3..33333true3测试用例佐证仓库的 test/core/range 目录提供了覆盖上述全部语义的测试脚本例如from.wren、to.wren 验证端点访问器min.wren、max.wren 验证归一化边界is_inclusive.wren 验证开闭属性iterate.wren、iterator_value.wren 验证迭代协议iterate_from_float.wren 验证浮点起点的行为exclusive_range_wrong_rhs_type.wren 与 inclusive_range_wrong_rhs_type.wren 覆盖运算符右操作数类型错误join.wren、map.wren、reduce.wren、where.wren 验证其作为Sequence的派生方法。需要留意的是Range 的迭代器以数值步进 1 为单位若from或to为浮点数迭代同样从from起步并按 1 递增相关边界行为可参考 iterate_from_float.wren 的断言。小结Range 是 Wren 中体积小但使用面极广的标准库类型它通过../...两种运算符诞生以from、to、min、max、isInclusive五个只读属性描述区间形态凭借iterate/iteratorValue协议融入Sequence体系并向下渗透到 List 切片、String 子串等底层索引运算中。理解它的开闭语义、反向迭代与空区间特例是写出健壮 Wren 代码的基础而阅读 wren_core.c 与 wren_primitive.c 的原生实现则能帮助你精确预判每一次边界求值的走向。赞分享编程语言语言运行时编译器【免费下载链接】wrenThe Wren Programming Language. Wren is a small, fast, class-based concurrent scripting language.项目地址https://gitcode.com/gh_mirrors/wr/wren点击查看免费下载相关推荐Roc 语言 U8 排他区间..语法详解迭代语义、空区间边界与源码实现Roc 语言 U8 排他区间..语法详解迭代语义、空区间边界与源码实现 本文以 Roc 编译器仓库中的 REPL 快照 u8_range_until.mWren 语言 Sequence 类完整指南迭代器协议、惰性序列与高阶遍历方法Wren 语言 Sequence 类完整指南迭代器协议、惰性序列与高阶遍历方法 Wren 是一门小巧、快速、基于类的并发脚本语言其标准库中的 Sequenc编程语言语言运行时编译器Wren 控制流完全指南分支、循环与迭代器协议源码级剖析Wren 控制流完全指南分支、循环与迭代器协议源码级剖析 Wren 的控制流由分支 if 、 ?: 与循环 while 、 for 两大类语句构成其编程语言语言运行时编译器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
求ccf-csp备考方法 我现在学完了awing的语法课以及做完了里面的练习题,想考今年12月份的,我的目标是考到全国平均分多50分就行,请问接下来我应该怎么做,求 · 2026/9/27 7:05:53
绵阳小户型如何通过设计显大显通透 在绵阳,随着房价的攀升,很多人会选择小户型住宅。但小户型空间有限,容易显得局促。其实,通过合理的设计,完全可以让小户型显大显通透。下面我结合绵阳旺和装修的一些案例,给大家分享几个实用的方法。合理规… · 2026/9/27 7:05:53
个人博客网站中文模板从零搭建:避坑指南与安全加固 个人博客网站中文模板从零搭建:避坑指南与安全加固 网站做好了没人访问,这不仅是流量焦虑,更是安全漏洞的前兆。很多新手觉得博客是静态页面,没什么好防的,结果上线一周就被挂马。个人博客网站中文模板虽然轻量,但从零搭建时的默认配置往往藏着致命隐患… · 2026/9/27 7:45:03
深圳网站设计与开发:2026最新建站实操指南 深圳网站设计与开发:2026最新建站实操指南 想做个网站却不懂代码?别慌。在2026年的今天,深圳网站设计与开发早已不是程序员的专利。很多独立站长、企业老板,甚至刚毕业的大学生,都能通过合理的工具选型和配置,搞定从域名到上线的全流程。这篇文… · 2026/9/27 7:44:57
c++之提高A(前缀和)(第三课) 1.前文
嗯对,在昨天作者写了一些无脑的玩意,大家就当个乐子看。
(顺便放一下网址)
昨天的东西
2.正文
2.1前缀和的介绍
讲一个小故事,虽然纯属虚构:
从前有一个程序员,他想求多个从第个数… · 2026/9/27 7:44:51
建站合同里这10条不写清楚,后期必被坑 第一:源代码归你合同里明确写:源代码所有权归购买方。不是归我,不是归金雨科技,是归你。行业里大部分公司把源码攥在手里,你哪天想换服务商?重做。在我这儿,你随时能拿走源码,随时能… · 2026/9/27 7:44:45
倚天财经指标公式期货指标公式下载 110,COLORBLACK;
0,COLORBLACK;
VAR26:(CLOSE-LLV(LOW,30))/(HHV(HIGH,30)-LLV(LOW,30))*100;
VAR27:REVERSE(VAR26);
VAR28:SMA(VAR26,3,1);
神通:SMA(VAR28,3,1),COLORCYAN;
标王:SMA(神通,3,1),COLORYELLOW;
DRAWTEXT(CROSS(神通,标王) AND 神通<40,100,公),COLORWHITE;
… · 2026/9/27 7:44:45
Brave browser-laptop 自动更新机制与 macOS 代码签名实战指南 桌面应用 【免费下载链接】browser-laptop [DEPRECATED] Please see https://github.com/brave/brave-browser for the current version of Brave 项目地址: https://gitcode.com/gh_mirrors/br/browser-laptop 点击查看 免费下载 本篇技术指南围绕 browser-laptop… · 2026/9/27 7:44:45
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01