Thanks! And oh, for longer discussions do pop in on gitter, gokr/spry. Some attempts at answers:
Yes, the select: there is not polymorphic, it's simply a function (as of right now).
clone is a primitive function, can be seen here:
https://github.com/gokr/spry/blob/master/src/spryvm.nim#L180...
(search for "clone" on that page to find the Nim implementations for the various basic node types)
whileFalse: is also a primitive and can be seen here:
https://github.com/gokr/spry/blob/master/src/spryvm.nim#L190...
So yes, these are examples of primitive Spry functions that are implemented in Nim.
Regarding the larger question, you can implement control structures in Spry, but they are obviously quite a lot slower. Also, it's worth noting that whileTrue: and friends are normally in Smalltalk implemented using special case bytecode tricks (jump).
But you are correct in wondering about polymorphism, and Rebol doesn't AFAIK have anything like it - Carl shunned OO when creating Rebol. In Spry I am working on a concept of tags and what I call polyfuncs. Any node can have one or more tags added to it and functions can have multiple sub functions dispatched over based on these tags. The basics of this already works:
https://github.com/gokr/spry/blob/master/src/sprytest.nim#L4...
Hard to read I guess, but it basically creates a polymorphic function "inc" that has two different sub funcs selected based on the tag of the receiver.
So about "design principle" - both yes and no. Spry is more "shallow" than typical Smalltalks because Spry is being implemented much more tightly together with Nim. This is by design, it makes it MUCH easier to make primitives and to interface with Nim and thus also C/C++. It's already trivial to do, and a lot of the examples show that. But I also want Spry to feel similarly "coherent" as Smalltalk does.
And yes, definitely will describe the block/list thing in the manual. Too bad this HN post happened before the manual is out there, but oh well.
But generally this is what homoiconicity means - code is in the same format as the core data structures. You can thus create and manipulate code as lists - just as in Lisp.