Jorge, Wolfgang,
watch out, cells can be cyclic too... e.g.: C = {NewCell C}
Fred
On 11 Oct 2006, at 22:26, Jorge Marques Pelizzoni wrote:
Kevin's idea is sure to yield a more efficient solution, but take a
look
at the code below, which does what you need.
Cheers,
Jorge.
-----------
declare
local
fun {EqSearch L K V}
case L of nil then false
[] (K2#V2)|Rest then
if {System.eq K K2} then
V = V2
true
else
{EqSearch Rest K V}
end
end
end
proc {CyclicMapAux R F Done V}
if {EqSearch Done R V} then skip
elseif {F R V} then skip else
V = {Record.map R fun {$ V0}
{CyclicMapAux V0 F (R#V)|Done}
end}
end
end
in
fun {CyclicMap R F}
{CyclicMapAux R F nil}
end
end
declare
proc {AccessIfCell C V Ok}
Ok = {IsCell C}
if Ok then V = @C end
end
declare
C = {NewCell 1}
X
R
R = b(R X)
X = a(C r:b(R X) C)
{Show {CyclicMap X AccessIfCell}}
Kevin Glynn escreveu:
A quick idea. Instead of storing cells directly in the data
structure
could you replace them with indices into a separate array instead? Of
course you will need to change all your code that accesses/updates
the
cells.
k
Wolfgang Meyer writes:
Dear all,
I need some advice on how to pickle a recursive data structure
that may
contain cells.
I know that the Pickle module only works for stateless data, so I
thought I'd write a small conversion function that I call before the
call to Pickle.save. And a similar function to apply after
Pickle.load.
The conversion function would look like this:
declare
CellMarker = 'unique-string-marking-cells'
fun {ConvertToStateless D}
if {Record.is D} then
{Record.map D ConvertToStateless}
elseif {Cell.is D} then
CellMarker#{ConvertToStateless @D}
else
D
end
end
The problem is that this function diverges on cyclic records, like
A = test(1:A)
in
{ConvertToStateless A}
Any idea how I could make this work for such records?
I guess I need to detect cycles in some way. Maybe there is some
existing code in the standard library that can show me the way?
Thank you for any hints,
Wolfgang
--
Der GMX SmartSurfer hilft bis zu 70% Ihrer Onlinekosten zu sparen!
Ideal für Modem und ISDN: http://www.gmx.net/de/go/smartsurfer
____________________________________________________________________
_____________
mozart-users mailing list
[email protected]
http://www.mozart-oz.org/mailman/listinfo/mozart-users
_____________________________________________________________________
____________
mozart-users mailing list
[email protected]
http://www.mozart-oz.org/mailman/listinfo/mozart-users
Jorge M. Pelizzoni
ICMC - Universidade de São Paulo
______________________________________________________________________
___________
mozart-users mailing list mozart-
[EMAIL PROTECTED]
http://www.mozart-oz.org/mailman/listinfo/mozart-users
_________________________________________________________________________________
mozart-users mailing list
[email protected]
http://www.mozart-oz.org/mailman/listinfo/mozart-users