Tak Lean to rieši po svojom. Chlapík to tu vysvetľuje. (Ale píše, že si nie je stopercentne istý.)
Lean nemodifikuje pôvodné pole, ale zahodí ho a na jeho mieste v pamäti sa nejako šikovne vytvorí nové, modifikované pole.
def main : IO Unit := do let a := Array.mk [1, 2, 3, 4, 5] -- makes a copy of a (since a is still referenced) -- and modifies element in position 3 let b := a.set! 3 44 let b := b.set! 4 55 -- modifies b in-place println! a println! b
Funguje to vtedy, ak na oboch stranách priradenia je rovnaké pole.
Tak immutable arrays sú už predbežne schválené, vybrali si už aj syntax [: :]
. F# rieši dilemu tak, že má čisté API a nečisté API, pričom to východzie je immutable, napr. Array.InsertAt
. Ak sa má pole modifikovať, tak je tam explicitne uvedený úmysel, Array.sort
vs Array.sortInPlace
. (Nejako podobne rieši Python privátne importy.)
Clojure to rieši tak, že na "nečistú prácu" odkazuje použiť Javu, teda jej pole.