Units of Measurement Library: units-d
Meta via Digitalmars-d-announce
digitalmars-d-announce at puremagic.com
Fri Apr 1 18:19:45 PDT 2016
On Friday, 1 April 2016 at 22:54:53 UTC, Simen Kjaeraas wrote:
> On Friday, 1 April 2016 at 21:46:35 UTC, ag0aep6g wrote:
>> On 01.04.2016 22:59, Simen Kjaeraas wrote:
>>> The usual way to fix it would be to include __FILE__ and
>>> __LINE__ in the
>>> template arguments:
>>
>> Right, no mixin this way. I wouldn't call this "truly nice",
>> though.
>>
>> It depends on code formatting to work. Put everything on one
>> line and it breaks. Significant whitespace is a pain when
>> generating code. Though this is not nearly as bad as
>> significant indentation, of course.
>>
>> __FILE__ also kind of breaks separate compilation. All object
>> files have to be compiled from the same directory. Otherwise
>> __FILE__ will be different.
>>
>> __LINE__ has a similar (maybe even more obscure) issue. Add or
>> remove a newline before compiling dependent modules and things
>> break. Usually, one recompiles all dependents when a
>> dependency changes, but a significant newline, really?
>
> I kinda agree. And looking at
> https://dlang.org/spec/traits.html, I see there's __MODULE__,
> which would probably be a better choice than __FILE__.
>
> As for __LINE__, what we'd want is basically something like
> __CONTEXT__, which doesn't exist, but might be the .mangleof of
> the surrounding scope:
>
> struct S(string ctx = __CONTEXT__) {
> pragma(msg, ctx);
> }
>
> S!() a; // "3foo"
>
> void bar() {
> S!() b; // "_D3foo3barFZv"
> }
>
> struct S2 {
> S!() c; // "S3foo2S2"
> void baz() {
> S!() d; // "_D3foo2S23bazMFZv"
> }
> }
>
> That'd remove the problem of significant whitespace. In fact,
> it'd also eliminate the need for __MODULE__ in this case.
>
> Still though, that's not enough if we want this to work:
>
> void foo() {
> alias a = Foo!(); alias b = Foo!();
> assert(!isSame!(a, b));
> }
>
> We could also add __COLUMN__, which would be the horizontal
> index of the instantiation's beginning:
>
> foo(3, Bar!3.baz);
> // ^Here. Position 11.
>
> Next problem:
>
> void main() {
> pragma(msg, __LINE__);
> mixin("pragma(msg, __LINE__);\npragma(msg, __LINE__);");
> pragma(msg, __LINE__);
> }
>
> That prints '4' twice - once for the actual line 4, the other
> for the second line of the mixin. However, __FILE__ is
> different, so I guess __CONTEXT__ could also be.
>
> --
> Simen
What is needed is Lisp's gensym construct.
More information about the Digitalmars-d-announce
mailing list