Commodore 64 BASIC 中的多行功能

Multi-line functions in Commodore 64 BASIC

所以,我想在 Commodore 64 BASIC 中编写更大的函数。到目前为止,从我从其他来源(例如各种 C64 wiki,以及 C64 本身的用户手册)中看到的情况来看,函数定义只能是一行。 也就是说,我似乎无法在 BASIC 中找到与 brackets/whatever 其他语言用来描述代码块的类似结构。

有谁知道我如何在 BASIC 中编写超过一行的代码块?

单行函数示例:

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

但我不能做类似的事情:

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

感谢您的宝贵时间!

很遗憾,C64 BASIC 不支持更复杂的函数

但是它支持更复杂的子例程,这就是您在这种情况下想要的。

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

不幸的是,在 C64 BASIC 中将参数传入子例程并从子例程中返回值不是形式化的结构,因此您只需使用上面所示的普通变量。

根据我的记忆,您几乎可以使用 colan 在一行中包含多个命令来执行此操作。不是最优雅的解决方案,但会让你分解:

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

变成

10 n=n+1: print n

请注意,您不能传递参数,因此您必须声明并让 BASIC 堆栈为您处理。通常我会像这样构建程序:

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

好久不见;从内存中,% 字符将变量声明为整数,类似于 $ 将其声明为字符串。

您可以将现有变量和数学命令与 DEF FN 一起使用,例如,如果您想要 PRINT 0 到 10 包含在 4 位字节中,可以这样做:

 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

我试过嵌套函数,但它太混乱了。事实上,我还没有看到很多使用 DEF FN 的列表。也许一些 high-brow artisan 时髦的 BASIC 程序员使用它们?