Многострочные функции в Commodore 64 BASIC

Итак, я хотел бы написать более крупные функции на Commodore 64 BASIC. Пока что, судя по тому, что я вижу из других источников (таких как различные вики C64, а также руководство пользователя для самого C64), определения функций могут быть длиной только в одну строку. То есть я не могу найти аналогичную конструкцию в BASIC для скобок или чего-то еще, что другие языки используют для разграничения блоков кода.

Кто-нибудь знает, как я буду писать блоки кода на 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

Спасибо за ваше время!


person user3255569    schedule 16.07.2016    source источник


Ответы (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 не являются формализованными конструкциями, поэтому вам придется работать только с обычными переменными, как показано выше.

person Feneric    schedule 16.07.2016
comment
modbasic — это базовое расширение (клин?), которое позволяет выполнять подпрограммы с параметрами и даже рекурсией. Попробуйте выполнить поиск в Интернете с помощью: modbasic commodore - person Core; 17.07.2016
comment
Вам не нужно ставить подпрограмму перед gosub. На самом деле, при нынешнем положении дел ваша программа выдаст ошибку, потому что она выполнит return до того, как выполнит gosub. - person JeremyP; 28.02.2017
comment
Я думал об этом больше как о части большего целого, но вы правы, что это вводит в заблуждение и привело бы к ошибке, если бы оно выполнялось изолированно. Я перенумеровал его и добавил еще одно примечание (комментарий), чтобы лучше его прояснить. - person Feneric; 28.02.2017

Насколько я помню, вы можете сделать это виртуально, используя колан, чтобы иметь несколько команд в одной строке. Не самое элегантное решение, но позволит вам разбить ситуацию:

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

Прошло много времени; из памяти символ % объявляет переменную как целое число, подобно тому, как $ объявляет ее как строку.

person tendim    schedule 18.07.2016

Вы можете использовать существующие переменные и математические команды с 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. Может быть, их используют какие-нибудь продвинутые программисты-хипстеры на Бейсике?

person Shaun Bebbers    schedule 08.05.2017