Rust - de ce este println! macro?
Last Updated: May 22 2015 19:33, Started by
0x3F
, May 22 2015 14:30
·
0
#1
Posted 22 May 2015 - 14:30
Am inceput sa invat Rust. Am facut primele 2 exemple din carte. Am aflat ca println! este macro si nu functie. Nu prea inteleg de ce.
Probabil scrierea pe ecran nu se face la fel de simplu ca in C++ sau C (cu o singura linie de cod), iar acel macro de fapt inglobeaza mai multe functii si simplifica lucrurile. Asa ma gandesc, nu stiu daca am dreptate. Daca am dreptate, este acesta singurul motiv? |
#3
Posted 22 May 2015 - 14:59
E un macro deoarece doar așa poate face lucruri înainte de compilare, lucruri care în limbajele clasice se fac la runtime.
Nu are legătură cu "mai multe funcții", ci cu analiza statică a codului. |
#4
Posted 22 May 2015 - 15:17
OriginalCopy, on 22 mai 2015 - 14:59, said:
Nu are legătură cu "mai multe funcții", ci cu analiza statică a codului. Sa vad daca am inteles. Ajuta deoarece poti vedea codul detaliat dupa preprocesare, adica lipsit de abstractizari (nu mai e println!, ci instructiunile ce compun acest macro)? Edited by 0x3F, 22 May 2015 - 15:20. |
#5
Posted 22 May 2015 - 15:38
Preprocesorul rust e mai avansat decât cel C, primește ca parametru AST-ul, și generează erori dacă ceva nu e în ordine. Erorile sunt generate în timpul preprocesării, nu după, ca în C.
|
#6
Posted 22 May 2015 - 15:40
E nevoie de macro pentrucă Rust are niște limitări când vine vorba de formatarea stringurilor și Rust nu are capacități avansate de metaprogramare precum are C++ cu template.
|
#7
Posted 22 May 2015 - 16:56
neur0, on 22 mai 2015 - 15:40, said:
E nevoie de macro pentrucă Rust are niște limitări când vine vorba de formatarea stringurilor și Rust nu are capacități avansate de metaprogramare precum are C++ cu template. Eu gust trollingul tau, insa el s-ar putea sa nu-si dea seama ca raspunsul tau n-are legatura cu intrebarea lui. |
#8
Posted 22 May 2015 - 17:04
#9
Posted 22 May 2015 - 18:05
Seamana surprinzator cu un post de-aici:
https://github.com/r...st/issues/17190 Quote @oconnor663: Rust doesn't have compile-time function execution and variadic generics so it can't do the compile-time format string checking and code expansion without it. Macros are used to work around missing features, and in cases where they are very commonly used it would be better to improve the underlying language. |
#10
Posted 22 May 2015 - 18:24
TS030, on 22 mai 2015 - 18:05, said:
Seamana surprinzator cu un post de-aici: https://github.com/r...st/issues/17190 Sincer... pare cam dubios (desi formatarea din C/printf este si ea dubioasa, si unsafe). OK, limbajul nu suporta functii cu numar variabil de parametri, dar este dependinta de macro-uri o solutie buna? Sa presupunem ca ar avea functii variadice. Cum ar face asta apelul la println sigur? Ca macro, poate sa analizeze codul inainte de compilare si daca e in neregula, sa nu-i dea voie. Decat cu gaurile de securitate din C/C++, eu unul prefer asa. |
|
#11
Posted 22 May 2015 - 19:33
Ce spun eu este ca printf! nu poate fi o functie, fara a accepta numar variabil de parametri. Nu ca ar trebui sa fie, sau ca astfel s-ar asigura corectitudinea codului.
Desigur, prefer erorile de compilare celor de runtime P.S. printf()-ul si functiile din aceeasi familie din C sunt evident unsafe - suficient pentru a avea propria categorie de vulnerabilitati. Functioneaza, cu atentie si analiza statica de cod, insa n-o sa ma vezi zicand vreodata ca Rust sau oricare alt limbaj ar trebui sa implementeze o solutie similara Pe de alta parte, nu poti sa judeci un limbaj dupa niste functii de librarie introduse prin anii '70. |
Anunturi
Bun venit pe Forumul Softpedia!
▶ 1 user(s) are reading this topic
0 members, 1 guests, 0 anonymous users