Re: Constructors, excessive consing, R7RS Large
Daphne Preston-Kendal 14 Jan 2025 16:52 UTC
On 22 Nov 2024, at 08:08, Marc Nieper-Wißkirchen <xxxxxx@gmail.com> wrote:
> Chez Scheme's optimiser is not able to remove the temporary heap
> allocation in the following example, although it is able to inline the
> procedures.
With the following example, cp0 does remove the intermediate allocation:
(library (a-b)
(export my-make-b make-a a-x b-y)
(import (rnrs))
(define-record-type a (fields (immutable x)))
(define-record-type b (fields (mutable y)) (parent a))
(define (my-make-b an-a y)
(make-b (a-x an-a) y)))
(my-make-b (make-a 4) 5)
If the b-y field is declared immutable, it will also instantiate the record instance during cp0.
If the a-x field is declared mutable, then you have a problem.
> The average Scheme implementation will likely do even fewer optimisations.
This is probably correct. (Guile, for example, can’t do this – at least when the R6RS d-r-t is used, like here. Verified with the above example code and the ,optimize and ,disassemble REPL commands.)
Daphne