"如何将Red应用于此Lisp代码的编译时优化?"

Jac*_*od1 7 lisp compiler-optimization red

这是我想用Red实现的Lisp代码优化模式:

(defmacro compute-at-compile (x)
  `(+ ,(* pi 2) ,x))

(macroexpand '(compute-at-compile 1))
; => (+ 6.283185307179586 1)
Run Code Online (Sandbox Code Playgroud)

我怎么用红色表达这个?(我意识到在今天的实现中可能无法实现,我想知道如何在语言级别表达代码以获得这样的优化.它是否需要源代码中的特殊标记,还是像Lisp一样自动化? )

kea*_*ist 2

尝试扩展我的答案,也许涵盖另一个可以帮助您找到所需内容的想法。

红色/系统

根据我的理解,Red/System#define指令可以帮助优化(减少函数调用)。这是 Red/System 中的类似示例。在 Red 中,需要使用 inside#system#system-global指令。

#define COMPUTE(x) (3.13159 * 2.0 + x)

b: COMPUTE(1.0)
print b
Run Code Online (Sandbox Code Playgroud)

处理宏应该导致:

b: (3.13159 * 2.0 + 1.0)
print b
Run Code Online (Sandbox Code Playgroud)

和结果

7.26318
Run Code Online (Sandbox Code Playgroud)

类型之间的数学尚未定义,因此您将遇到乘法/加法问题float!以及integer!(因此上面使用了浮点数!)

红色/叛逆

您还可以将其视为compose优化代码编写的更高级别的方法。我不确定优化速度方面的效果。compose 的作用是获取一个块并评估括号中的内容,而不评估块中的其他元素。

请参阅 Rebol2 帮助定义compose

>> help compose
USAGE:
    COMPOSE value /deep /only    

DESCRIPTION:
     Evaluates a block of expressions, only evaluating parens, and returns a block.
     COMPOSE is a native value.    

ARGUMENTS:
     value -- Block to compose (Type: any)    

REFINEMENTS:
     /deep -- Compose nested blocks
     /only -- Inserts a block value as a block
Run Code Online (Sandbox Code Playgroud)

这可能就是您在构建表达式方面正在寻找的内容

red>> x: 1
== 1
red>> compose [3 + 2 + (x)]
== [3 + 2 + 1]
Run Code Online (Sandbox Code Playgroud)

Rebol2 文档中的示例:

>> probe compose [time: (now/time) date: (now/date)]
[time: 12:48:53 date: 5-Mar-2014]
== [time: 12:48:53 date: 5-Mar-2014]
Run Code Online (Sandbox Code Playgroud)