Попытка продлить мой ответ, возможно, охватывает другую идею, которая может помочь вам найти то, что вы ищете.
Красный/Система
Из моего понимания, директива 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]
Common Lisp - это также диалект Лиспа. То, как выражается макрос или какой диалект используется, кажется мне неактуальным. –
Я согласен с тем, что используемый диалект не имеет значения для вашего конкретного вопроса (за исключением того, что макросы Scheme отличаются друг от друга, хех), но меньше людей возражают против CL-кода, помеченного как «Lisp», чем Clojure (или Scheme или Arc), просто судя по количеству сообщений Clojure/Scheme на SO, где OP помечен [tag: lisp] только для того, чтобы он не был помечен (главным образом) плакатами CL. Вот почему я преобразовал ваш код в CL, а не, скажем, Scheme (это мой основной язык и на котором я гораздо более искусный, чем CL). –
В любом случае Common Lisp, Scheme, Clojure и Arc значительно отличаются друг от друга (так же, как C++, Perl, Java, JS и PHP значительно отличаются, несмотря на то, что эти языки имеют синтаксис C-стиля ('for (...; ...; ...)', фигурные скобки для блоков и т. д.)), и, вероятно, лучше всего правильно обозначить язык вашего кода.В частности, я бы вообще избегал маркировки кода Scheme, Clojure или Arc как «Lisp». –