совместимость скриптов октава 3 и 4;где НАСТОЯЩАЯ документация по исполняемым программам-октавам - PullRequest
0 голосов
/ 19 ноября 2018

Часть-1: В октаве 3.4.3 (на centos 6.6) следующий файл сценария "joe.m" (но для 3.x минус --no-gui):

#!/bin/bash
# for-bash:
#{
  exec octave -q --no-gui --no-init-file "$0" ${1+"$@"}
#}
# for-octave:
function jim ()
  printf ("program_name: '%s'\n", program_name ());
endfunction
printf ("calling jim\n")
jim

производит вывод:

calling jim
program_name: 'joe.m'

Но в октаве 4.2.1 он выдает предупреждение и, по-видимому, автоматически вызывает (!?) jim и НЕ запускает непосредственный код верхнего уровня (!?), нет строки вывода "вызывающий jim":

warning: function name 'jim' does not agree with function filename '/tmp/joe.m'
program_name: 'joe.m'

Часть 2: Если я переименую тот же файл в "jim.m", то в октаве 3.4.4 вывод будет:

calling jim
program_name: 'jim.m'

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

Часть-3: Если определены нулевые функции, код верхнего уровня будет выполнятьсяв обеих версиях.

Где эти действия (и это изменение поведения от версии 3 до 4) документированы или контролируются?Ничего подобного не упоминается в:

https://octave.org/doc/v4.2.1/Command-Line-Options.html

https://octave.org/doc/v4.2.1/Executable-Octave-Programs.html

Как можно написать октавный файл, совместимый с версиями 3.x и 4.x, или как вызвать 4.x с дополнительной опцией, чтобы вести себя совместимо с 3.x?Как выполнить код верхнего уровня в 4.x, даже когда функции определены?

Как можно определенным образом (без проб и ошибок) определить, какая функция будет автоматически вызываться (и с какими аргументами) в 4.х без документации то же самое?Этого примера недостаточно, чтобы его закрепить, поскольку есть одна и только одна функция: если есть несколько функций (joe и jim), имеет ли значение порядок относительно того, совпадает ли одно или нет имя файла?

Редактировать: я включаю шебанг (автономный сценарий), пытаясь не «задавать неправильный вопрос» или преждевременно оптимизировать вопрос в соответствии с моим «попыткой решения», но поведение с ним или без него одинаково.Мне нужен скрипт, чтобы: не использовать абсолютный путь к октаве и принимать дополнительные отдельные опции (я не мог объединить --no-gui в -qf в 4.2.1).Ваши упрощения приветствуются.

1 Ответ

0 голосов
/ 19 ноября 2018

Существуют различные типы файлов .m, в том числе (в соответствии с Octave 4.2.1):

  1. Function файлы: Файл, содержащий определение одной или нескольких функций. Имя файла функции часто совпадает с именем первой функции, определенной в файле.
  2. Script файлы: Файл, содержащий строки кода, включая определение функций.

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

  3. Файлы определения класса.

Поведение Октавы при исполнении:

$octave File

задокументировано в одном из исходных файлов (oct-parse.yy) Octave:

Выполнить содержимое файла скрипта. Для совместимости с Matlab также выполните файл функции, вызвав определяемую ею функцию без аргументов и nargout = 0.

Здесь, поскольку ваш файл начинается с ключевого слова function , он считается функциональным файлом, поэтому функция jim вызывается автоматически независимо от того, вызываете ли вы jim или нет. Таким образом, вы можете удалить выражение jim из конца файла и увидеть, что функция вызывается автоматически. В версии 3.4.3 я думаю, что это предполагается как файл сценария.

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

#!/bin/bash
# for-bash:
#{
  exec octave -q --no-init-file "$0" ${1+"$@"}
#}
# for-octave:
1;
function jim ()
  printf ("program_name: '%s'\n", program_name ());
endfunction
printf ("calling jim\n")
jim
...