Use of 'any' type

It would be most convenient if the ‘any’ type could defer type checking until runtime at the script level.

For instance, if both A & B are defined as type ‘any’, a compile time error

“illegal comparison (A < B)”

occurs upon encountering a bro statement

if (A < B) do_something();

even if the actual values stored in A & B at runtime are integral types for which comparison makes sense.

If the decision could be made at runtime (which could then potentially throw an error), a number of useful generic functions could be created at the script level, rather than creating yet-another-bif. A useful yet-another-bif would be ‘typeof’ to allow varying code paths based on the type of value actually stored in ‘any’.

Any comments?

Jim

Hi Jim,

It would be most convenient if the 'any' type could defer type checking
until runtime at the script level.

For instance, if both A & B are defined as type 'any', a compile time error

"illegal comparison (A < B)"

occurs upon encountering a bro statement

if (A < B) do_something();

even if the actual values stored in A & B at runtime are integral types for
which comparison makes sense.

I think this is a bit hard to do with how things are set up at the moment internally - and it also does make type-checking at startup less possible-helpful.

However...

If the decision could be made at runtime (which could then potentially
throw an error), a number of useful generic functions could be created at
the script level, rather than creating yet-another-bif. A useful
yet-another-bif would be 'typeof' to allow varying code paths based on the
type of value actually stored in 'any'.

This already exists and I think you can actually use it to write code like that; you just have to cast your any-type to the correct type first. The function you want is type_name; it is e.g. used in base/utils/json.bro.

Johanna

Thanks, Johanna - I think type_name() may suffice for the purposes I am envisioning.

In the master branch, there are also type checking/casting 'is' and
'as' operators [1] and type-based switch statement [2] that may be be
useful.

- Jon

[1] https://www.bro.org/sphinx-git/script-reference/operators.html
[2] https://www.bro.org/sphinx-git/script-reference/statements.html#keyword-switch

Actually, the ‘as’ operator is useful, since it appears that ‘any’ can currently only be cast into a string otherwise…