Saying safe will be too early, but design philosophy is no compromise with security and speed with easy syntax. It passed with 550+ test cases including unit test, memory stress, integration, circular dep, regresssion, valgrind memory leak, fuzz testing, also i added conservative limits max depth for recursion and data length for stability. Find here https://github.com/nynrathod/doolang/blob/main/src/limits.rs
Doolang not uses any traits like rust. Rust is great language, but its expose everything in syntax that is also great but as developer who want security+speed with fast development may found issue writing rust, that is main goal of doolang simlicity. I'm still figuring out further design principle of syntax to have less exposing syntax.
Doolang have auto memory management with reference counting. Just simple mut keyword introduced for mutating variable let mut data = "data";
no other syntax expose all handling automatic with rc and auto type define if not defined explicitly
When I say safety I mean inability of the programmer to trigger UB using normal language features, like it's impossible in Rust and several other (less known) languages. Does Doo support it? Or I just can shoot the leg and compiler lets me do this?
About references: am I correct, that any value is reference-counted and one can pass it to a function and mutate it (the original, not a copy).
Doolang aims for memory safety with static typing and automatic reference counting, so you won't see classic C/C++ bugs. But it does not claim Rust's level of safety there’s no formal guarantee that safe code can't cause undefined behavior. It's quite safe in practice, just not as strict as Rust.
For complex types (strings, arrays, maps), values are reference-counted and passed by reference. If you pass such a value to a function, you're sharing the same object—mutations affect the original. For primitives (Int, Bool), it's pass-by-value (copy).
Doolang currently does not allow you to mutate a primitive variable from another function.
Only support this as of now
fn Foo(x: Int) {
x = 123; // Only modifies Foo's local copy
print("inside Foo", x); // Print 123
}
fn main() {
let x: Int = 0;
Foo(x);
// x is still 0 here after Foo returns
print("out x", x); // Print 0
}
Nooooo! "valgrind memory leak". Aaargh. Valgrind (memcheck) is not just a leak detection tool. Leak detection is so unimportant that it isn't even turned on by default.
Thanks for pointing that out. I didn’t actually know all the details about how Valgrind works under the hood just that it does memory checking. I'll definitely read up more on it. If you have any good resources or tips, I'd appreciate your suggestions!
Doolang not uses any traits like rust. Rust is great language, but its expose everything in syntax that is also great but as developer who want security+speed with fast development may found issue writing rust, that is main goal of doolang simlicity. I'm still figuring out further design principle of syntax to have less exposing syntax.
Doolang have auto memory management with reference counting. Just simple mut keyword introduced for mutating variable let mut data = "data"; no other syntax expose all handling automatic with rc and auto type define if not defined explicitly