|
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)
|
||
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