Interview with oofoe about REBOL, Forth, Decker, Janet and the VFx Industry

Interview with oofoe about REBOL, Forth, Decker, Janet and the VFx Industry

Aug 2026 - Alex Alejandre@oofoe (sourcehut) is a REBOL-refugee comes from animation and now works on precision instrument software. He makes puzzles in Decker and games in Janet (using his Janet->JavaScript transpiler) and Racket and Racket and, again, Racket and Racket and even visual novels. In this interview, we discuss: DSL design, exotic languages (REBOL, Forth, Janet), Decker, and industrial domains (VFx).

2026年8月——Alex Alejandre(@oofoe,sourcehut)是一位来自动画行业的 REBOL “难民”,目前从事精密仪器软件开发。他使用 Decker 制作解谜游戏,使用 Janet(通过他自制的 Janet 转 JavaScript 编译器)制作游戏,同时也使用 Racket,以及 Racket,还有 Racket,甚至还制作视觉小说。在本次采访中,我们讨论了 DSL 设计、小众语言(REBOL、Forth、Janet)、Decker 以及工业领域(视觉特效 VFx)。


Do you know of any resources to set up additional targets in %project.janet?

你知道有哪些资源可以用来在 %project.janet 中设置额外的目标吗?

This can be good, but what’s the %?

这可能很有用,但那个 % 是什么意思?

Oh, sorry… The % business is a holdover from REBOL that I took up with. They indicate file paths to the parser with a leading percent sign. So you can say things like write %survey.csv data and you don’t need quotes around the path like most other languages. REBOL had something like 20+ types that the parser understood. REBOL was my first introduction to PEG (which led me to Janet…)

哦,抱歉……这个 % 的用法是我从 REBOL 那里沿用过来的习惯。在 REBOL 中,它们通过前导百分号向解析器指示文件路径。所以你可以写出类似 write %survey.csv data 这样的代码,而不需要像大多数其他语言那样在路径周围加引号。REBOL 的解析器能识别大约 20 多种类型。REBOL 是我接触 PEG(解析表达式文法)的起点(这也引导我走向了 Janet……)。


Oh! Please shill REBOL! This is now an interview.

哦!请尽情安利 REBOL 吧!现在这正式成为一场采访了。

REBOL had four things really going for it (in my opinion): A very simple, concise syntax, Built-in, first-class PEG (parsing expression grammars), An AMAZING declarative GUI library, And, between the docstring features and decompiler, it was self-documenting.

在我看来,REBOL 有四个真正的优势:非常简洁的语法;内置的一等公民 PEG(解析表达式文法);一个令人惊叹的声明式 GUI 库;以及介于文档字符串功能和反编译器之间的自文档化特性。

Here is a digital clock application with GUI in REBOL: view layout[origin 0 t: h1 red black (to string! now/time) rate 1 feel[engage: [t/text: now/time show t]]] Now, that’s a purposely code-golfed example, but it gives you an idea of how small you can go. But you can go big too – I taught myself the fine points of the GUI that weren’t covered in the manual by decompiling the VID dialect and pulling on the levers thus revealed. I then used it to build (among other things) a visual video editor, tools to ingest and process stuff into a professional editing package, and lots and lots of utilities that could have nice interfaces because they were so easy to do in REBOL.

这是一个用 REBOL 编写的带 GUI 的数字时钟应用:view layout[origin 0 t: h1 red black (to string! now/time) rate 1 feel[engage: [t/text: now/time show t]]]。这是一个刻意压缩代码的例子,但它让你了解程序可以写得多么精简。当然,你也可以写大型程序——我通过反编译 VID 方言并利用由此揭示的机制,自学了手册中未涵盖的 GUI 细节。随后,我用它构建了(包括但不限于)一个可视化视频编辑器、用于将素材导入并处理到专业编辑包中的工具,以及大量因为在 REBOL 中实现起来非常容易而拥有精美界面的实用程序。

This is a simple visual flow-based compositor that I did for a contest at work a while back: https://hg.sr.ht/~oofoe/tc

这是一个我前阵子为公司比赛制作的简单的基于可视化流程的合成器:https://hg.sr.ht/~oofoe/tc

Unfortunately, despite its incredible capabilities and genius antecedents (designed by Carl Sassenrath, who did the Amiga operating system), REBOL was eventually discontinued. So I found myself looking at other languages.

遗憾的是,尽管 REBOL 拥有令人难以置信的功能和天才般的前身(由设计了 Amiga 操作系统的 Carl Sassenrath 设计),但它最终还是停产了。所以我开始寻找其他语言。

Janet has surpassed REBOL in the PEG category because of how it handles the grammar. And it’s not too far behind in the self-documenting sweepstakes. Syntax… Well, Janet’s a Lisp and REBOL took inspiration from SmallTalk and Forth. Unfortunately Janet has no “decent” GUI bindings yet. Probably a difficulty of making threading work? I once put together a REBOL style declarative GUI package for Python, so have considered doing that for Janet with RayLib. But haven’t gotten around to it.

Janet 在 PEG 类别上已经超越了 REBOL,因为它处理文法的方式更出色。在自文档化方面,它也相差不远。至于语法……嗯,Janet 是一门 Lisp 语言,而 REBOL 的灵感来自 SmallTalk 和 Forth。遗憾的是,Janet 目前还没有“像样”的 GUI 绑定。可能是因为实现线程化比较困难?我曾经为 Python 写过一个 REBOL 风格的声明式 GUI 包,所以考虑过用 RayLib 为 Janet 也做一个,但一直没腾出手来。


Why did Sassenrath quit?

Sassenrath 为什么要退出?

It was tragic that Carl Sassenrath (the guy who invented it) decided to quit (and run a vineyard) before taking it to 64bit, but on the other hand, maybe it was the right decision, because his idea of “programming in the small” had a hard time finding a receptive audience, even though it was spot on. It also didn’t help that his company hoped to charge for a higher-spec professional version of REBOL during the era when free Python, Ruby and JavaScript were stomping around the world in seven-league boots. I really loved REBOL, though, for me it just worked.

Carl Sassenrath(REBOL 的发明者)在将其升级到 64 位之前决定退出(去经营葡萄园)确实是个悲剧,但从另一方面看,这也许是正确的决定,因为他的“小规模编程”(programming in the small)理念虽然非常精准,却很难找到受众。此外,他的公司希望在那个免费的 Python、Ruby 和 JavaScript 飞速席卷全球的时代,对更高规格的专业版 REBOL 收费,这也没能起到帮助。但我真的很喜欢 REBOL,因为它对我来说非常顺手。


Programming in the small?

什么是“小规模编程”?

Wikipedia has a bit about it, but here’s his manifesto. “Programming in the small” is the idea that programs don’t have to be big and complex to be useful and robust. Part of that philosophy was achieved by having lots of useful data types in REBOL (e.g. 16:34 is a time, 2021-05-19 is a date, 34x994 is a coordinate and so on. You didn’t have to do anything special (like import libraries), you could just use them. The other part is stuff like “global variables are good enough” and not worrying too much about side effects. You’re making a small program that does a limited set of things, it doesn’t have to be a big interoperating thing (like anything in Java), or have lots of ceremony, like C++.

维基百科对此有一些介绍,但这是他的宣言。“小规模编程”的核心理念是:程序不必庞大复杂也能变得有用且健壮。这一理念的部分实现得益于 REBOL 中内置了大量有用的数据类型(例如,16:34 是时间,2021-05-19 是日期,34x994 是坐标等等)。你不需要做任何特殊操作(比如导入库),直接就能用。另一部分则是像“全局变量就足够好了”这样的观点,不必太担心副作用。你编写的是一个只做有限事情的小程序,它不需要像 Java 那样成为一个庞大的互操作系统,也不需要像 C++ 那样有繁琐的仪式感。

I favour human-sized code bases. Giant edifices of code are rarely justified (or justifiable) and often obviated by reframing the questions you’re trying to answer. (Yes, there are exceptions – a state of the art optimized graphics renderer probably won’t be less than 500 lines (ha!) and if you want a feature-complete reimplementation of Micro$oft Word, well…) However, even when doing somewhat complex things (render farm control software, multi-user studio management system, etc.) I try to make the data control the flow – the code itself is fairly simple and “obvious” once you’ve seen how the data is organized.

我偏爱人类可控规模的代码库。庞大的代码大厦很少是合理的(或可被证明合理的),而且往往可以通过重新构思你要解决的问题来避免。 (是的,也有例外——最先进的优化图形渲染器可能不会少于 500 行(哈!),如果你想要一个功能完备的 Microsoft Word 重实现,那另当别论……) 然而,即使在处理一些复杂的事情(渲染农场控制软件、多用户工作室管理系统等)时,我也尽量让数据来控制流程——一旦你了解了数据的组织方式,代码本身就变得相当简单且“显而易见”了。

I am greatly informed by Forth. “Proper” Forth development consists of creating the vocabulary required to solve your problem, but you don’t have to throw away the rest of Forth. In Forth, a DSL is basically an emergent property of the language – you have all the same tools as the language implementer at your disposal. Things do generally have a “forthy” feel to them when you’re done (although some people have implemented FORTRAN, BASIC and even C in Forth…), but that’s generally no defect when you’re working in an environment that supports it.

我深受 Forth 的影响。“正统”的 Forth 开发在于创建解决问题所需的词汇表,但你不需要抛弃 Forth 的其余部分。在 Forth 中,DSL 基本上是语言的一种涌现属性——你拥有与语言实现者完全相同的工具。当你完成工作时,事情通常会有一种“Forth 味”(尽管有些人已经在 Forth 中实现了 FORTRAN、BASIC 甚至 C……),但这在支持它的环境中通常不是什么缺陷。

For whatever reason, DSLs in other languages seem (to me) to require an extra mental step because they’re divorced from the language proper. Like, say, Racket. You can do other languages and syntax in it, but it’s such a bother.

无论出于什么原因,其他语言中的 DSL 在我看来似乎都需要额外的思维步骤,因为它们与语言本身是脱节的。比如 Racket,你可以在其中实现其他语言和语法,但这太麻烦了。

That said, most of my Forth programs have been fairly small by the standards of ray tracers or word processors. My render-farm controller was Forth-based, but it had a fairly simple job once I re-framed the assumptions. I suspect I would approach word-processing the same way – i.e. it wouldn’t look like MSWord. ; - ) I used to joke that all the programs I’ve written in my career would fit on a single 1.44MB floppy. I don’t think that’s true any longer, but I try.

话虽如此,按照光线追踪器或文字处理器的标准,我的大多数 Forth 程序都相当小。我的渲染农场控制器是基于 Forth 的,但一旦我重新构思了假设,它的工作就变得相当简单。我猜我会用同样的方式处理文字处理——也就是说,它看起来不会像 MSWord。; - ) 我过去常开玩笑说,我职业生涯中写的所有程序都能装进一张 1.44MB 的软盘里。现在我不认为这还是真的了,但我一直在努力。

Forth also likes global variables. Chuck Moore said local vars are dangerous.

Forth 也喜欢全局变量。Chuck Moore 说过局部变量是危险的。

Forth uses the stack for what people would t…

Forth 使用栈来处理人们通常会用 t…(原文截断)