&引用;如何将Red应用于此Lisp代码的编译时优化?”;

&引用;如何将Red应用于此Lisp代码的编译时优化?”;,lisp,compiler-optimization,red,Lisp,Compiler Optimization,Red,这是我想用红色实现的Lisp代码中的优化模式: (defmacro compute-at-compile (x) `(+ ,(* pi 2) ,x)) (macroexpand '(compute-at-compile 1)) ; => (+ 6.283185307179586 1) 我该如何用红色表示?(我意识到这在今天的实现中可能是不可能的,我想知道如何在语言级别表达代码以获得这样的优化。它需要在源代码中使用特殊的标记,还是像Lisp一样是自动的?)我试图扩展我的答案,以涵盖另

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

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

(macroexpand '(compute-at-compile 1))
; => (+ 6.283185307179586 1)

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

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

红色/系统

据我所知,Red/System
#define
指令有助于优化(减少函数调用)。下面是一个红色/红色系统中的类似示例。在红色范围内,需要在
#系统
#系统全局
指令内使用

#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时会遇到问题
整数(因此上面使用了float!)

红色/Rebol

您还可以查看
compose
,将其作为优化代码编写的更高级方法。我不确定在优化速度方面的效果。compose所做的是取一个块并计算括号中的任何内容,而不是计算块中的其他元素

有关
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]

你也有Rebol的例子吗?谢谢你的红色回答。Red/System是一种类似C的语言。我不是这方面的专家,但经过一点阅读,我决定建议您编写
compose
,因为它可能更符合您在编写代码时减少重复的要求。Common Lisp也是Lisp的一种方言。宏的表达方式或使用的方言在我看来似乎无关紧要。我同意使用的方言与您的具体问题无关(除了Scheme宏不同,呵呵),但是,与Clojure(或Scheme或Arc)相比,很少有人反对将CL代码标记为“Lisp”,仅仅从Clojure/Scheme上的帖子数量来判断,如果OP贴上标签,那么它就会被(主要是)CL海报取消标签。这就是为什么我把代码转换成CL而不是说,它是我的主要语言,它比我更熟练,在任何情况下,普通LISP、Stuty、CljueLe和ARC都有很大的不同(以同样的方式,C++、Perl、java、JS和PHP)有很大的不同,尽管这些语言具有C风格语法。(
表示(…;…;…)
,大括号表示块,等等),可能最好正确标记代码的语言。特别是,我通常避免将Scheme、Clojure或Arc代码标记为“Lisp”。更具体是一个好主意。由于每个Lisp中的宏非常相似,所以我一般使用Lisp(不一样,但类似于各种c语言中for循环的不同),总之,我要说的是……我会更具体一些。