Объявить динамику c константу в максимах - PullRequest
1 голос
/ 25 февраля 2020

Мне нужно объявить переменную как константу, переменная генерируется во время работы программы, я пробовал так:

foo(var) := declare(''var, constant)$

foo(x)$

facts();

Но это не работает, и я получаю:

[kind(var, constant)]

каждый раз.

вместо:

[kind(x, constant)]

Когда я пишу код без функции, все работает отлично:

var: x$

declare(''var, constant)$

facts();

Я получаю:

[kind(x, constant)]

Кто-нибудь знает, как сделать это динамически с помощью функции ?

1 Ответ

1 голос
/ 25 февраля 2020

Обычный способ гарантировать, что аргументы оцениваются, даже для функций, которые в противном случае заключают в кавычки свои аргументы, - это apply функция для аргументов. Например:

apply (declare, [var, 'constant]);

Или в функции:

foo(var) := apply (declare, [var, 'constant]);

apply оценивает свои аргументы, поэтому аргументы оцениваются по времени, когда функция их видит.

Цитата ''var не имеет ожидаемого эффекта в функции, потому что цитата применяется только во время синтаксического анализа выражения. Поэтому любое последующее присвоение var не имеет никакого эффекта.

Я рекомендую против eval_string. Почти всегда есть лучший способ сделать что-либо, чем обработка строк; в этом случае лучший способ - apply.

...