Remix.run Logo
fpoling 5 hours ago

Arbitrary subranges of int types were available in Ada for over 40 years via static enforcement via Spark and compilers were able to optimize them nicely.

For a system language I wish Rust would support such things rather than coming with NonZero hacks.

steveklabnik 4 hours ago | parent | next [-]

This is called "pattern types" in Rust land, as your parent mentioned, and is exactly the kind of work being talked about.

NonZero isn't a hack: it's an example of a common pattern. If pattern types were available today, you'd still want NonZero, as an example of a pretty standard pattern.

The idea is, as always: prove out the specific version, then generalize.

BoingBoomTschak 3 hours ago | parent | prev [-]

Can it do holes like this?

  (typep 3 '(or (integer 0 10) (integer 50 100)));; => T
steveklabnik 3 hours ago | parent [-]

You can use a "subtype predicate" for this: https://learn.adacore.com/courses/Ada_For_The_CPP_Java_Devel...

BoingBoomTschak 2 hours ago | parent [-]

Might be less efficient, no? At least in CL (https://www.lispworks.com/documentation/HyperSpec/Body/t_sat...) this is the case, that static type analysis isn't clever enough to work with predicate based types.

steveklabnik 2 hours ago | parent [-]

I don't know enough about the details to speak to it.