To se nevylučuje, sémantická neměnnost neznamená, že se nepřepisuje paměť nebo registry. Jen to je transparentní a vývojáře to nemusí zajímat. Garanci výlučnosti nebo neměnnosti (z pohledu vývojáře) zajištuje překladač.
Jenže na této úrovni už neexistuje sémantická neměnnost. Ty periferie jsou určené ke komunikaci s vnějším světem a tudíž se z principu musí měnit.
Co se řešit dá (a teoreticky musí..) je vlastnictví v daný moment. Například sdílení SPI nebo I2C sběrnice pro komunikaci s externími komponentami. Tam jazyk pomůže, ale nakonec je to stejně tak nízkoúrovňové a citlivé na časování, že programátor musí vědět co dělá.
Typicky třeba flash paměti umožňují přes externí signál přerušit svoji transakci a později pokračovat. A to je věc, co se bez přímého přístupu do registrů periferie dělá špatně i v C/C++ HAL implementacích. Přesvědčit borrow checker v Rustu, že to je opravdu v pořádku, je ještě mnohem komplikovanější. A to nemluvím o uspání, během kterého se nakonfigurovaným periferiím vypne hodinový signál nebo třeba ADC převodníku referenční napětí. V Rustu jedině přes komplet unsafe blok.
Čistě funkcionální a immutable paradigmata jsou teoreticky krásná, ale mnohdy zbytečně omezující. Mohou fungoval jen díky tomu, že někdo tu špinavou práci odvedl na nižší úrovni. Jenže to je právě doména Rustu, tak se mu dá těžko vytýkat, že není "čistý", funkcionální a plně immutable.
Za mě vhodně namíchaná kombinace funkcionálních a procedurálních vlastnosti umožňuje v praxi čitelnější a praktičtější zápis a čtení kódu.