рутина для оценки кода или передачи через UDP - PullRequest
1 голос
/ 27 мая 2010

У меня есть код, который, в зависимости от того, как запускается программа, будет либо выполняться локально, либо отправляться на удаленный компьютер для выполнения. В идеале, я думаю, это могло бы сработать так:

line_of_code = 'do_something_or_other();';

if execute_remotely
    send_via_udp(line_of_code);
else
    eval(line_of_code);
end

Дело в том, что я знаю, что функция eval() смехотворно неэффективна. С другой стороны, если я выписываю line_of_code в каждом разделе блока if, это открывает дверь для ошибок. Есть ли другой способ, которым я могу сделать это более эффективно, чем просто с помощью eval()?

1 Ответ

3 голосов
/ 27 мая 2010

РЕДАКТИРОВАТЬ: После дополнительного рассмотрения и некоторого обсуждения в комментариях у меня есть сомнения, что дескрипторы функций могут передаваться через UDP. Поэтому я обновляю свой ответ, вместо этого предлагая использовать функцию FUNC2STR для преобразования дескриптора функции в строку для передачи, затем использую функцию STR2FUNC для преобразования ее обратно в снова обработать ручку после передачи ...

Чтобы обойти использование EVAL , вы можете использовать дескриптор функции вместо сохранения строки кода, которая будет выполняться в строке:

fcnToEvaluate = @do_something_or_other;  %# Get a handle to the function

if execute_remotely
  fcnString = func2str(fcnToEvaluate);   %# Construct a function name string
                                         %#   from the function handle
  send_via_udp(fcnString);               %# Pass the function name string
else
  fcnToEvaluate();                       %# Evaluate the function
end

Вышеприведенное предполагает, что функция do_something_or_other уже существует. Затем вы можете сделать что-то вроде следующего в удаленной системе:

fcnString = receive_via_udp();        %# Get the function name string
fcnToEvaluate = str2func(fcnString);  %# Construct a function handle from
                                      %#   the function name string
fcnToEvaluate();                      %# Evaluate the function

Пока код (т.е. m-файл) для функции do_something_or_other существует как в локальной, так и в удаленной системах, я думаю, что это должно работать. Обратите внимание, что вы также можете использовать FEVAL для оценки строки имени функции, вместо того, чтобы сначала преобразовать ее в дескриптор функции.

Если вам нужно создать функцию на лету, вы можете инициализировать fcnToEvaluate как анонимную функцию в своем коде:

fcnToEvaluate = @() disp('Hello World!');  %# Create an anonymous function

И код для отправки, получения и оценки должен быть таким же, как указано выше.

Если у вас также есть аргументы для передачи в вашу функцию, вы можете поместить дескриптор функции и ввести аргументы в массив ячеек . Например:

fcnToEvaluate = @(x,y) x+y;  %# An anonymous function to add 2 values
inArg1 = 2;                  %# First input argument
inArg2 = 5;                  %# Second input argument
cellArray = {fcnToEvaluate inArg1 inArg2};  %# Create a cell array

if execute_remotely
  cellArray{1} = func2str(cellArray{1});  %# Construct a function name string
                                          %#   from the function handle
  send_via_udp(cellArray);                %# Pass the cell array
else
  cellArray{1}(cellArray{2:end});  %# Evaluate the function with the inputs
end

В этом случае код для send_via_udp может разбить массив ячеек и отправить каждую ячейку отдельно. Полученная строка имени функции снова должна быть преобразована обратно в дескриптор функции, используя STR2FUNC .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...