Страница 1 из 1
забавные коллизии скриптового языка Микротик
Добавлено: 04 сен 2020, 22:04
Sertik
: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
Кто-нибудь может объяснить логику поведения ?
Re: забавные коллизии скриптового языка Микротик
Добавлено: 04 сен 2020, 22:27
Sertik
Вероятно для РОС при
:global var do={([/system clock get date]." ".[/system clock get time]);}
происходит объявление массива, аналогично
:global var {:}
но с добавлением туда второго элемента конкатенацией ([/system clock get date]." ".[/system clock get time])
Почему это работает так - это бред разработчиков так как и возможность объявлять массивы без инициализации или так нужно для чего-то ?
Re: забавные коллизии скриптового языка Микротик
Добавлено: 05 сен 2020, 09:25
pepelxl
Совсем с ясельного уровня объяснять не буду и конструкцию вида
Код: Выделить всё
([/system clock get date]." ".[/system clock get time])
опущу. Думаю вам понятно, что здесь происходит.
Скажу лишь, что в обоих случаях синтаксис позволяет опустить в конце ";". Точка с запятой используется для указания нескольких действий в одной строке.
теперь по вопросу - в обоих случаях в объявляете функцию, но в первом случае вы указываете что из функции должно вернуться, а во втором нет.
Теперь вспоминаем - код в любом языке выполняется последовательно(если не используются конструкции многопоточности). Возврат из функции может быть и не нужен.
Разбираем ваш пример:
дойдя до этой строки
:log info [$cuDte1]
точка выполнения переходит на действие [] , то есть точка прыгает внутрь функции и выполняет код внутри функции. Когда код выполнен, а возврат не указан, как перейти из функции обратно туда от куда была вызвана функция? Всё очень просто - функция всегда возвращает результат своих действий в виде массива, а указание return, это всего лишь одно из значений этого массива.
Сама структура массива не документирована, но я на просторах инета встречал подробное описание структуры вместе с примерами. Если не изменяет память это было где то на stackoverflow
Re: забавные коллизии скриптового языка Микротик
Добавлено: 06 сен 2020, 23:13
Sertik
Насчет ясельного уровня спасибо, вот только Вас никто ведь не пытался обидеть ... Я писал такие вещи на Ассемблере, какие многим и профи не снились, а такие как Вы тогда ещё пешком под стол ходили, так что не надо ... С языками высогоко уровня да, не дружил никогда. Когда я был в силе их просто не было почти. И с чего Вы взяли, что функция всегда возвращает массив ? В каком языке программирования и каком году тогда уточняйте. Вы хоть немного историю развития программирования знаете ?
как перейти из функции обратно туда от куда была вызвана функция? Всё очень просто - функция всегда возвращает результат своих действий в виде массива, а указание return, это всего лишь одно из значений этого массива.
А это вообще ни в какие ворота. Причём тут как перейти обратно туда откуда была вызвана функция и возврат данных из нее ? Функция это подпрограмма - положи на стек адрес возврата и процессор вернет тебя туда откуда тебя вызвали. Я не просил объяснять какие-то азы программирования - Вы школьный учитель что-ли ? Была просьба объяснить конретное поведение скриптового языка Микротик - какого хрена он при объявлении функции возвращает массив данных, когда его об этом не просили ? Это вероятно наследие Lua или правила поведения подобных языков, мне это не понятно, так как мы таких языков не писали никогда, даже в молодости.
А вы решили объяснять батюшке что такое церковь - да ... Нет с вами можно разговаривать только накушавшись изрядно гороху ...