2014-03-03 3 views
7

Это модель оптимизации в Lisp код, который я хочу достичь в красном:«Как применить Red для оптимизации кода этого Lisp-кода?»

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

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

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

+0

Common Lisp - это также диалект Лиспа. То, как выражается макрос или какой диалект используется, кажется мне неактуальным. –

+0

Я согласен с тем, что используемый диалект не имеет значения для вашего конкретного вопроса (за исключением того, что макросы Scheme отличаются друг от друга, хех), но меньше людей возражают против CL-кода, помеченного как «Lisp», чем Clojure (или Scheme или Arc), просто судя по количеству сообщений Clojure/Scheme на SO, где OP помечен [tag: lisp] только для того, чтобы он не был помечен (главным образом) плакатами CL. Вот почему я преобразовал ваш код в CL, а не, скажем, Scheme (это мой основной язык и на котором я гораздо более искусный, чем CL). –

+0

В любом случае Common Lisp, Scheme, Clojure и Arc значительно отличаются друг от друга (так же, как C++, Perl, Java, JS и PHP значительно отличаются, несмотря на то, что эти языки имеют синтаксис C-стиля ('for (...; ...; ...)', фигурные скобки для блоков и т. д.)), и, вероятно, лучше всего правильно обозначить язык вашего кода.В частности, я бы вообще избегал маркировки кода Scheme, Clojure или Arc как «Lisp». –

ответ

2

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

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

Из моего понимания, директива Red/System #define может помочь с оптимизацией (в сокращении вызовов функций). Вот аналогичный пример в Red/System. Внутри Red это потребует использования в пределах #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 

Math между типами еще не определена, так что вы будете работать в вопросах умножения/добавления float! и integer! (отсюда использование поплавка!)

Red/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] 
+0

У вас также есть пример Rebol? Спасибо за красный ответ. –

+0

Red/System - это C-подобный язык. Я не эксперт в этом, но после небольшого чтения я решил предложить 'compose', потому что это может быть больше того, что вы ищете, чтобы уменьшить повторение при написании кода. – kealist

 Смежные вопросы

  • Нет связанных вопросов^_^