Truly unifying R6RS and R7RS Daphne Preston-Kendal (04 Oct 2022 18:22 UTC)
Re: Truly unifying R6RS and R7RS Marc Nieper-Wißkirchen (04 Oct 2022 19:16 UTC)
Re: Truly unifying R6RS and R7RS John Cowan (06 Oct 2022 20:30 UTC)
Re: Truly unifying R6RS and R7RS Marc Nieper-Wißkirchen (06 Oct 2022 21:11 UTC)
Re: Truly unifying R6RS and R7RS John Cowan (07 Oct 2022 01:33 UTC)
Re: Truly unifying R6RS and R7RS Marc Nieper-Wißkirchen (07 Oct 2022 08:20 UTC)
Re: Truly unifying R6RS and R7RS Arthur A. Gleckler (07 Oct 2022 18:22 UTC)
Re: Truly unifying R6RS and R7RS John Cowan (07 Oct 2022 22:02 UTC)
Re: Truly unifying R6RS and R7RS Marc Nieper-Wißkirchen (08 Oct 2022 10:37 UTC)
Re: Truly unifying R6RS and R7RS José Bollo (27 Oct 2022 07:30 UTC)
Re: Truly unifying R6RS and R7RS Marc Nieper-Wißkirchen (27 Oct 2022 08:00 UTC)
Re: Truly unifying R6RS and R7RS José Bollo (01 Nov 2022 14:22 UTC)
Re: Truly unifying R6RS and R7RS Marc Nieper-Wißkirchen (01 Nov 2022 14:34 UTC)
Re: Truly unifying R6RS and R7RS José Bollo (03 Nov 2022 08:42 UTC)
(missing)
Fwd: Truly unifying R6RS and R7RS Marc Nieper-Wißkirchen (03 Nov 2022 13:18 UTC)
Re: Truly unifying R6RS and R7RS José Bollo (26 Nov 2022 10:02 UTC)
Re: Truly unifying R6RS and R7RS Marc Nieper-Wißkirchen (26 Nov 2022 17:26 UTC)

Re: Truly unifying R6RS and R7RS José Bollo 03 Nov 2022 08:42 UTC

Le Tue, 1 Nov 2022 15:33:44 +0100,
Marc Nieper-Wißkirchen <xxxxxx@gmail.com> a écrit :

Hello,

> Am Di., 1. Nov. 2022 um 15:22 Uhr schrieb José Bollo
> <xxxxxx@nonadev.net>:
> >
> > Le Thu, 27 Oct 2022 10:00:17 +0200,
> > Marc Nieper-Wißkirchen <xxxxxx@gmail.com> a écrit :
> >
> > Hi,
> >
> > More thoughts to share. Trying to be short.
> >
> > 1. OO langages mostly allow multiple constructors -with different
> > signatures- (many of it -C++, Java- use unique name and overloading,
> > shit on it -just may silly opinion-) Anyway it is used so it is of
> > interest. Need example?
> >
> > (define-record-type <sbuf> (!sbuf! len vec) sbuf?
> >    (len sbuf-length sbuf-set-length!)
> >    (vec sbuf-buffer))
> >
> > (define (make-sbuf-with-capacity capacity)
> >   (!sbuf! 0 (make-vector capacity #\null)))
> >
> > (define (make-sbuf-from-string string)
> >   (!sbuf! (string-length string) (string->vector string)))
> >
> > My understanding is that protocol of r6rs doesn't give any facility
> > for that case. It is intended for inheritance only but restrict its
> > usage to a single signature (but okay we can use case-lambda,
> > perhaps).
>
> The procedural layer of R6RS allows you to define as many constructors
> as you want; only the syntactic layer is limited (but not in
> principle).
>
> The newest draft of SRFI 237 now included "define-record-name", which
> is a syntactic facility to define new constructors without defining
> new record types.
>
> > 2. define-record-type is not OO. The issues solved by protocol
> > remain for methods that are not constructors and are not solved. So
> > the need is for constructor only.
>
> What do you mean by "are not solved"?

I mean "calling precursor method in a redefined method in inheriter
class", as offered by some OO languages. Maybe still not clear. If in a
class B inheriting A we redefine the method foo but to implement it, we
need to invoke the origin method foo of A.

It is really not a scheme paradigm but it is near in its mechanism to
the problem we are debating.

> > I imagine a procedure that wraps children fields to provide a parent
> > constructor. It could solve. Let use R6RS's abstract example (p18)
> > with SRFI-136 formalism and with some functions foo, bar1 and bar2.
> >
> > (define-record-type <parent> !parent! parent?
> >    (v1 v1) (v2 v2) (v3 v3))
> >
> > (define-record-type (<child> <parent>) !child! child?
> >    (x1 x1) (x2 x2) (x3 x3) (x4 x4))
> >
> > (define (make-parent v1 v2 . build)
> >    (let ((make (if (null? build) !parent! (car build))))
> >       (make v1 v2 (foo v1 v2))))
> >
> > (define (make-child x1 x2 x3 v1)
> >    (let ((x4 (bar1 x1 x2 x3 v1))
> >          (v2 (bar2 x1 x2 x3 v1)))
> >       (make-parent v1 v2 (lambda (v1 v2 v3)
> >             (!child! v1 v2 v3 x1 x2 x3 x4)))))
> >
> > Works but it is not perfect. It has to be forged by the programmer
> > and included in the design, it does not comes for free. What comes
> > for free is the constructor !child!.
> >
> > Instead of (lambda (v1 v2 v3) (!child! v1 v2 v3 x1 x2 x3 x4)), a
> > facility function could exist:
> >  ((record-type-wrap-creator-for-parent <child>) x1 x2 x3 x4)
> >
> > It is very similar in the approach to protocol. Maybe more
> > flexible.
>
> If I understand your code correctly, it seems that the child record
> has to know about the fields of the parent record type, which the R6RS
> approach avoids - and allows decoupling implementations.

Yep and that is why I proposed the function with that very long name:
record-type-wrap-creator-for-parent. That function, given the type name
automatically returns the correct lambda.

Its signature is

  RECORD-TYPE
       --> proper fields of the childs
              --> parent fields of parent
                      --> created record instance

It could also be that signature

  RECORD-TYPE and proper fields of the childs
       --> parent fields of parent
              --> created record instance

But a generic function could do the job:

 (lambda (child-constructor)
     (lambda child-args
         (lambda parent-args
              (apply child-constructor
                     (concat parent-args child-args)))))

Or something similar. Having a specialized function could help to check
the count of arguments.

> Anyway, please check `define-record-name' and see whether it solves
> your use case.

I'm not sure to understand it clearly. It looks like a syntactic sugar,
not like a real behaviour.

> > And, also, I'm very sorry but I am very happy with the generativity
> > of define-record-type in R7RS. It is clear and regular with other
> > parts of the language.
>
> You don't have to be sorry. :) Where are you using generative
> record-type definitions in practice?

Well, in my usage, it doesn't care if it is generative or not. Both are
achieving the same behaviour.

I believe that turning generative type to non generative type can be
achieved using a correct decomposition in libraries. But I may be wrong,
I have no experience in providing any libraries of interest.

Conversely, you started a thread "Perpetuity of non-generative record
type definitions". Between the lines it indicates that being
non-generative might be a nightmare to implement.

Best regards
José

> Best wishes,
>
> Marc