Почему конечная запятая в массиве ячеек является допустимым синтаксисом Matlab?
Я был удивлен сегодня, чтобы обнаружить, что
A = {1,2,3}
и
B = {1,2,3,}
оба являются допустимым синтаксисом в MATLAB. Я ожидал, что второе утверждение приведет к ошибке. Насколько я могу судить, они производят идентичные массивы ячеек (all([A{:}]==[B{:}])
возвращает true).
есть ли причина, по которой разрешен второй синтаксис? Это ошибка в парсере? Are A
и B
действительно то же самое?
интригующе, следующее не разрешается:
C = {1,2,3,,,}
3 ответов
это скорее догадки, чем ответ.
можно проверить ссылка на символ на запятая ,
можно использовать как
разделитель команд или операторов
для ввода более одной команды или инструкции MATLAB в одной строке, разделите каждую команду или оператор запятой:
for k = 1:10, sum(A(k)), end
в строке
B = {1,2,3,}
поэтому заявление после 3
ожидается, есть только }
, что означает конец массива ячеек, действительное заявление.
на точка с запятой ;
имеет три официальных обычая:
Разделитель Строк Массива
при использовании в квадратных скобках для создания нового массива или объединения существующие массивы, точка с запятой создает новую строку в массиве:
A = [5, 8; 3, 4]
Выход Подавление
при размещении в конце команды точка с запятой сообщает MATLAB не вывести все выходные данные этой команды. В этом примере MATLAB не показать 100-на-100 матрица:
A = ones(100, 100);
команда или инструкция Сепаратор
как оператор запятой, вы можете ввести более одной команды MATLAB на линии, разделяя команды точкой с запятой. MATLAB подавляет вывод для тех команд, которые завершаются точкой с запятой, и отображает выходные данные для команд завершаются запятой.
в этом примере назначения переменных A и C завершаются с помощью точка с запятой, и, таким образом, не отображаются. Потому что назначение B запятая-прекращено, вывод этой команды отображается:
A = 12.5; B = 42.7, C = 1.25;
в строку
x = {1,2,3,;5,6,7}
это следует за действительным утверждением Разделитель Строк Массива после 3,
. После этого ожидается новое утверждение, которое в этом случае является double 5. Действительный.
Теперь рассмотрим случай
x = {1,2,3,;;;;4,5,6;;;}
, а после 3,
следующее заявление Строки Массива Сепаратор, а заявление после этого -предположительно на нулевая инструкция-NOP заимствовано из какого-то базового ядра программы, написанного в C, что в основном означает:ничего. Так после 3,;
следует три раза "ничего не делать", прежде чем придет следующее утверждение. не имеет смысла, как говорит вам Matlab:лишняя запятая ненужна. - но действует.
он также позволяет вам бессмысленные вещи, как:
if true
;
end
и предположительно и
C = {1,2,3,,,}
возвращает ошибку, потому что запятая ,
не нуль-заявлением, но после первой запятой ожидается заявление.
итог: это выглядит странно, но на самом деле мне кажется логикой, поскольку Matlab использует много C-кода внутренне и учитывая оператор null, все упомянутое является допустимым синтаксисом.
как насчет других langages?
точка с запятой используется как x = [1,2,3,;;;;4,5,6;;;]
в Python недопустимы, даже в предполагаемом клоне Matlab включает в себя, если не обернут в этот необычный синтаксис a = np.matrix('1,2,3;4,5,6')
.
a = np.matrix('1,2,3,;;;;4,5,6;;;')
бросил бы ошибку, а также ;
трактуется как Разделитель Строк Массива в любом случае, что делает компилятор жаловаться inconsitent размеры строки.
x = [1,2,3,]
также допустимый синтаксис в Python
и IronPython
, как это в VBScript
и Lua
как говорится в ответ mlepage. Что общего у всех этих языков? Все они (более или менее) являются языками сценариев, интерпретируемыми во время выполнения. Это не просто Matlab. Поэтому волнение ОП остается без причины.
многие языки позволяют один дополнительный разделитель элементов в списках, как уже упоминалось. Но это не имеет ничего общего с время выполнения анализа. Даже C позволяет это. Это связано с простотой использования. Это функция, предназначенная для помощи пользователю. Например, в C вы можете определить enum
следующим образом:
enum E {
a,
b,
c,
};
запятая после c
не требуется, но допускается. Это упрощает добавление и удаление элементов из такого списка, а также упрощает программную генерацию такой список (ответ mlepage правильно!).
таким образом, разрешение одной дополнительной запятой в конце является общим для большинства (если не всех) языков программирования, имеет смысл для MATLAB поддерживать его тоже. Дополнительная запятая в начале списка имеет меньше смысла, но я думаю, что они поддерживают ее, потому что это тоже не больно.
несколько запятых подряд не имеют смысла, это означало бы, что есть дополнительные элементы, которые неопределенный.
но что происходит с несколькими точками с запятой? As Луис Мендо упомянул, [1;;2]
является законным синтаксис. Это то, что значительно отличается от того, что делают другие языки.
однако это согласуется с использованием MATLAB разрыва строки. В MATLAB разрывы линий значительны. При определении массива с помощью []
, разрывы строк указывают на новые строки данных:
M = [ 1, 2, 3,
4, 5, 6,
7, 8, 9,
];
это же as
M = [1,2,3; 4,5,6; 7,8,9];
(обратите внимание, как разрешение запятых в конце каждой строки может быть удобно время от времени.)
(Также обратите внимание, что я использую []
здесь, чтобы объединить, точно такая же логика применяется к {}
.)
но поскольку MATLAB хочет разрешить как можно больше, пока он остается однозначным, вышеизложенное совпадает с:
M = [ 1, 2, 3,
4, 5, 6,
7, 8, 9,
];
если не помешает разрешить пустые строки, почему бы не разрешить их?
С каждой новой строки соответствует точке с запятой, вышеуказанное идентично:
M = [ 1, 2, 3,;...
4, 5, 6,;...
;...
;...
7, 8, 9,;...
];
, что соответствует
M = [ 1, 2, 3,; 4, 5, 6,; ; ; 7, 8, 9,; ];
и поэтому MATLAB должен быть в состоянии проанализировать это, имеет ли это смысл или нет.
ответ ответ thewaywewalk:
аргумент в том, что оба ,
и ;
определяются как разделители операторов, но почему-то предполагается, что ;;;
является действительным утверждением, тогда как ,,,
is не. Это просто неправда:
disp(0),,,disp(1)
disp(0);;;disp(1)
оба являются допустимым синтаксисом MATLAB (r2017a анализирует оба без ошибок).
кроме того, ответ смущает выражения и заявления. disp(0)
это заявление. The 0
в этом утверждении есть такое выражение. В M=[1,2,3]
, то через запятую выражения, а не утверждения. Запятые там не работают как разделители операторов.
фактически, в MATLAB запятая и точка с запятой имеет несколько значений, в зависимости от контекста. Запятая и точка с запятой в конце оператора (включая оператор null) отличаются от запятой и точкой с запятой в объединяющем выражении ([1,2;3,4]
). И запятая также может разделять выражения в скобках вызова функции, где точка с запятой не разрешена.
просто чтобы прояснить этот момент:
1,,,4
действителен, тогда как
[1,,,4]
нет. Запятая имеют различные функции в этих двух утверждениях.
короче говоря, логика, используемая в этом ответе, просто неверна.
удобно разрешить конечную пунктуацию на языках, если когда-либо код будет сгенерирован из другого кода.
например, Lua позволяет завершать запятые, поэтому легко генерировать код Lua.
вам не нужно иметь особый случай в генерирующем коде, чтобы опустить конечную запятую, вы можете просто распечатать элемент-затем-запятую для каждого элемента.