Re: Naming question for get_property, set_property

2020-02-12 Thread David Kastrup
Han-Wen Nienhuys  writes:

> On Tue, Feb 11, 2020 at 10:17 PM David Kastrup  wrote:
>
>> > the reason being that it is better if the source code looks like plain
>> C++,
>> > even though they might actually be macros that do advanced magic. Having
>> > normal looking source code helps editors and tooling (astyle,
>> clang-format)
>> > make sensible decisions.
>>
>> get_property (pointer, "property")
>> set_property (pointer, "property", value);
>>
>> would achieve that as well.  Doesn't look like a member function, but
>> the thing looking like a member function also never actually was one.
>>
>>
> Earlier you said:
>
> "and for "reasons" I
> need to know the type, so the call would become something akin to"
>
> how does this work for the above?

decltype (*(pointer))

Basically the macro does not need to know the type by name, just in some
manner it can tell the compiler.

For the current syntax ->get_property ("property") I just have no
conceivable handle to get at the type of the pointer.

-- 
David Kastrup
My replies have a tendency to cause friction.  To help mitigating
damage, feel free to forward problematic posts to me adding a subject
like "timeout 1d" (for a suggested timeout of 1 day) or "offensive".



Re: Naming question for get_property, set_property

2020-02-11 Thread Han-Wen Nienhuys
On Tue, Feb 11, 2020 at 10:17 PM David Kastrup  wrote:

> > the reason being that it is better if the source code looks like plain
> C++,
> > even though they might actually be macros that do advanced magic. Having
> > normal looking source code helps editors and tooling (astyle,
> clang-format)
> > make sensible decisions.
>
> get_property (pointer, "property")
> set_property (pointer, "property", value);
>
> would achieve that as well.  Doesn't look like a member function, but
> the thing looking like a member function also never actually was one.
>
>
Earlier you said:

"and for "reasons" I
need to know the type, so the call would become something akin to"

how does this work for the above?

-- 
Han-Wen Nienhuys - hanw...@gmail.com - http://www.xs4all.nl/~hanwen


Re: Naming question for get_property, set_property

2020-02-11 Thread David Kastrup
Han-Wen Nienhuys  writes:

> On Mon, Feb 10, 2020 at 11:48 PM David Kastrup  wrote:
>
>>
>> So for longterm efficiency reasons I am planning to reimplement the
>> get_property/set_property macros and underlying data structures that map
>> to get_property_internal/set_property_internal.  They are currently used
>> across a number of types in a sort of polymorphism, and for "reasons" I
>> need to know the type, so the call would become something akin to
>>
>> I'm curious about your plans. Can you say more?
>
>
>> get_property (Grob, "color");
>> or
>> set_property (Grob, "stencil", SCM_BOOL_F);
>>
>> Now this is longer than before.  Removing _property is not really an
>> option since that lands us with std::set getting mapped to
>> std::set_property_internal (or whatever).
>>
>> So Set and Get ?  Or set_prop and get_prop ?  Or Set_prop and Get_prop ?
>>
>> Or, since there are not all that many types to cater for, grob_set,
>> grob_get, music_set, music_get, event_set, event_get (those obviously
>> without the extra type argument) and what else I've been missing?
>>
>
> I recommend simply reverting to what we had before I unified things, ie.
>
>   get_grob_property
>   set_grob_property
>   get_music_property
>   .. etc.
>
> the reason being that it is better if the source code looks like plain C++,
> even though they might actually be macros that do advanced magic. Having
> normal looking source code helps editors and tooling (astyle, clang-format)
> make sensible decisions.

get_property (pointer, "property")
set_property (pointer, "property", value);

would achieve that as well.  Doesn't look like a member function, but
the thing looking like a member function also never actually was one.

Your proposal certainly causes fewer headaches in the sed script
department.  It's just that many uses of get_property/set_property
already lead to comparatively long lines.

And Dan appeared to be no fan of what will end up in code like

get_grob_property (grob, "property")

since usually the name of the pointer already suggests the type.  So I
lean toward's the non-member-function-like variant.  Let's see whether
my sed-foo convinces me otherwise when I get there.

-- 
David Kastrup
My replies have a tendency to cause friction.  To help mitigating
damage, feel free to forward problematic posts to me adding a subject
like "timeout 1d" (for a suggested timeout of 1 day) or "offensive".



Re: Naming question for get_property, set_property

2020-02-11 Thread Han-Wen Nienhuys
On Mon, Feb 10, 2020 at 11:48 PM David Kastrup  wrote:

>
> So for longterm efficiency reasons I am planning to reimplement the
> get_property/set_property macros and underlying data structures that map
> to get_property_internal/set_property_internal.  They are currently used
> across a number of types in a sort of polymorphism, and for "reasons" I
> need to know the type, so the call would become something akin to
>
> I'm curious about your plans. Can you say more?


> get_property (Grob, "color");
> or
> set_property (Grob, "stencil", SCM_BOOL_F);
>
> Now this is longer than before.  Removing _property is not really an
> option since that lands us with std::set getting mapped to
> std::set_property_internal (or whatever).
>
> So Set and Get ?  Or set_prop and get_prop ?  Or Set_prop and Get_prop ?
>
> Or, since there are not all that many types to cater for, grob_set,
> grob_get, music_set, music_get, event_set, event_get (those obviously
> without the extra type argument) and what else I've been missing?
>

I recommend simply reverting to what we had before I unified things, ie.

  get_grob_property
  set_grob_property
  get_music_property
  .. etc.

the reason being that it is better if the source code looks like plain C++,
even though they might actually be macros that do advanced magic. Having
normal looking source code helps editors and tooling (astyle, clang-format)
make sensible decisions.



-- 
Han-Wen Nienhuys - hanw...@gmail.com - http://www.xs4all.nl/~hanwen


Re: Naming question for get_property, set_property

2020-02-11 Thread David Kastrup
Dan Eble  writes:

> On Feb 10, 2020, at 20:48, David Kastrup  wrote:
>> 
>> Templating on a string constant is, unfortunately, not a thing at least
>> in C++11 (don't know whether they managed since then).  Or one could go
>> that route rather than GCC-specific in-expression use of a static
>> initializer.
>
> Well, constexpr enables some new and interesting things, though I
> imagine that having to interact with Guile nixes them.

For the purpose of generating a near-compile-time constant that would
not be a problem, static initialization to the win.

Like

template 
SCM make_symbol ()
{
  static SCM sym = scm_permanent_object (scm_string_to_symbol (symbol));
  return sym;
}

which would generate one function per symbol that on its _first_ call
(when the Guile subsystem is already active) converts the symbol into
SCM and then memoizes it.  But as far as I know, C++11 cannot template
on string constants (C or C++) like that.  You need to create a named
character array or pointer and then can template on _that_ and that's a
lot more cumbersome in practice.

> Here, someone has figured out how to compute a CRC of a literal string
> at compile time: https://stackoverflow.com/a/9842857

We would not need anything that complicated.

-- 
David Kastrup
My replies have a tendency to cause friction.  To help mitigating
damage, feel free to forward problematic posts to me adding a subject
like "timeout 1d" (for a suggested timeout of 1 day) or "offensive".



Re: Naming question for get_property, set_property

2020-02-11 Thread Dan Eble
On Feb 10, 2020, at 20:48, David Kastrup  wrote:
> 
> Templating on a string constant is, unfortunately, not a thing at least
> in C++11 (don't know whether they managed since then).  Or one could go
> that route rather than GCC-specific in-expression use of a static
> initializer.

Well, constexpr enables some new and interesting things, though I imagine that 
having to interact with Guile nixes them.

Here, someone has figured out how to compute a CRC of a literal string at 
compile time:
https://stackoverflow.com/a/9842857
— 
Dan



Re: Naming question for get_property, set_property

2020-02-11 Thread Joram Noeck
FWIW, python has getattr and setattr which would perhaps suggest

get_prop(grob, "property") and
set_prop(grob, "property", VALUE)

I am not a fan of "arbitrary abbreviations" and get_property and
set_property are only 4 characters longer. So maybe I would choose the
latter (modulo your naming conventions w.r.t case) – just as one more
data point, feel free to ignore it.

Joram



Re: Naming question for get_property, set_property

2020-02-10 Thread Dan Eble
On Feb 10, 2020, at 21:35, David Kastrup  wrote:
> property_set (grob, "stencil", SCM_BOOL_F);
> 
> and
> 
> property_get (grob, "color")

These are fine.
— 
Dan




Re: Naming question for get_property, set_property

2020-02-10 Thread David Kastrup
David Kastrup  writes:

> Dan Eble  writes:
>
>> On Feb 10, 2020, at 17:47, David Kastrup  wrote:
>>> It will look a bit redundant either way with
>>> 
>>> grob->Get (Grob, "color");
>>> or
>>> grob->grob_set ("stencil", SCM_BOOL_F);
>>
>> "Yuck" either way.  Removing "property" to shorten the name is not a
>> good course of action.
>>
>> My brainstorming without knowing your reasons does not seem likely to
>> help, but what the hey ...
>>
>> grob->set ("stencil", SCM_BOOL_F);
>>
>> grob->set (Grob_property ("stencil"), SCM_BOOL_F);
>>
>> grob->properties["stencil"] = SCM_BOOL_F; // Too much to ask?
>
> Don't work.  It has to be a macro, and it has to know the type (so it
> cannot figure it out by overloaded or something).

Well...

property_set (grob, "stencil", SCM_BOOL_F);

and

property_get (grob, "color")

In that manner, the macro gets enough of a hold on the type of the
pointer to make this work.  I'll not rule out that one can shimmy enough
of type madness around this to make

property (grob, "stencil") = SCM_BOOL_F;

work but I think that the payoff in relation for the complexity would
not likely be worth it.

-- 
David Kastrup
My replies have a tendency to cause friction.  To help mitigating
damage, feel free to forward problematic posts to me adding a subject
like "timeout 1d" (for a suggested timeout of 1 day) or "offensive".



Re: Naming question for get_property, set_property

2020-02-10 Thread David Kastrup
Dan Eble  writes:

> On Feb 10, 2020, at 17:47, David Kastrup  wrote:
>> It will look a bit redundant either way with
>> 
>> grob->Get (Grob, "color");
>> or
>> grob->grob_set ("stencil", SCM_BOOL_F);
>
> "Yuck" either way.  Removing "property" to shorten the name is not a
> good course of action.
>
> My brainstorming without knowing your reasons does not seem likely to
> help, but what the hey ...
>
> grob->set ("stencil", SCM_BOOL_F);
>
> grob->set (Grob_property ("stencil"), SCM_BOOL_F);
>
> grob->properties["stencil"] = SCM_BOOL_F; // Too much to ask?

Don't work.  It has to be a macro, and it has to know the type (so it
cannot figure it out by overloaded or something).  The reason is that
for a constant string, it executes code on the first run through that
translates that string into a Scheme symbol (this already happens) and
converts this symbol to an integer dependent on the general class
(Grob/Music/Stream_event) of the type.  Basically something like

({static int blurb = Type::lookup (property_name); blurb;})

This integer is then mapped to an index into a property array (rather
than a property alist).

But this memoization technique has to create individual code at each
call site (in order to be specific for each different constant string)
and thus cannot be the result of anything the compiler rather than the
preprocessor does.  Hence I need the preprocessor to be in knowledge of
the type.  Your proposals require the compiler.

Templating on a string constant is, unfortunately, not a thing at least
in C++11 (don't know whether they managed since then).  Or one could go
that route rather than GCC-specific in-expression use of a static
initializer.

-- 
David Kastrup



Re: Naming question for get_property, set_property

2020-02-10 Thread Dan Eble
On Feb 10, 2020, at 17:47, David Kastrup  wrote:
> It will look a bit redundant either way with
> 
> grob->Get (Grob, "color");
> or
> grob->grob_set ("stencil", SCM_BOOL_F);

"Yuck" either way.  Removing "property" to shorten the name is not a good 
course of action.

My brainstorming without knowing your reasons does not seem likely to help, but 
what the hey ...

grob->set ("stencil", SCM_BOOL_F);

grob->set (Grob_property ("stencil"), SCM_BOOL_F);

grob->properties["stencil"] = SCM_BOOL_F; // Too much to ask?
— 
Dan