RosettaCodeData/Task/Deepcopy/Lingo/deepcopy-1.lingo

20 lines
670 B
Plaintext

-- Supports lists, property lists, images, script instances and scalar values (integer, float, string, symbol).
on deepcopy (var, cycleCheck)
case ilk(var) of
#list, #propList, #image:
return var.duplicate()
#instance:
if string(var) starts "<Xtra " then return var -- deep copy makes no sense for Xtra instances
if voidP(cycleCheck) then cycleCheck = [:]
if not voidP(cycleCheck[var]) then return cycleCheck[var]
copy = var.script.rawNew()
cycleCheck[var] = copy
repeat with i = 1 to var.count
copy.setProp(var.getPropAt(i), deepcopy(var[i], cycleCheck))
end repeat
return copy
otherwise:
return var
end case
end