

Factor implementation in 150 lines of Python - jdp
https://gist.github.com/731475

======
kssreeram
The title is misleading. It's an implementation of _a_ concatenative language.
It's not Factor.

~~~
jdp
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.

------
thesz
By implementing a variant of Joy concatenative language in Haskell I learnt
monads:

<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.

------
ntoshev
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...

~~~
jdp
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.

~~~
thesz
Two stacks are halves of Turing machine tapes:
[http://en.wikipedia.org/wiki/Stack_machine#Stacks_in_automat...](http://en.wikipedia.org/wiki/Stack_machine#Stacks_in_automata_theory)

~~~
ntoshev
Does this mean that the language would not be Turing-complete without the
second stack?

What is the retain stack typically used for?

~~~
thesz
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.

------
Locke1689
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.

