Многострочные функции в Commodore 64 BASIC
Итак, я хотел бы написать более крупные функции в Commodore 64 BASIC. Пока что из того, что я вижу из других источников (таких как различные вики C64, а также из руководства пользователя для самого C64), определения функций могут быть длиной только в одну строку. То есть я не могу найти аналогичную конструкцию в 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
Спасибо за ваше время!
3 ответа
К сожалению, 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 не являются формализованными конструкциями, поэтому вам просто нужно работать с обычными переменными, как показано выше.
Из того, что я помню, вы можете сделать это практически с помощью двоеточия, чтобы иметь несколько команд в одной строке. Не самое элегантное решение, но позволит вам разобраться:
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-битных nybbles, можно сделать это:
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
, Может быть, их используют некоторые программисты-хипстеры BASIC?