Передовица » Макулатура » ИиО » Функции пользователя на Агате

Функции пользователя на Агате (N1/1991)

Вы думаете, речь пойдет об операторе DEF FN ? ;) Не, не угадали. Речь идёт о более хитрой штуке - самомодифицирующейся basic-программе. Суть очень простая: программа готовит модифицированную версию одной из собственных строк (или группы) и записывает новый вид строки в файл вместе с командой собственного перезапуска. Затем переключает STDIN на ввод из этого файла и прерывает своё исполнение. Операционка даёт приглашение к диалогу, но т.к. ввод перенаправлен, последующие команды читаются из файла: бейсик модифицирует программу и запускает её вновь (возможно, не с начала). Файл закончился, операционка возвращает STDIN клавиатуре, клиент доволен.

Ю.Коломиец. Разыскивается! Если вы автор или что-то знаете о нём, свяжитесь с нами! (ЗАЧЕМ ЭТО?)

В арсенале Бейсика "Агата" есть оператор EXEC, назначение которого, судя по документации, "исполнение текстовых файлов". Немногие знают, как им пользоваться, а для него можно найти интересные приложения.

Взять хотя бы определение функций пользователем в режиме диалога. Вообще-то для описания функций существует оператор DEF FNF(X), но в диалоге он не работает. Чтобы изменить вид функции в какой-либо программе, необходимо прервать её выполнение, набрать с клавиатуры соответствующую программную строку и снова запустить программу. А можно поступить более оригинально - запросить вид функции в диалоге с пользователем, записать определение функции в виде программной строки в текстовый файл, а затем оператором EXEC ввести строку в программу и передать на неё управление.

Ниже приводится часть текста программы, реализующей этот метод. В строке 20 пользователь вводит с клавиатуры вид интересующей его функции. Затем управление передаётся на строку 640. Во время работы программы в НГМД должна быть вставлена дискета. На диске создаётся текстовой файл со строкой, в которой определяется функция, а также командой передачи управления GOTO 40. После закрытия файла FUNK его содержимое оператором EXEC вводится в программу.

10 HOME: PRINT "ЗАДАЙТЕ ВИД ФУНКЦИИ": PRINT
20 INPUT "F(X)=";F$
30 GOTO 640 'ОПРЕДЕЛЕНИЕ ФУНКЦИИ ЧЕРЕЗ ФАЙЛ
40 HOME
.
.
.
640 REM СОЗДАНИЕ ПРОГРАММНОЙ СТРОКИ С ОПРЕДЕЛЯЕМОЙ ФУНКЦИЕЙ
650 PRINT: PRINT CHR$(4);"OPENFUNK"
660 PRINT: PRINT CHR$(4);"WRITEFUNK"
670 PRINT "50 DEF FNF(X)=";F$
680 PRINT "GOTO 40"
690 PRINT: PRINT CHR$(4);"CLOSEFUNK"
700 PRINT: PRINT CHR$(4);"EXECFUNK"

Оператору EXEC можно найти ещё одно ценное применение. Пусть не печалятся пользователи "Агата", что они не имеют оператора MERGE для объединения двух Бейсик-программ. Объединение можно осуществить с помощью несложной процедуры.

Программа, подлежащая присоединению, записывается в текстовой файл. Сделать это можно так: в начале программы открывается на запись файл с каким-либо именем, затем командой LIST содержимое программы записывается в файл, который после этого закрывается. Вот пример.

10 ?:? CHR$(4);"OPENFILE"
20 ?:? CHR$(4);"WRITEFILE"
30 LIST 40,50
40 HOME
50 ?"ПРИВЕТ!"
60 ?:? CHR$(4);"CLOSEFILE"

Теперь достаточно исполнить эту программу, загрузить в ОЗУ другую программу, подлежащую объединению, и дать команду EXECFILE. Необходимо только следить, чтобы номера строк двух программ не перекрывались.

* * *

Использование материалов проекта agatcomp без получения предварительного письменного разрешения agatcomp запрещено.


Почта для обратной связи: mail@agatcomp.ru


Живое общение по теме Агата: Telegram группа Agatcomp.


Накопленные знания и проекты: тематический ФОРУМ.


© 2004-2024 agatcomp.su / agatcomp.ru

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *