OT: Punctuation-starved Programming Languages
Sean Conner
spc at conman.org
Wed Jun 21 22:54:34 CDT 2006
It was thus said that the Great John R. once stated:
> On 6/21/06, Sean Conner <spc at conman.org> wrote:
>
> > Well, in Forth, functions are called "words" and + is a word. So is (.
> >As is @. And !. As well as 0 [1], 1 [1] and 2 [1]. There are only a few
> >words (in ANS Forth) that require looking ahead and they're well known.
> >Most of the words in Forth pull parameters off the stack.
> >
> > -spc (And one can always rename @ as fetch)
>
> I could imagine a Forth-like language that has no readahead words and
> no punctuation that could still be recognized as forthish.
> Particularly if you use tail recursion to replace loop nesting like
> Colorforth and 4IM do.
Well, having written my own Forth-like language the only hack I found I
needed was a way of recognizing a quote terminated string and dumping it
(the string) on the stack. So I didn't have to read ahead into the input
stream ... well ... not in the way that : does in Forth. I did something
like:
"foo" define ( the code for foo here ... ) ;
(only, it looked more like:
"foo" :' ( the code for foo here ... ) ;
)
There's no need to read ahead for loops either and I supported while,
until and just about any other type of loop you care to do. Here's the code
I had for supporting higher level loops (and yes, I did support the Forth
word : in my language anyway):
// '(barf)' '(brat)' '(bra)' 'here' and '(resolve)' are the low level routines to
// implement branches of various types.
: c(barf) '(barf)' find drop compile ; // compile a branch if false
: c(brat) '(brat)' find drop compile ; // compile a branch if true
: c(bra) '(bra)' find drop compile ; // compile a branch
: (mark) here -1 compile ; // leave fixup addr on stack
: resolve here swap (resolve) ; // resolve foreare/back branch
( the always popular if else then clause ... )
: if c(barf) (mark) ;imm
: ifnot c(brat) (mark) ;imm
: else c(bra) (mark) swap resolve ;imm
: then resolve ;imm // because it's been like this
: endif resolve ;imm // because some might like this better
( some otherwise neato control flow words ... )
: begin here ;imm
: until c(barf) here - compile ;imm
: notuntil c(brat) here - compile ;imm
: while c(barf) (mark) ;imm
: whilenot c(brat) (mark) ;imm
: repeat c(bra) swap here - compile resolve ;imm
-spc (Even used this language for a class in college for a project)
More information about the cctalk
mailing list