10 comments

[ 3.2 ms ] story [ 24.8 ms ] thread
The title is misleading. It's an implementation of _a_ concatenative language. It's not Factor.
You're right, I should have introduced it as a subset of Factor. Factor is much more full-featured, but the syntax of the language is in line with Factor's.
I am aware of the role of the stack in concatenative languages, but what about the retain parameter in the primitive functions? In most of them it is unused...
The retain parameter is a secondary stack for temporarily storing things from the data stack. It can be manipulated through the `r>` and `>r` words. The former puts the top of the data stack at the top of the retain, and one does the opposite. The `dip` word isn't a primitive in this implementation, but instead is defined as `swap >r call r>`, which saves the value underneath the top value of the stack (which is expected to be a quotation), calls the quotation, and then restores the retained value to the top of the data stack.
This clearly derives from Forth's (much lower level) manipulation of the return stack as transient storage (with the same operators).
Two stacks are halves of Turing machine tapes: http://en.wikipedia.org/wiki/Stack_machine#Stacks_in_automat...
Does this mean that the language would not be Turing-complete without the second stack?

What is the retain stack typically used for?

This precisely mean that language without second stack (more or less) is not Turing complete.

But, if your language can store lists on a stack, you're Turing complete again! One example if a Joy language, where you can have quotation on stack, assemble them and decompose back.

Most of the time you store there various intermediate values. It depends on the nature of language. For example, Forth variants often store loop counters on retain stack.

Just as an FYI, one of the properties of Factor and stack-based languages is that they are extremely simple -- almost trivial -- to implement an interpreter for. The main benefit of this interpreter would probably be to simply describe the syntax and evaluation structure of a stack-based language to one unfamiliar with the concept and not, instead, as a technical case study.