定义所有新语法是否会影响 Scheme、Racket 的性能?

Does defining all new syntaxes hurt performance in Scheme, Racket?

我正在使用 Racket define-syntax-parser 创建一个新语言。许多新语法甚至替换了基本形式。

我打算在生产中使用新语言,但不知道太多新语法是否会影响性能。

我应该编译成二进制还是类似的?

TL; DR:没有性能损失

您引入的语法在宏扩展时得到扩展。这意味着如果您执行 raco make ,它将用扩展形式替换所有宏的使用。

有时在制作功能时,您的扩展代码可能比您最初编写代码的方式更复杂。这也可能被 jit 编译器删除,就像其他未优化的代码一样。

有时您的功能需要更加复杂,无法简化为最简单的形式。在这种情况下,您可能会损失性能。

例如,覆盖 #%app 以执行数组和列表访问,而您通常会执行 (vector-ref vec 3),其中语法 (vec 3) 可以表示数组访问和应用程序。扩展可能会变成 (if (racket:#%app vector? vec) (racket:#%app vector-ref vec 3) (racket:#%app vec 3)),如果系统无法断定它不是 vector?,它将对每个应用程序进行测试。如果重新调整 [] 的用途,使它们只是数组访问 [vec 5] 可以很容易地变成 (vector-ref vec 3)(vec 5) 不会影响性能,但那也表示语法告诉您它是什么并且不太通用。