Programmiersprache: Rust 1.45 erweitert prozedurale Makros
FunktionsĂ€hnliche prozedurale Makros sind neuerdings an zusĂ€tzlichen Positionen erlaubt. AuĂerdem behebt Rust 1.45 ein Problem beim Umwandeln von Zahlen.
Das Rust-Core-Team hat Version 1.45 der Programmiersprache veröffentlicht. Das aktuelle Release bringt zwei wesentliche Neuerungen mit: Zum einen lassen sich funktionsĂ€hnliche prozedurale Makros an der Position von Anweisungen (Statements), AusdrĂŒcken (Expressions) und Patterns verwenden. AuĂerdem hat das Team einen Bug beim Umwandeln von FlieĂkommazahlen in Integer-Werte behoben.
Nicht mehr unsound, aber auf Wunsch unsafe
Beim Cast von Zahlen mit unterschiedlichen Maximal- beziehungsweise Minimalwerten war das Verhalten bisher nicht immer "sound": Die Umwandlung konnte zu unvorhergesehenen ZustĂ€nden des Programms fĂŒhren. Der zugehörige Issue [1] existiert bereits seit 2013 und ist mit dem aktuellen Release geschlossen. Ein Cast von Gleitkommazahlen mit 32 Bit zu 8-Bit-Integer-Werten ohne Vorzeichen wie in
pub fn cast(x: f32) -> u8 {
x as u8
}
fĂŒhrt fĂŒr Werte, die kleiner als 0 oder gröĂer als 255 sind zu unvorhergesehenen Ergebnissen. Nun bietet das Team zum Beheben zwei Wege an: Zum einen ist die Umwandlung ĂŒber as als Saturating Cast umgesetzt, also nach den Regeln der SĂ€ttigungsarithmetik. FĂŒr obigen Code bedeutet die Neuerung, dass jeder negative Wert 0 als Ergebnis erzeugt und jede Gleitkommazahl, die gröĂer als 255 ist, zum u8-Maximum 255 wird. Auch der Fall f32:NaN (Not a Number) ist abgedeckt und ergibt 0.
Wer auf die ĂberprĂŒfungen verzichten möchte, kann den unsicheren Weg wĂ€hlen, der nun aber eine neue Syntax hat und explizit als unsafe gekennzeichnet sein muss:
let x: f32 = 1.0;
let y: u8 = unsafe { x.to_int_unchecked() };
Erweiterter Einsatzbereich fĂŒr Makros
FunktionsĂ€hnliche prozedurale Makros kennt die Programmiersprache seit dem Release von Rust 1.30 [2] vor zwei Jahren. Bisher durften sie jedoch nur alleine und auĂerhalb von Funktionen stehen. Die aktuelle Version erlaubt ihren Einsatz darĂŒber hinaus an der Position von AusdrĂŒcken, Patterns und Anweisungen, wie in folgendem Codebeispiel aus dem Rust-Blog zu einem Makro mit dem Namen mac:
// imagine we have a procedural macro named "mac"
mac!(); // item position, this was what was stable before
// but these three are new:
fn main() {
let expr = mac!(); // expression position
match expr {
mac!() => {} // pattern position
}
mac!(); // statement position
}
Die ErgĂ€nzung zielt weniger auf den allgemeinen Einsatz in Rust-Programmen und mehr auf das Webframework Rocket [3] fĂŒr Rust, das derzeit in Version 0.4 verfĂŒgbar ist.
Daneben stabilisiert Rust 1.45 einige Library-APIs. Weitere Details zum Release lassen sich dem Rust-Blog entnehmen [4]. Die komplette Liste der Neuerungen und Bugfixes findet sich in den Release Notes [5].
(rme [6])
URL dieses Artikels:
https://www.heise.de/-4846103
Links in diesem Artikel:
[1] https://github.com/rust-lang/rust/issues/10184
[2] https://www.heise.de/news/Programmiersprache-Rust-1-30-will-mehr-Klarheit-schaffen-4204893.html
[3] https://rocket.rs/
[4] https://blog.rust-lang.org/2020/07/16/Rust-1.45.0.html
[5] https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1450-2020-07-16
[6] mailto:rme@ix.de
Copyright © 2020 Heise Medien