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 程序员使用它们?
所以,我想在 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 程序员使用它们?