On Monday, 22 May 2023 at 11:23:32 UTC, Adam D Ruppe wrote:
>On Monday, 22 May 2023 at 08:21:50 UTC, Walter Bright wrote:
>Personally, I like to make the core code version-independent and OS-independent and hide the variances in separate modules. Isn't foo() clean looking?
I agree with you that having the option of using run-time guards like assert(0)
/ throw new NotImplementedEx()
and even using empty declarations at compile-time is very convenient in practice to get going with a port. On the other hand, I also find a great amount in being able to get an almost complete list of things that I need to fix at compile-time in terms of planning my work. Based on your blog post it would seem that two approaches are opposite to each other, but I think we should find a way to have our cake and eat it.
A better solution (in that it works with the existing code using static assert
s) would be having fully lazy compilation model further along the lines of dmd -i
:
starting from set of root symbols (e.g. main
, unittest
when unit tests are enabled, and functions explicitly marked as export
) the compiler should semantically analyse only the declarations which are referenced (directly or indirectly) from the root set. That way, if any symbol (be it enum
, struct
, function, etc.) is not referenced, it won't analysed and the static assert
won't be hit.