
Ruby 语法级计算器TRICK 2025 获奖作品「纯 Ruby 语法加法」原理与玩法【免费下载链接】rubyThe Ruby Programming Language项目地址: https://gitcode.com/GitHub_Trending/ru/ruby本文基于 Ruby 仓库中 TRICK 2025第 5 届 Transcendental Ruby Imbroglio ContestrubyKaigi 竞赛第三名作品 Most Arithmetic作者 Tomoya Ishida / tompng的备注文档 remarks.markdown 撰写。它展示了一个反直觉的技巧不依赖任何 Ruby 运行时执行逻辑仅靠 Ruby 语法解析器层面的特性即可完成两位数以内的加法运算。读完本文你将掌握该作品的运行方式生成 12 个文件并用cat拼接 ruby -run -e colorize高亮查看结果、其底层三大语法技巧条件局部变量定义、def作用域局部变量重置、状态跨作用域传递以及文件结构与系统限制。需要说明sample/trick2025/README.md 明确提示这些文件是「反面示例」切勿将其当作样板代码。这是什么跑在 Ruby 解析器上的语法级计算器该作品的核心论点是Ruby 语法本身就可以对两位数执行加法运算无需 Ruby 运行时runtime参与计算。ruby entry.rb生成 12 个文件0、1、2、3、4、5、6、7、8、9、和。这 12 个文件共同构成一套运行在 Ruby 解析器上的计算器系统每个数字文件0~9是一个数字片段文件是加法算符片段文件是输出/收尾片段。要计算6 7只需把6、、7、四个文件拼接cat 6 7 拼接出来的输出本身是一个什么都不做no-op的 Ruby 脚本同时它也是█ █ ██这幅 ASCII 艺术旋转 90 度后的图形。此时还看不出结果——关键一步是让 Ruby 对它做语法高亮cat 6 7 | ruby -run -e colorize高亮之后终端里用颜色区分出的代码结构就显影出了计算结果你会看到6 7 13这幅彩色 ASCII 艺术。原理在于脚本中不同 token变量定义、注释、正则、字符串等会被colorize染成不同颜色而结果数字恰好由特定颜色 token 构成因此解析器对语法的分类替代了运行时对数值的计算。运行方式与作者验证过的环境直接无参数运行生成器当前目录即 sample/trick2025/03-tompng/ruby entry.rb随后按需要拼接并高亮例如文档中给出的两个完整算式cat 2 0 2 5 | ruby -run -e colorize cat 4 1 5 4 1 8 | ruby -run -e colorize备注文档中作者确认在以下解释器版本上验证过效果原文照录ruby 3.4.1 (2024-12-25 revision 48d4efcb85) YJIT MN PRISM [arm64-darwin22]ruby 3.3.0 (2023-12-25 revision 5124f9ac75) YJIT MN [arm64-darwin22]这提示适用前提效果依赖colorize的输出样式跨终端/主题可能存在色差。若高亮看不清文档建议先用以下命令切换终端配色黑色背景、深灰光标printf \e]11;#000000\a\e]10;#333333\a\e]4;1;#ffaaaa\a多数字相加系统能力与限制该系统支持超过两个数字相加但有两硬性约束Limitation 小节原文每个加数必须是一位或两位数加法结果必须小于 100。文档给出的三个多操作数示例cat 3 1 4 1 5 9 | ruby -run -e colorize cat 1 2 4 8 1 6 3 2 | ruby -run -e colorize cat 0 1 2 3 4 5 6 7 8 9 1 0 | ruby -run -e colorize内部原理三大语法技巧文档 Internals 小节指出要做计算需要存储storage和控制流control flow。作者的方案完全建立在解析器的语法行为上存储用局部变量是否存在作为 1 bit 的存储控制流Ruby 语法提供的条件性局部变量定义与带状态传递的局部变量重置充当条件跳转。技巧一条件局部变量定义Conditional Local Variable DefinitionRuby 语法允许有条件地定义新的局部变量文档给出的三组示例# 当 a 已定义时定义 x 和 y a /x y 1./ # 当 a 未定义时定义 x 和 y a /1#/; x y 1 # 依赖 a 是否存在定义 x 或 y二者之一 a /(x1);/;(y1);?这里的机关在于正则字面量与/的歧义解析当a被定义为某变量时后续/.../会被解析为除法运算包裹的表达式当a未定义时同一串字符中的/则被解析为正则/注释的定界符从而使其中嵌着的赋值语句以不同方式激活。这是典型的同一段源码、两种解析技巧——colorize依赖的正是解析器作出的分类。技巧二局部变量重置Local Variables Reset局部变量可以通过进入新的def方法作用域被清空x y z 1 def f # x, y, z are clearedx、y、z 在此作用域内不可见/已重置从源码结构看这与 Ruby 的局部变量按作用域独立分配解析阶段按作用域收集局部变量名的既有行为一致即新def体内的局部变量集合与外层无关。技巧三状态跨作用域传递State Carry Over重置作用域会丢掉状态因此需要把进位/当前位之类的状态带入下一个def作用域。文档给出两种写法a /%/i; b /%-/i; def f(x)# ; def f(y) # -; def f(z)a %(A); b %(B); def f xC A yC B zC C在以上两个例子中新作用域内定义的局部变量取决于外层状态a、b是否存在x # 当 a 和 b 都未定义时 y # 当 a 已定义时 z # 当 b 已定义时第一个例子利用def f(x)的形参把状态带进新作用域根据a/b的解析结果激活的是f(x)、f(y)还是f(z)这一行第二个例子利用heredoc 定界符匹配A/B/C哪个 heredoc 被解析为字符串、哪个被解析为正则/注释决定了x、y、z中哪一行生效。两个技巧结合Ruby 语法就能把两个状态位传递进下一个def作用域。在本系统里这两个状态位分别表示十位upper digit与个位lower digit——这正是纯语法实现全加器所需的最小状态宽度一位相加两个操作数位 进位 → 结果位 新进位。文件结构12 个文件如何拼成一条计算链文档 File Structure 小节给出的骨架(code)为生成器产出的具体语法片段# 文件 0、1、2、3、4、5、6、7、8、9 (code) # 文件 (code) def f(arg)# 文件 (code) if exit以cat 1 2 3 4 5 为例拼接后的逻辑骨架是# cat 1 2 3 4 5 (one) (two) (plus) def f(arg) (three) (plus) def f(arg) (four) (five) (equal) if exit结构要点数字文件以(code) 结尾——短路求值使后面的片段只有在前面状态为真时参与解析同时保证脚本整体是 no-op文件末尾带def f(arg)——每遇到一个加数就开一个新的def f单行作用域触发局部变量重置并把通过技巧三传递进来的两个状态位十位/个位作为该加数的输入文件以(code) if exit收尾——if exit在语法上闭合结构使拼接脚本成为合法且无副作用的 Ruby 程序。从生成器 entry.rb 的源码结构可以印证这一设计脚本尾部显式地用File.write产出三类文件——10.times { |i| ... F.write #{i}, ...写0~9每个文件以))结尾对应数字文件的(code) 形态、F.write 内容以def f相关片段及A/Bheredoc 机关构成对应加号文件的def f(arg)与状态传递段、以及F.write , ... )if~exit对应等号文件的(code) if exit。整个 entry.rb 只有 74 行却内联生成了全部 12 个文件所需的复杂语法片段本身也是 TRICK 竞赛式的压缩写法。小结语法即计算该作品把计算从运行时搬到了解析阶段机制对应组件语法依据存储局部变量存在与否解析器按作用域收集局部变量名控制流条件局部变量定义/在除法与正则/注释间的双重解析状态清零进入新def作用域局部变量作用域隔离状态传递形参 / heredoc 定界符匹配def f(x)、A/B的解析激活结果可视化ruby -run -e colorize语法 token 分类映射到不同颜色它证明了 Ruby 语法中同形异义的解析特性正则字面量、heredoc、短路、if修饰符等足以承载一个十进制加法器的状态机同时受两位数操作数、结果小于 100 的约束。相关背景与完整获奖作品清单见 sample/trick2025/README.mdTRICK 2025 前五名收录目录含 Most Revolutionary、Most Useful、Most Arithmetic、Best ASMR、Most Maintainable 五个奖项作者信息见 authors.markdown。【免费下载链接】rubyThe Ruby Programming Language项目地址: https://gitcode.com/GitHub_Trending/ru/ruby创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考