Как применить Red для оптимизации времени компиляции этого кода Lisp?

Это шаблон оптимизации кода Lisp, которого я хочу добиться в Red:

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

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

Как мне выразить это красным? (Я понимаю, что это может быть невозможно в сегодняшней реализации, мне интересно, как можно было бы выразить код на уровне языка, чтобы получить такую ​​​​оптимизацию. Потребуется ли для этого специальная разметка в исходном коде или это будет автоматически, как Lisp? )


person Jacob Good1    schedule 03.03.2014    source источник
comment
Common Lisp также является диалектом Lisp. То, как выражается макрос или какой диалект используется, кажется мне неважным.   -  person Jacob Good1    schedule 04.03.2014
comment
Я согласен с тем, что используемый диалект не имеет отношения к вашему конкретному вопросу (за исключением того, что макросы Scheme разные, хех), но меньше людей возражают против того, чтобы код CL был помечен как Lisp, чем Clojure (или Scheme или Arc), просто судя по количеству сообщений Clojure/Scheme на SO, где OP помечен lisp только для того, чтобы он не был помечен (в основном) плакатами CL. Вот почему я преобразовал ваш код в CL, а не, скажем, в Scheme (это мой основной язык, в котором я разбираюсь гораздо лучше, чем в CL).   -  person Chris Jester-Young    schedule 05.03.2014
comment
В любом случае, Common Lisp, Scheme, Clojure и Arc сильно отличаются друг от друга (точно так же сильно отличаются C++, Perl, Java, JS и PHP, несмотря на то, что эти языки имеют синтаксис в стиле C (for (...; ...; ...)). , фигурные скобки для блоков и т. д.)), и, вероятно, лучше всего правильно обозначить язык вашего кода. В частности, я обычно не называю код Scheme, Clojure или Arc кодом Lisp.   -  person Chris Jester-Young    schedule 05.03.2014
comment
Быть более конкретным - хорошая идея. Я оставил его в общем Lisp, так как макросы в каждом Lisp очень похожи (не одинаковы, но примерно как разница в цикле for в различных языках, вдохновленных c), в любом случае, точка взята ... Я буду более конкретным.   -  person Jacob Good1    schedule 05.03.2014


Ответы (1)


Пытаюсь расширить свой ответ, чтобы, возможно, охватить другую идею, которая может помочь вам найти то, что вы ищете.

Красный/Система

Насколько я понимаю, директива Red/System #define может помочь с оптимизацией (уменьшая количество вызовов функций). Вот аналогичный пример в Red/System. В Red это потребовало бы использования внутри #system или #system-globaldirective.

#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! (отсюда и вышеприведенное использование float!)

Красный/Ребол

Вы также можете взглянуть на 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]
person kealist    schedule 03.03.2014
comment
У вас случайно нет примера Rebol? Спасибо за красный ответ. - person Jacob Good1; 04.03.2014
comment
Red/System — это C-подобный язык. Я не эксперт в этом, но после небольшого чтения я решил предложить compose, потому что это может быть больше того, что вы ищете, чтобы уменьшить количество повторений при написании кода. - person kealist; 05.03.2014