Skip: A programming language to skip the things you have already computed
skiplang.com
skiplang.com
Forbidden
You don't have permission to access / on this server.
You have to add www. to mazda.com before you can see any damn cars.And it's just one car I see; some fat SUV that looks like it's about to give birth to a pair of sporty twins.
Edit: Darn, I actually only count 6 cars on mazdausa.com
Do you work for Mazda, or else how do you know? Is this intent published on the real site somewhere, which is what the user is trying to find in the first place when they try mazda.com?
Maybe this is just some webmaster that needs to have their ass fired.
Trying "mazda.com" for Mazda is the obvious thing for a user to do. I just tried half a dozen multinational corporations that are associated with well-known consumer brands, they all have a page at <name>.com or redirect to one. It is not in any way "bogus" to try that.
The mazda.com page doesn't even provide a clue as to where the expected site actually is; that's what is "bogus". For a second I was wondering whether Mazda actually own the domain, or is that someone squatting (yet using a Mazda logo favicon).
Not to have a page there which redirects the user to the real one, and just a permission error, comes across as astonishingly unprofessional, especially for a company of the proportions of Mazda. (If it was Uncle Bob's Pizza down the street, I might not think so as much.)
That used to be the case, but I would argue strongly that it is no longer. Now the obvious and normal thing to do is type "Mazda" into a search engine. In the USA, mazdausa.com is the top hit. (And Wikipedia is second.)
There's this thing called common sense. Either they have a broken "naked domain" homepage for months and they didn't notice, or their homepage is www.mazda.com.
>Trying "mazda.com" for Mazda is the obvious thing for a user to do.
OK, fine, whatever.
>Not to have a page there which redirects the user to the real one, and just a permission error, comes across as astonishingly unprofessional
Which is neither here, nor there, to the actual question of this subthread: whether they have cars on their homepage.
That they have the naked domain not redirect to www, doesn't mean their homepage is that and not the one they actually present, fill-in, and treat as such.
Who said mazda.com is the homepage, and not www.mazda.com?
You must be like paid not to get it or something?
The corporate and product sites you are talking about firstly (1) exist and (2) link to each other. "Hey, this is our corporate site; if you're looking for products, click here."
Can you find another company that has the same revenue figures as Mazda (multi-billion dollars), and that is a widely recognized consumer brand, which has a broken web page at their root domain that doesn't redirect or link to anything, or even greet the user in any way?
It's pretty weird.
A quick take on the front page can't possibly explain much about a language, maybe just a sample of syntax? I don't know why it would've been useful.
In my opinion a programming language landing page without code example is like a game's Steam store page without screenshots - it's cool to know it's a "fast-paced racing game" but that could apply to everything between Tux Racer and Gran Turismo.
TypeScript's website shows right at the top in a few lines how it makes an easy mistake in JS impossible. Zig's site has a nice example that gives you an idea of some added features, how it differs from C but still feels similar. Rust's website had an editable and runnable code snippet showing iterators and pattern matching (although for some reason they later replaced it with the phrase "blazingly fast" in the redesign).
I got bored after about 5 pages, everything presented there is the same as in any other language. I want to see what differentiates this language from others, not what's the same.
That is what a landing page of any new language must accomplish - sell the reader on the power of your unique features as fast as possible.
When discussing a language which is defined by caching values, we sure do want to see how that looks like in practice.
Unfortunately, we use a proprietary fork of SKIP, so that's why the OSS project looks dead.
We might open-source our version some day, but no plans for now.
I really hope you are successful in tackling this problem and that you can share your work.
I had to pass because of its prohibitive license (for now) and the head-scratching bugs I ran into with the direct Postgres source. I also had some concerns about the complexity Materialize would add to architecture of the sort of small apps I typically build.
I know this is unappreciative of the complexity of the problems that Materialize solves, but it would be so nice if Postgres just had observable (with triggers), no-compromise incremental materialized views.
What sort of experiences have you had with Materialize, if any?
I've started doing that in exactly this fashion `>*quote*\n`, precisely to avoid the er, mention/disparage distinction.
Using != to assign a value feels really strange to me. I know some languages use := but in those languages typically it's because = is an equality operator. I'm sure there are some exceptions but != just so universally means "not equal" to me.
http://skiplang.com/docs/functions.html#variables
Misspelled variable assignments will silently succeed, rather than error because the symbol doesn't exist. I think that's a massive mistake and it speaks to a relative lack of large project development on behalf of the Skip designers.
So, I guess, in a backwards way, it's better for them to hide their syntax away from the home page, because I wouldn't have spent as much time on the site if I had seen that right away. "Time on site" metric improved, but to no meaningful result.
Also, in the year 2022, the site does not have a TLS certificate.
Skip – A programming language to skip the things you have already computed - https://news.ycombinator.com/item?id=18077612 - Sept 2018 (100 comments)
Guessing if something has side effects instead of making it explicit makes me already want to run away when I think about debugging.
>written by a bunch of html/js developers
Ah so because they have rediscovered something it’s meant to be revolutionary?
Then I wondered if this was already implemented for some functional languages. Then I read your comment.
It was quite the ride.
Skip was meant to gradually replace Hack, but the FB codebase turned out to be too tangled to gradually convert to the reactive paradigm, and a big rewrite was not possible, so FB pulled the plug, then Julien kept on pushing the project independently.
Edit: Oh, apparently that's not the case... Or maybe I missed something.
http://skiplang.com/playground/#bXV0YWJsZSBjbGFzcyBGb28obXV0...
Edit2: `debug()` is tracked as an effect, causing `get()` not to be memoized. Unfortunate...
http://skiplang.com/playground/#bXV0YWJsZSBjbGFzcyBGb28obXV0...
Do you compare the pointer for equality, or do you follow it and deep-compare what’s on the other side?
What about the next pointer jump? What if there’s a class instance? What if there’s a reference cycle?
Python lets you implement custom logic in __eq__() to manually bridge some of these gaps, but doing that for everything can get out of hand. Also, deeply-traversing large objects to check equality can get arbitrarily expensive. Immutable structures simplify these comparisons (just compare everything as a value, any change will mean a new pointer), but obviously introduce certain constraints.
By tracking observed properties of mutable structures at runtime, and then publishing cache invalidations only when they change, you can:
- Do no extra work to know whether or not a cache has been invalidated
- Automatically and perfectly track everything the function “cares about”
- Track only the things it cares about, so changes to properties it doesn’t actually use won’t invalidate the cache
See the MobX docs for more (I’m not closely familiar with Skip directly, but from what I’ve seen it works on very similar principles): https://mobx.js.org/understanding-reactivity.html
http://skiplang.com/docs/lvalues.html
I think some of the phrasing there ("the variable x is going to be updated to point to a new copy of the object pointed to by x where field1 has the value 0") would really benefit from some graphics. Nothing fancy, something similar to what the Rust book does for ownership would help.
https://doc.rust-lang.org/book/ch04-01-what-is-ownership.htm...
> Caching with Reactive Invalidation
But a Cmd+F for "cach" in the docs doesn't turn anything up. Anybody know where it goes into more detail on that?
> Copyright © 2022 Facebook Inc.
But any typical copying GC only has to scan memory reachable from the root(s) of a mutator. I suspect there are more interesting optimisations, but I am unable to discern them from this statement.
collect { // Some code return ...; }
Well, if you don't have a type-system that tells you what is mutable, you have to either scan all the mutable roots, or maintain a write-barrier to know what could have captured data in the scope.
The problem with write-barriers, which is the go-to solution for generational GCs. Is that it is a conservative approach. Meaning, it will promote garbage in the cases where the pointer that lived outside of the scope is dead.
Let's take an example, again, in pseudo code:
myObject = { field1: []};
collect { myObject.field1 = [A, B, C]; myObject = null; }
If you use a write-barrier, what is going to happen is that [A, B, C] is going to be promoted, because the barrier is going to track the object myObject, and it doesn't realize that it's dead.
However, instead, imagine you have a type-system that tells you that in that scope, the only thing that can be mutated is myObject!
Well, now you can run that in a loop, without accumulating garbage!
Makes sense?
I would be more tempted as a compiler writer to delete all the code, since nothing is ever read outside the loop; but such analysis again doesn't depend on mutability type information per se, rather on what mutations occur in the program.
Am I correct that the cache invalidation logic is akin to pull streams, unlike computations in projects like S.js/Surplus, Solid.js or Sinuous, that are push-based?