[clean-list] Update head of the list in-place?
John van Groningen
johnvg at cs.ru.nl
Thu Apr 24 16:35:27 MEST 2008
Edsko de Vries wrote:
>Would it be easy to write a function
>
> update_head :: *[.a] .a -> *[.a]
> update_head = code inline { .. }
>
>which updates the head of a list in-place (given a spine-unique list, of
>course)? I feel it should be straightforward to someone who knows ABC
>code inside-out, but unfortunately I am not such a person.
The compiler can already perform such optimizations if compile option Reuse
Unique Nodes is enabled. So in most cases it is not necessary to write
abc code for such in-place updates.
If update_head would be defined as:
update_head :: *[.a] .a -> *[.a]
update_head [_:l] e = [e:l]
the compiler sees that the "[_:l]" cons node can be updated in place
to build "[e:l]". Unfortunately this is not possible in this case
because of the calling convention for update_head. If the result type
of a function is a list (or another algebraic data type) the function
is called with a node that has to be updated with the result. So in
the case of "update_head" this node will be overwritten with [e:l].
For example for this function:
update_head2 :: *[.a] .a -> (!*[.a],!Int)
update_head2 [_:l] e = ([e:l],0)
the compiler will update the "[_:l]" node to make a "[e:l]" node. The tuple
will be unboxed, so this function does not allocate any memory.
Kind regards,
John van Groningen
More information about the clean-list
mailing list