On Jul 24, 2022, at 19:04, Jean Abou Samra <j...@abou-samra.fr> wrote:
> 
> I understand that ly_scm_list takes an rvalue and disallows
> lvalues for clarity, while as_ly_scm_list takes an lvalue,
> and will fail on an rvalue by design, with the failure being
> a compilation failure since e67154f7e330b61c5d9a973fbb89bd56866a148e.
> 
> But I don't understand the real difference that distinguishes
> them. Before that commit, what would have been the difference
> between as_ly_scm_list (lvalue) and ly_scm_list (lvalue)?

The difference is ownership of the head.

ly_scm_list has one data member:

    private:
      SCM head_ = SCM_EOL;

Creating an instance of ly_scm_list creates this head.  If a list operation 
modifies this head, no other SCM is modified.

    ly_scm_list x (my_things_);  // A. x.head_ = my_things_
    ...
    x.clear ();                  // B. my_things_ is unchanged

(B) might or might not be a problem.  Without a comment, it can require deep 
review to tell whether leaving my_things_ alone was an error or not.

Forbidding (A) means that people can't write such code, but there are times 
where we do want to work with a SCM like a ly_scm_list, including operations 
that change the head SCM.

as_ly_scm_list casts a SCM to a ly_scm_list.  There is no separate head because 
there is no new ly_scm_list, just a reinterpretation of the given SCM.

    auto& x = as_ly_scm_list (my_things_);  // C. 
    …
    x.clear ();                             // D. clears my_things_

Hope that helps.
— 
Dan


Reply via email to