I think I was trying to articulate the same thing before, why Racket instead of more-practical-tool-here for "experiments/fun" and it really is just because it's more fun to work with, nearly everything you need is in there!
Also personally something I wish more functional languages would have is a little bit of Racket's maximalism with its forms like: (for/list ([e (range 10)]) e) [1] and for/fold, including the nested ones and the like that make mapping over things and even filtering a dream!
I implemented racket's for loops for guile scheme (my server is down since a week, so my hosted documentation isn't up, but you can find it in the repo linked below). It is maybe not a trivial macro, but I didn't need to struggle much to reach about 90% feature parity with racket.
The code it outputs is almost always as fast as a hand-rolled named-let (just as with racket), and you can port it without much difficulty to other schemes. I support most of the sequence iterators (in-range, in-list etc) and support non-tco loops to create things like lazy streams.
This isn't the same as client side prediction though, the entire game simulation in the aoe case practically runs on every client, where the only input to the simulation are commands that are passed between all players and executed in lockstep, where the simulation essentially stops if for a given turn no command for that turn has been received.
Gives you really low bandwidth reqs (and randomness is still possible assuming you just seed things the same on all machines).
But also means you might have to wait 50-200ms (or some arbitrary sliding window depending on network conditions) until your click actually registers ingame as a move as commands are scheduled to be processed far enough in the future (some number of command turns in the future) that you at that point would have received every other players commands for that given turn and thus be able to execute all commands for all players locally for that turn, which is not ideal if you're playing a twitchy shooter, but alright if it's an RTS.
If you can spare the RAM, i'd stick the world on a ramdisk (I did when hosting a MC server and it makes an appreciable difference versus the terribleness of disk IO)
Could you expand on this more? My friends and I just got up and running on our own beefy home server and it'd be nice to take advantage of the massive amounts of RAM on it.
Others have expanded a bit, but it depends on what you're running it on, a tmpfs setup is your friend on linux and even for windows there are free alternatives :)
Of course you will probably want to incorporate something that copies the ramdisk contents to somewhere a little more permanent ever so often, set an interval you're comfortable with losing data within! (but given the huge improvement i'd say it is worth it!)
If you are running off a fast SSD for storage I'm not sure that the RAM disk method will get you noticeable perf improvements; but I don't have any data for this so appreciate any corrections.
That doesn't mean it necessarily makes a difference. If your bottlenecks are CPU speed and disk latency, an SSD will remove 99% of the time spent waiting for disk, and even an infinitely fast ramdisk can only give you another 1%.
Dafny puts this stuff front and center, it's all well and good to think about invariants, but if they're just expressed in a comment and not actually verified, they might as well be filler text!
If there's anything I hope the mainstream adopts at some point, it is some variation of what Dafny offers here.
That went well for all the dutch jews in WW2 where the government also held detailed records about religious affiliation.. sometimes it is not about what is now, but what will or might be later.
Using this[1] map created from the Dutch census data (which included religious affiliation), the Nazis were able to very efficiently send about 3/4 of the black dots on that map to be murdered in the camps.
Collecting that census data probably seemed reasonable at the time. The new use case that needed a new way of aggre4gating and presenting the data happened later, almost as an emergent property. The only y to prevent problems that haven't been invented yet is to minimize the attack surface: if the records don't exist, they can't be misused.
When I hear about fast compile times, like e.g. for Pascal, immediately comes to mind - how good is optimization of the resulting executable? AFAIK, the back-end, not the front-end/parsing, takes most time when compiling C++. So in case of GCC or LLVM based D compilers, the time should be similar?
Stardew Valley is a weird example because the guy spent four and a half years working 12-hour days and did _everything_ themselves.. not sure that's the comparison you want here.
(and their family/girlfriend supported them, they did work as a theatre usher occasionally apparently, but their "day job" was largely the game above even normal standards)
> Stardew Valley is a weird example because the guy spent four and a half years working 12-hour days and did _everything_ themselves.. not sure that's the comparison you want here
That's exactly the comparison I want: he took his time and demonstrated that it can be done give the time available to us. If you can only give six hours, then I guess it would take eight years. There's also another lesson to be learnt here: don't do everything form scratch :P
> and their family/girlfriend supported them
I'd replace a girlfriend that doesn't support me; I'd disconnect from a family who doesn't support me.
You were saying "1 hour a day!" and then mentioned a guy who didn't work anything close to full time at a paying job for nearly 5 years to work 12 hours 7 days a week on something that _might_ pay on release..
He worked on something over a long period of time knowing simply that it's OK for something to take time to complete. He understood the challenges ahead and planned his days accordingly.
The point of the Steph's article isn't to only think inside of eight hours, but to think about time management, patience, focus, and other key aspects as a whole, to get the better picture of the path forward.
It doesn't matter if it takes four months or forty years to make a project: it's making it that counts.
It actually runs counter to your point and aligns with mine better. His day job as an usher was not mentally draining compared to his work on Stardew Valley
Ivy [1] is another research language built around Z3.
Slides from a recent presentation of the language are also available [2]. The concept of exploiting modularity to obtain decidable verification conditions is quite interesting. Plus, it compiles down to C++.
Also personally something I wish more functional languages would have is a little bit of Racket's maximalism with its forms like: (for/list ([e (range 10)]) e) [1] and for/fold, including the nested ones and the like that make mapping over things and even filtering a dream!
[1] https://docs.racket-lang.org/reference/for.html#%28form._%28...