[Coco] Back to DEF FN

Arthur Flexser flexser at fiu.edu
Tue Jan 28 13:29:03 EST 2014


Well, this raises the more general question of what happens if a dummy
argument used in a function definition has the same name as a scalar
variable used by the program.  For example:

10 DEF FN(P) = P+3

20 P=20

30 Z=FN(5)

The value of Z should now be 8, but what is now the value of P?  Is it
still 20, or has it changed to 5?

Art



On Tue, Jan 28, 2014 at 1:14 PM, Aaron Wolfe <aawolfe at gmail.com> wrote:

> There are two tables of variables in BASIC as William mentioned.  One
> holds scalars, one holds arrays.  The ARYDIS flag causes the variable
> lookup routine to simply skip the table of arrays when looking for a
> match to the input variable name.  In the DEF FN case, this
> effectively prevents arrays from ever being used as the variable
> argument.  In your example the DEF FN(B) would always refer to the
> scalar B, never the array B.
>
> On Tue, Jan 28, 2014 at 12:49 PM, Arthur Flexser <flexser at fiu.edu> wrote:
> > Aaron, what does that "array search disable" do?   I'm guessing that if
> you
> > define FN(B)=B+3, that the array search disable means it makes no
> > difference if the dummy variable B happens to be the name of a declared
> > array or not.  Is that correct?
> >
> > Art
> >
> >
> > On Tue, Jan 28, 2014 at 12:29 PM, Aaron Wolfe <aawolfe at gmail.com> wrote:
> >
> >> Extended Basic Unravelled contains a detailed disassembly of the DEF
> >> code.  Here is the relevant bit:
> >>
> >>
> >> 1015 8880 BD B2 6A // JSR LB26A
> >>     SYNTAX CHECK FOR '('
> >>
> >> 1016 8883 C6 80 // LDB #$80
> >>    GET THE FLAG TO INDICATE ARRAY VARIABLE SEARCH DISABLE
> >>
> >> 1017 8885 D7 08  // STB ARYDIS
> >>    AND SAVE IT IN THE ARRAY DISABLE FLAG
> >>
> >> 1018 8887 BD B3 57 // JSR LB357
> >>    GET VARIABLE DESCRIPTOR
> >>
> >> 1019 888A 8D 25 // BSR L88B1
> >>    'TM' ERROR IF STRING
> >>
> >> 1020 888C BD B2 67 // JSR LB267
> >>    SYNTAX CHECK FOR ')'
> >>
> >> As you can see, there is no loop or any other mechanism that might
> >> allow more than a single variable to be parsed.
> >> The docs might be inconsistent or confusing, but the code is clear.
> >>
> >> -Aaron
> >>
> >>
> >> On Mon, Jan 27, 2014 at 7:37 PM, Rogelio Perea <os9dude at gmail.com>
> wrote:
> >> > Just got delivered a library copy of Peter Vernon's "Making The Mos of
> >> Your
> >> > TRS-80 Color Computer", it was the bargain bin on Amazon
> (Prentice-Hall
> >> > Australia 1983 ISBN 0 7248 0752 7).
> >> >
> >> > Leafing through the pages I came to the section where each ECB
> command is
> >> > listed, an odd wording of the old DEF FN caught my eye:
> >> >
> >> > 10 DEF FN( A B C)=(A+B+C)/3
> >> > 20 INPUT"ENTER THREE NUMBERS";A,B,C
> >> > 30 D=FNA(A B C)
> >> > 40 PRINT"THE AVERAGE IS";D
> >> > 50 PRINT
> >> > 60 GOTO 20
> >> >
> >> > I was perplexed for a bit. Could it be that the proper syntax on the
> >> CoCo's
> >> > DEF FN requires the variables to be separated by a space instead of a
> >> > comma? could it be *that* simple?
> >> >
> >> > I retyped the MOD routine into the CoCo as:
> >> >
> >> > 10 DEF FNRE=(N1 N2)=N1-INT(N1/N2)*N2
> >> > 20 CLS
> >> > 30 INPUT"NUMBER 1";N1
> >> > 40 INPUT"NUMBER 2";N2
> >> > 50 PRINT
> >> > 60 PRINT N1;"MOD";N2;"IS";FNRE(N1 N2)
> >> > 70 PRINT
> >> > 80 GOTO 30
> >> >
> >> > And it worked. This routine above is based on one shown by Lewis
> >> > Rosenfelder in "Basic Faster And Better & Other Mysteries" book. I was
> >> on a
> >> > roll and ported another one from Rosenfelder's (date day # finder):
> >> >
> >> > 10 CLS
> >> > 20 DEF FNJD(Y M
> >> > D)=(M-1)*28+VAL(MID$("000303060811131619212426",(M-1)*2+1,2))-((M>2)
> AND
> >> > ((Y AND NOT -4)=0))+D
> >> > 30 INPUT"YEAR (1901-2099)";Y
> >> > 40 INPUT"MONTH (1-12)";M
> >> > 50 INPUT"DAY (1-31)";D
> >> > 60 PRINT
> >> > 70 PRINT"THAT IS THE";FNJD(Y M D);"DAY OF THE YEAR"
> >> > 80 PRINT
> >> > 90 END
> >> >
> >> > Still smiling as I type this. The CoCo ECB book sins in being sparse
> at
> >> > best on covering one of the most underrated functions in the BASIC
> >> > repertoire, one that can come useful if applied properly. It had been
> >> years
> >> > (decades actually) since the first time I fiddled with DEF FN and it
> was
> >> > disappointing back then that I could not get it to work with 2 or more
> >> > arguments... I was using the syntax I knew from the TRS-80 Model I and
> >> III
> >> > BASIC separating the arguments by commas.
> >> >
> >> > With all this, the CoCo's DEF FN is still limited to numeric
> functions as
> >> > far as I know; ran a routine trying to define a string variable
> function
> >> > (simple concatenation) and the CoCo returned a type mismatch error. Oh
> >> > well, having this found to work with multiple variable arguments is
> in my
> >> > eye *the* discovery of the 21st century. Old ECB CoCo style :-)
> >> >
> >> >
> >> > -- RP
> >> >
> >> > --
> >> > Coco mailing list
> >> > Coco at maltedmedia.com
> >> > http://five.pairlist.net/mailman/listinfo/coco
> >>
> >> --
> >> Coco mailing list
> >> Coco at maltedmedia.com
> >> http://five.pairlist.net/mailman/listinfo/coco
> >>
> >
> > --
> > Coco mailing list
> > Coco at maltedmedia.com
> > http://five.pairlist.net/mailman/listinfo/coco
>
> --
> Coco mailing list
> Coco at maltedmedia.com
> http://five.pairlist.net/mailman/listinfo/coco
>



More information about the Coco mailing list