Проблема получения типа аргумента
nkostya 07.12.2022 09:18
Иногда бывает такая необходимость, получить в аргумент данные и передать их в вызов следующей функции (например).
Первоначальный вызов может выглядеть
1. ^do(10)
2. ^do(10.4)
3. ^do[что-то]
Если do примерно так
@do[var]
^other[$var]
Если в do мы делаем просто ^other[$var], то для int|double мы теряем тип значения и оно конвертируется в string.
В случае с double это чревато искажением значения (потеря точности, т.к. не задан формат).
Для обхода этого можно в do написать условие, типа такого
^if($var is double){
^other($var)
}{
^other[$var]
}
Для каких-то случаев это подходит. Но когда таких вызовов много из класса в класс, то вызывает сложности...
Но есть более сложная ситуация, когда вызов может выглядеть так
4. ^do(3 * 4) - может быть выражение, логическое условие
или даже
5. ^do{$other_var}
Это можно проверить, определив через ^reflection:is[$var;...] что это code (junction).
Как можно понять каков тип вызова () или {}?
Больше интересует возможность определить что там будет int|double|bool или строка.
Требуется это, например, если мы хотим повторить логику ^table.sort() или ^table.sort{}
В итоге вопроса 2:
1. Есть ли вариант передачи значения в функцию с сохранением типа? (без хеша?)
2. Есть ли возможность понять тип вызова до обращения к переменной?
Если для {} проверить $var.CLASS_NAME eq "double" то уже произойдет выполнение. Именно это нужно избежать.
- Проблема получения типа аргумента, nkostya 07.12.2022 09:18