Multi-line functions in Commodore 64 BASIC
Asked Answered
N

3

9

So, I'd like to write larger functions in Commodore 64 BASIC. So far, from what I'm seeing from other sources (such as various C64 wikis, as well as the user's manual for the C64 itself,) function definitions can only be one line long. That is to say, I can't seem to find an analogous construct in BASIC to brackets/whatever else other languages use to delineate code blocks.

Does anyone know how I'd write code blocks in BASIC that are more than one line?

Example of one-line function:

10 def fn X(n) = n + 1
20 print fn X(5) rem Correctly called function. This will output 6

But I can't do something like:

10 def fn X(n) = 
20 n = n + 1
30 print n
40 rem I'd like the definition of function X to end at line 30 above 
50 fn X(5) rem Produces syntax error on line 40

Thank you for your time!

Nagari answered 16/7, 2016 at 21:47 Comment(0)
K
9

Sadly C64 BASIC doesn't support more complicated functions.

It does however support more complicated subroutines, and that's what you want in this case.

10 rem you can set up n in advance here
20 n = 23
30 gosub 50
40 rem n is now 24
50 rem start of subroutine; this line is not needed, it's just here for clarity
60 n=n+1
70 print n
80 return
90 rem now you can call the subroutine on line 50 and it'll return at line 80

Unfortunately passing parameters in to and returning values out of subroutines in C64 BASIC aren't formalized constructs, so you'll just have to work with ordinary variables as shown above.

Krell answered 16/7, 2016 at 22:30 Comment(3)
modbasic is a basic extension (wedge?) that allows you to do subroutines with parameters and even recursion. Try a web search with: "modbasic" commodorePoleyn
You don't need to put the subroutine before the gosub. In fact, as things stand your program will error because it will execute the return before it has executed a gosub.Dorfman
I was thinking of it more as part of a bigger whole, but you're correct that it's misleading and would have gotten an error if run in isolation. I've renumbered it and added another remark statement (comment) to better clarify it.Krell
K
2

From what I recall, you can do this virtually using a colan to have multiple commands on one line. Not the most elegant solution, but will let you break things up:

10 def fn X(n) = 
20 n = n + 1
30 print n
40 rem I'd like the definition of function X to end at line 30 above 
50 fn X(5) rem Produces syntax error on line 40

Becomes

10 n=n+1: print n

Note that you cannot pass arguments, so you would have to declare things and let the BASIC stack take care of it for you. Commonly I would structure programs like so:

1     rem lines 1-99 are definitions.
2     n% = 0 :  rem this declares the variable n as an integer, initializing it to 0
100   rem lines 100-59999 are the core code
101   n%=5 : gosub 60100
59999 end : rem explicit end of the program to ensure we don't run into our subroutine block
60000 rem lines 60000+ are my subroutines..
60100 n% = n% + 1 : print n% : return

It's been a while; from memory the % character is what declares a variable as an integer, similar to $ declaring it as a string.

Kordofan answered 18/7, 2016 at 12:42 Comment(0)
P
1

You can use existing variables and mathematical commands with DEF FN, for instance, if you wanted to PRINT 0 to 10 inclusive in 4-bit nybbles, one could do this:

 0 DEF FN B(X)=SGN(X AND B)
 1 FOR I=0 TO 10: REM OUR COUNTER
 2 B=8: REM OUR BIT MARKER (128, 64, 32, 16, 8, 4, 2, 1)
 3 FOR J=0 TO 3: REM WE WANT 4-BIT NYBBLES, SO 0 TO 3 INCLUSIVE
 4 PRINT RIGHT$(STR$(FN B(I)),1);: REM CALLS OUR FUNCTION
 5 B=B/2: REM MOVES TO NEXT BIT MARKER
 6 NEXT J: REM PROCESS FOR LOOP J
 7 PRINT: NEXT I: REM NEW LINE THEN PROCESS FOR LOOP I

I've tried nesting functions but it gets too confusing. In fact, I haven't seen many listings that use DEF FN. Maybe some high-brow artisan hipster BASIC programmers use them?

Pilloff answered 8/5, 2017 at 15:48 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.