забавные коллизии скриптового языка Микротик

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

:global cuDte do={return ([/system clock get date]." ".[/system clock get time]);}
:global cuDte1 do={([/system clock get date]." ".[/system clock get time]);}
:log info [$cuDte]
:log info [$cuDte1]
:log info [len [$cuDte1]]
:log info [typeof [$cuDte]]
:log info [typeof [$cuDte1]]

В первом случае объявляется функция, возвращающая строку, во втором - возвращается массив даже без :return
Кто-нибудь может объяснить логику поведения ?


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Вероятно для РОС при

:global var do={([/system clock get date]." ".[/system clock get time]);}

происходит объявление массива, аналогично

:global var {:}

но с добавлением туда второго элемента конкатенацией ([/system clock get date]." ".[/system clock get time])

Почему это работает так - это бред разработчиков так как и возможность объявлять массивы без инициализации или так нужно для чего-то ?


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
pepelxl
Сообщения: 161
Зарегистрирован: 23 июл 2013, 18:47

Совсем с ясельного уровня объяснять не буду и конструкцию вида

Код: Выделить всё

([/system clock get date]." ".[/system clock get time])

опущу. Думаю вам понятно, что здесь происходит.
Скажу лишь, что в обоих случаях синтаксис позволяет опустить в конце ";". Точка с запятой используется для указания нескольких действий в одной строке.
теперь по вопросу - в обоих случаях в объявляете функцию, но в первом случае вы указываете что из функции должно вернуться, а во втором нет.
Теперь вспоминаем - код в любом языке выполняется последовательно(если не используются конструкции многопоточности). Возврат из функции может быть и не нужен.
Разбираем ваш пример:
дойдя до этой строки
:log info [$cuDte1]
точка выполнения переходит на действие [] , то есть точка прыгает внутрь функции и выполняет код внутри функции. Когда код выполнен, а возврат не указан, как перейти из функции обратно туда от куда была вызвана функция? Всё очень просто - функция всегда возвращает результат своих действий в виде массива, а указание return, это всего лишь одно из значений этого массива.
Сама структура массива не документирована, но я на просторах инета встречал подробное описание структуры вместе с примерами. Если не изменяет память это было где то на stackoverflow


Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Насчет ясельного уровня спасибо, вот только Вас никто ведь не пытался обидеть ... Я писал такие вещи на Ассемблере, какие многим и профи не снились, а такие как Вы тогда ещё пешком под стол ходили, так что не надо ... С языками высогоко уровня да, не дружил никогда. Когда я был в силе их просто не было почти. И с чего Вы взяли, что функция всегда возвращает массив ? В каком языке программирования и каком году тогда уточняйте. Вы хоть немного историю развития программирования знаете ?
как перейти из функции обратно туда от куда была вызвана функция? Всё очень просто - функция всегда возвращает результат своих действий в виде массива, а указание return, это всего лишь одно из значений этого массива.
А это вообще ни в какие ворота. Причём тут как перейти обратно туда откуда была вызвана функция и возврат данных из нее ? Функция это подпрограмма - положи на стек адрес возврата и процессор вернет тебя туда откуда тебя вызвали. Я не просил объяснять какие-то азы программирования - Вы школьный учитель что-ли ? Была просьба объяснить конретное поведение скриптового языка Микротик - какого хрена он при объявлении функции возвращает массив данных, когда его об этом не просили ? Это вероятно наследие Lua или правила поведения подобных языков, мне это не понятно, так как мы таких языков не писали никогда, даже в молодости.
А вы решили объяснять батюшке что такое церковь - да ... Нет с вами можно разговаривать только накушавшись изрядно гороху ...


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Ответить