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 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.
10 comments
[ 3.2 ms ] story [ 24.8 ms ] threadWhat is the retain stack typically used for?
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.
http://tech.groups.yahoo.com/group/concatenative/message/471
I checked it up, it also counts at 150 lines of code, including comments and headers. A strange coincidence, I say.