48 points jordan_bonecut 1 hour ago 27 comments
jordan_bonecut 1 hour ago | parent
sblom 1 hour ago | parent
Success in programming languages is not simply if-you-build-it-they-will-come. Bootstrapping a community that loves programming in it is the hard part. You'll either need a killer interop story with an already built ecosystem, or you'll need your own HTTP server, JSON parser, etc. etc. etc.
Best of luck! I'll watch this space.
jordan_bonecut 1 hour ago | parent
That is good advice, I’m definitely planning on including some batteries soon, once I’m very happy with where the compiler is at.
0c3ca83 21 minutes ago | parent
gchamonlive 14 minutes ago | parent
jeremyloy_wt 13 minutes ago | parent
There are a shrinking number of reasons to geenfield projects with non-strict or unsafe languages now.
TofuLover 1 hour ago | parent
jordan_bonecut 1 hour ago | parent
let x = vec![1,2,3]; let a = &mut x[0]; let b = &mut x[1]; swap(a, b);
This is not allowed. And actually in the compiler’s mind it’s for the same reason as this:
let x = vec![1,2]; let a = &mut x[0]; x.push(3); a = a + 1;
Which is definitely not safe and should be rejected. But the compiler cannot reason that the above case is actually safe, because they both fail to compile for lifetime reasons.
Another thing I’m working on are “patterns” which are like enums on steroids. In Rust you cannot define how an enum is laid out, thus requiring optimizations for types like Option<&T> to be in the compiler. In evergreen this will be in the language via a similar process to trait implementation.
nicce 1 hour ago | parent
How are you going to solve the problem with other means? Lifetimes basically guarantee, that there are no use-after-free bugs.
jordan_bonecut 52 minutes ago | parent
Each “where” is called a plane, which is a tree. The stack plane contains all your function calls memory, a structure allocated on the stack has a child plane for each field. The compiler tags which plane something is from at compile time and tracks when it dies.
Things do get complicated in scenarios like:
fn max(a: &usize, b: &usize) -> &usize {
if *a > *b { a } else { b }
}In such a scenario the compiler tags the result with both of the input planes. However, you cannot define add a postcondition ensures clause to make it more precise
tancop 16 minutes ago | parent
throwaway17_17 54 minutes ago | parent
In a sibling comment I said the types seem more likely to be refinement (or Liquid) types instead of being full-spectrum dependent types. Is this correct? I certainly haven’t been through enough of the docs to be confident, but I took a swing when I posted my comment.
throwaway17_17 1 hour ago | parent
jordan_bonecut 57 minutes ago | parent
ch4s3 55 minutes ago | parent
jordan_bonecut 48 minutes ago | parent
ch4s3 39 minutes ago | parent
How are you doing resolution of your dependent(refined?) types? I've been using Z3, but you're clearly doing something else here.
ch4s3 56 minutes ago | parent
gtutino 1 hour ago | parent
LiamPowell 11 minutes ago | parent
skybrian 1 hour ago | parent
There is some apparently AI-generated prose that needs rewriting for clarity. For example, in the tutorial:
> The caller proves where; the implementation proves ensures. A precondition failure stops compilation before any program runs.
Fron the readme:
> I think you get it now.
Nope, I skimmed, because the syntax is unfamiliar.
> Memory model is in a tree of "planes". The stack is a tree. Each function is a node. Each variable is another node. If it's a struct then it's also a node. Down to the most atomic types, which are just the integers.
Meaning what? This needs to be explained better.
jordan_bonecut 58 minutes ago | parent
kreco 5 minutes ago | parent
I wish we would stop xxx::yyy::zzz for namespace.
It was horrible in C++ from day one, and is still horrible in Rust.
It had some reason to be this way in C++ but not in any other newer language.
Real negative part: it looks to me that the authors of those languages are parroting other languages rather than understanding the reason of those language choice.
This simply worries me because I judge the level of expertise and makes me not consider the language in the first place.
(I know C++ and Rust are alive but they share their fair share of poor design choice)