Как я могу получить имена параметров функции в Matlab?
======================================================

Помимо синтаксического анализа файла функции, есть ли способ получить имена входных и выходных аргументов функции в matlab?

Например, дан следующий файл функции:

divide.m

```
<code>function [value, remain] = divide(left, right)
     value = floor(left / right);
     remain = left / right - value;
end
</code>
```

Из-за пределов функции я хочу получить массив выходных аргументов здесь:`['value', 'remain']`и аналогично для входных аргументов:`['left', 'right']`.

Есть ли простой способ сделать это в Matlab? Матлаб обычно, кажется, хорошо поддерживает рефлексию.

РЕДАКТИРОВАТЬ Фон:

Цель этого состоит в том, чтобы представить параметры функции в окне для входа пользователя. Я пишу своего рода программу обработки сигналов, и функции для выполнения операций с этими сигналами хранятся в подпапке. У меня уже есть список и имена каждой функции, из которых пользователь может выбирать, но некоторые функции требуют дополнительных аргументов (например, гладкая функция может принимать размер окна в качестве параметра).

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

 когда вы хотите разобрать[строка объявления функции](https://www.mathworks.com/help/matlab/ref/function.html) основной функции в файле (т. е. вы не будете иметь дело с[местные функции](https://www.mathworks.com/help/matlab/matlab_prog/local-functions.html), [вложенные функции](https://www.mathworks.com/help/matlab/matlab_prog/nested-functions.html), или же[анонимные функции](https://www.mathworks.com/help/matlab/matlab_prog/anonymous-functions.html)), то вы можете извлечь имена входных и выходных аргументовas they appear in the file используя некоторые стандартные строковые операции и[регулярные выражения](https://www.mathworks.com/help/matlab/ref/regexpi.html), Строка объявления функции имеет стандартный формат, но вам нужно учесть несколько вариантов из-за:

Varying amounts of white space or blank lines,
The presence of [single-line or block comments](https://www.mathworks.com/help/matlab/matlab_prog/comments.html), and
Having the declaration [broken up on more than one line](https://www.mathworks.com/help/matlab/matlab_prog/continue-long-statements-on-multiple-lines.html).

(It turns out that accounting for a block comment was the trickiest part...)

Я собрал функцию`get_arg_names` это будет обрабатывать все вышеизложенное. Если вы дадите ему путь к файлу функции, он вернет два массива ячеек, содержащих ваши строки входных и выходных параметров (или пустые массивы ячеек, если таковых нет). Обратите внимание, что функции с переменными списками ввода или вывода будут просто перечислять[`'varargin'`](https://www.mathworks.com/help/matlab/ref/varargin.html) или же[`'varargout'`](https://www.mathworks.com/help/matlab/ref/varargout.html)соответственно для имен переменных. Вот эта функция:



`inputname(argnum)` [http://www.mathworks.com/help/techdoc/ref/inputname.html](https://www.mathworks.com/help/techdoc/ref/inputname.html) . 



[карта контейнеров?](http://www.mathworks.co.uk/help/techdoc/matlab_prog/brqqo5e-1.html)

Вы можете написать свои функции по этим направлениям. , ,

... и называть их так ...

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



ользуя`meta` пакет), однако это доступно только для классов ООП, а не для обычных функций.

Один трюк состоит в том, чтобы написать определение класса «на лету», содержащее исходный код функции, которую вы хотели бы обработать, и позволить MATLAB разобраться с разбором исходного кода (что может быть непросто, как вы себе представляете: строка определения функции занимает несколько строк, комментарии перед фактическим определением и т.д ...)

Таким образом, временный файл, созданный в вашем случае, будет выглядеть так:

который затем может быть передан`meta.class.fromName` разобрать метаданные ...

Вот быстрая и грязная реализация этого хака:

и просто запустите как:



 невозможно) для общих функций (подумай о таких вещах, как varargin и т. Д.). Кроме того, в общем, полагаться на имена переменных как форму документации может быть ... не то, что вы хотите. Я собираюсь предложить другой подход.

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

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



содержимом (например, «отражение»), вы должны выйти за пределы языка.

Другой автор предложил «регулярные выражения», которые всегда терпят неудачу, когда применяются к анализу реальных программ, потому что регулярные выражения не могут анализировать контекстно-свободные языки.

Чтобы сделать это надежно, вам нужен настоящий синтаксический анализатор языка M, который предоставит вам доступ к дереву разбора. Тогда это довольно просто.

наш[DMS Software Reengineering Toolkit](http://www.semanticdesigns.com/Products/DMS/DMSToolkit.html) имеет для этого доступный синтаксический анализатор языка М и может это делать.