Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Posting-Version: version B 2.10.2 9/3/84 (WLS Mods); site astrovax.UUCP
Path: utzoo!watmath!clyde!burl!ulysses!mhuxj!ihnp4!astrovax!wls
From: wls@astrovax.UUCP (William L. Sebok)
Newsgroups: net.lang.forth
Subject: Re: Speaking of Princeton
Message-ID: <456@astrovax.UUCP>
Date: Fri, 28-Sep-84 20:59:33 EDT
Article-I.D.: astrovax.456
Posted: Fri Sep 28 20:59:33 1984
Date-Received: Sat, 29-Sep-84 10:07:08 EDT
References: <3033@utah-cs.UUCP> <128@cadovax.UUCP>
Organization: Princeton Univ. Astrophysics
Lines: 59

Here are a few answers to a couple of recent questions.  These words have
been tested on the Forth at astrovax.

> While the recent distribution of Princeton FORTH is still fresh
> on our computers, I've been evolving a list of "how do you do it"'s
> and was wondering if any of you out there have had similar problems/
> successes:
> 
> 1. How do I implement the equivalent of ?TERMINAL  ?

A definition for ?TERMINAL (called KEY? in Forth 83) in Princeton Forth under
either BSD 4.2 or 4.1 would be:

HEX
find 4.2BSD #if  4004667f  #else 667F #then  CONSTANT FIONREAD
DECIMAL

VARIABLE NBYTES

: ?TERMINAL  NBYTES FIONREAD TYPER @ A1+ @ $IOCTL ?UERROR  DROP
 NBYTES @ ;

This returns the number of characters waiting to be input.  Ordinarily it only
knows about full lines of characters.  However when the terminal is in raw
mode (set by  ) it knows about individual characters.  Beware
that both  flush input, i.e. forget all pending input characters.
This is known as living with what Unix provides.  The next version of my vax
forth is likely to have ordinary input in CBREAK mode (to provide extra
interactive features) so it may not have those restrictions.

> 2. How can I implement my own control structures ( such as Charles Eaker's
>    CASE statement ) without resorting to otherwise unknown assembly language?

A version of the CASE you requested would be:

VARIABLE CSP

: OF  COMPILE OVER  COMPILE =  [COMPILE] IF  COMPILE DROP ;
 IMMEDIATE

: CASE  'S CSP ! ; IMMEDIATE

: ENDOF  [COMPILE] ELSE ; IMMEDIATE

: ENDCASE  COMPILE DROP
 BEGIN  'S CSP @ <> WHILE  [COMPILE] THEN  REPEAT ; IMMEDIATE

Alternatively OF could be

: OF  [COMPILE] CASE ; IMMEDIATE

using the old CASE, which does the same thing as OF should do.

This has no compile time testing.  I should consider adding some of that to
this implementation.  Right now this implementation shows its Forth Inc. forth
ancestry and little or no compile time checking.
-- 
Bill Sebok			Princeton University, Astrophysics
{allegra,akgua,burl,cbosgd,decvax,ihnp4,noao,princeton,vax135}!astrovax!wls