这是我想在 Red 中实现的 Lisp 代码优化模式:
(defmacro compute-at-compile (x)
`(+ ,(* pi 2) ,x))
(macroexpand '(compute-at-compile 1))
; => (+ 6.283185307179586 1)
我如何用红色表达这个?(我意识到这在今天的实现中可能是不可能的,我想知道如何在语言级别表达代码以获得这样的优化。它需要在源代码中进行特殊标记,还是像 Lisp 一样自动? )
这是我想在 Red 中实现的 Lisp 代码优化模式:
(defmacro compute-at-compile (x)
`(+ ,(* pi 2) ,x))
(macroexpand '(compute-at-compile 1))
; => (+ 6.283185307179586 1)
我如何用红色表达这个?(我意识到这在今天的实现中可能是不可能的,我想知道如何在语言级别表达代码以获得这样的优化。它需要在源代码中进行特殊标记,还是像 Lisp 一样自动? )
试图扩展我的答案以涵盖另一个可以帮助您找到所需内容的想法。
红色/系统
据我了解,Red/System#define
指令可以帮助优化(减少函数调用)。这是 Red/System 中的一个类似示例。在 Red 中,它需要使用 within#system
或#system-global
指令。
#define COMPUTE(x) (3.13159 * 2.0 + x)
b: COMPUTE(1.0)
print b
处理宏应导致:
b: (3.13159 * 2.0 + 1.0)
print b
和结果
7.26318
类型之间的数学还没有定义,所以你会遇到乘法/加法的问题float!
(integer!
因此上面使用了浮点数!)
红色/Rebol
您还可以将其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
这可能是您在构建表达式方面正在寻找的内容
red>> x: 1
== 1
red>> compose [3 + 2 + (x)]
== [3 + 2 + 1]
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]