Совместимость скриптов с октавой 3 и 4; где НАСТОЯЩАЯ документация Executable-Octave-Programs

Часть-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, и НЕ запускает немедленный код верхнего уровня (!?), нет строки вывода "call 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.x без соответствующей документации? Этого примера недостаточно, чтобы закрепить его, поскольку есть одна и только одна функция: если есть несколько функций (joe и jim), имеет ли значение порядок относительно того, соответствует ли одна или ни одна из них имени файла?

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

Если строка shebang не имеет отношения к вопросу, удалите ее. Мне потребовалось время, чтобы разобрать это. Позвольте людям сосредоточиться на том, что для является важно. См. минимальный воспроизводимый пример (особенно часть минимальный!).

Cris Luengo 19.11.2018 15:15

Спасибо. Я сделал правку, чтобы объяснить. Может быть, мне лучше выделить шебанг на послесловие.

bk-se 20.11.2018 21:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
303
1

Ответы 1

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

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

    Unlike a function file, a script file must not begin with the keyword function . If it does, Octave will assume that it is a function file, and that it defines a single function that should be evaluated as soon as it is defined.

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

Поведение Octave при выполнении как:

$octave File

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

Execute the contents of a script file. For compatibility with Matlab, also execute a function file by calling the function it defines with no arguments and nargout = 0.

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

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

#!/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

Это большая помощь. Совместимость 3.x и 4.x все еще не решена. И я получаю бесплатные предупреждения (4.x кажется минным полем предупреждений), имя функции и имя файла предупреждают, когда они совпадают (файл сценария), а когда нет (файл функции).

bk-se 20.11.2018 22:04

Если вы хотите отключить предупреждения, вы можете поместить следующую команду в файл запуска: warning( 'off','Octave:function-name-clash'). Вы можете найти список всех предупреждений здесь. Я считаю, что поведение 3.x является ошибкой и будет исправлено позже. Если вам нужна 3.x, вы можете установить и 4.x, и 3.x и использовать то, что хотите.

rahnema1 20.11.2018 22:45

Я нашел единственный способ отключить предупреждение, когда файл сценария имеет функцию с тем же именем, - это warning( 'off','all');, и нет возможности сделать это вовремя при использовании -qf. Заставляет меня переименовывать функции (или файлы скриптов) из 3-й октавы, чтобы использовать их в 4-й октаве.

bk-se 21.11.2018 02:20

Другие вопросы по теме