parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Проблема получения типа аргумента

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" то уже произойдет выполнение. Именно это нужно избежать.