Тема: Бейсик и стандарты
Тут в группе речь зашла о стандартах на язык Бейсик. Про стандарты есть даже упоминание в документации на Бейсик Агат. Заявлено, что он соответствует какому-то загадочному стандарту АНСИ Х30 1978. Такого в природе не нашлось, но нашелся стандарт ANSI X3.60-1978.
Глянул я в стандарт и нашел некоторые любопытные моменты. Например, оказалось что в Бейсике допустимы два варианта написания операторов GOTO и GOSUB. Можно писать слитно, а можно через пробел - GO TO, GO SUB.
Ну, я решил поставить опыт и написал простую программку:
10 GO TO 100
20 STOP
100 PRINT "HELLO"
110 GO TO 20
Ввел ее на Агате и на Apple и вывел листинг.
На Apple ][ оператор "склеился" в обычный GOTO:
10 GOTO 100
20 STOP
100 PRINT "HELLO"
110 GOTO 20
Программа запускается и работает.
А вот на Агате (проверял в Бейсике-60 и ИКП-7) результат отличается. Пробел остался:
10 GO TO 100
20 STOP
100 PRINT "HELLO"
110 GO TO 20
Но самое интересное, что при запуске программа падает в 10 строке с синтаксической ошибкой. То есть, там не оператор GOTO. Судя по байт-коду, это переменная GO и оператор TO.
Потом проверил GOSUB:
10 GO SUB 100
20 STOP
100 PRINT "HELLO"
110 RETURN
На Apple ][ оператор вернулся в "склеенное" состояние:
10 GOSUB 100
20 STOP
100 PRINT "HELLO"
110 RETURN
Программа работает нормально.
На Агате результат неожиданный:
10 GO SUB100
20 STOP
100 PRINT "HELLO"
110 RETURN
Программа падает в строке 10, но теперь тут две переменных: GO и SUB, а после SUB число 100.
Еще один пример. Немножко хулиганский, так как по стандарту перед каждым оператором должен стоять пробел. Что должен делать интерпретатор, если пробела нет - стандарт умалчивает. Программка такая:
10 A=5
20 FORI=ATOA*2
30 PRINTI
40 NEXT
Apple это понимает без проблем и выводит такой листинг:
10 A = 5
20 FOR I = A TO A * 2
30 PRINT I
40 NEXT
А вот Агат - не очень:
10 A = 5
20 FOR I = AT OA * 2
30 PRINT I
40 NEXT
ATOA превратилось в оператор AT и переменную OA. Похоже, что Бейсик Apple сначала ищет оператор TO, а потом пытается разобраться с именами переменных. А вот Бейсик Агат разбирает все последовательно и первым находит оператор AT.
Бейсик Apple тоже можно "ввести в заблуждение". Например, если переименовать переменную A в BAT, то он "увидит" это как переменную B и оператор AT. Но оператор TO он найдет и в этом случае.
Получается, что добавление новых возможностей в Бейсик Агат заодно привело к некоторой потере совместимости со стандартом.
Интересно, что оператор DEF FN работает на Apple и Агате одинаково. Можно ввести DEFFNA(X), можно DEF FN A(X) - разницы нет, все работает правильно.