Многострочные функции в 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?

Другие вопросы по тегам