Что происходит в вашем коде:
evalin('base', builtin('clear','x'));
означает, что builtin
оценивается в текущем контексте, и поскольку оно используется в качестве аргумента для evalin
, ожидается, что он выдаст выходные данные. Это точно так же, как:
ans = builtin('clear','x');
evalin('base',ans);
Сообщение об ошибке, которое вы видите, появляется в первой из этих двух строк кода, а не во второй. Это не из-за evalin
, который поддерживает операторы вызова, которые не создают выходной аргумент.
evalin
требует строку для оценки. Вам нужно построить эту строку:
str = 'builtin(''clear'',''x'')';
evalin('base',ans);
(В MATLAB символ кавычки экранируется путем удвоения его.)
Ваша функция будет выглядеть так:
function clear(var)
try
evalin('base',['builtin(''clear'',''',var,''')'])
catch
% ignore error
end
end
(Вставка строки в другую строку таким образом довольно неловко, одна из многих причин, по которой мне не нравятся eval
и друзья).
В этом случае может быть лучше использовать evalin('caller',...)
, чтобы при вызове нового clear
из функции он удалял что-то в рабочем пространстве функции, а не в базовом. Я думаю, что 'base'
следует использовать только из GUI, который, как ожидается, будет управлять переменными в рабочей области пользователя, а не из функции, которую можно вызывать где угодно и которая (в данном случае, по ее имени) будет делать что-то локальное.
Есть причины, по которым это может быть действительно полезным, но в целом вы должны стараться избегать использования clear
так же, как использование eval
и друзей. clear
замедляет выполнение программы. Гораздо проще (как для пользователя, так и для MATLAB JIT) назначить пустой массив переменной, чтобы удалить ее содержимое из памяти (как предложено rahnema1 в комментарии . Ваше базовое рабочее пространство не будет забит переменными, если вы использовали function
больше: пишите функции, а не скрипты!