What is the difference between Snap! and Scratch?

I've seen the blocks in Snap, and compared them to those in Scratch 2.0. Snap seems to be a carbon copy of it in some ways. Is this true?

Did you see these blocks in Scratch?

You shouldn't have because Scratch doesn't have any of them. ALL of these blocks are new in Snap.

I don't think it's just that we added a lot of blocks (most of those are for media computation, working with pictures and sounds). The two crucial differences are that we added first class procedures (you can make a block or script be the value of a variable, an item in a list, etc.) and first class lists (lists can have items that are themselves lists).

If you're interested, you might want to read "Why Do We Have to Learn This Baby Language?", which is a paper I wrote to address the questions of high school students who think they already know everything blocks languages have to teach.

I enjoyed reading your paper very much. I think it is not listed at https://people.eecs.berkeley.edu/~bh/papers.html , yet.

(I think it merits to be listed along the other papers written by you because, as I said, I enjoyed reading it.)

Also, while I was re-reading it thru the eyes of my "inner teenager", I somehow ended up rephrasing it here as I'd like to translate it into my language (some day), if you don't mind.

I have a question.

Can you explain what you mean by the words I underlined in the print-screen below:
baby language

Actually it is the "declared as public methods" portion that I don't understand, can you give an example of a block being declared by a receiver...as public method.

Thank you.


Not in Snap!; the point of that paragraph is that for us, all sprite-local procedures are public. But in traditional OOP languages there's always a way to distinguish private procedures from methods that are available from outside the object. In Java you actually use the keyword "public." In some languages there is a syntax for internal definitions, which are accessible only in the scope surrounding the definition. (We can actually do that awkwardly in Snap! by assigning a ringified script to a variable and then CALLing or RUNning it. A proper syntax for it (by something like make-a-block from inside a Block Editor) is on our someday list.))

Good point! Fixed, thanks.