≡ Передовица » Макулатура » ИиО » Функции пользователя на Агате
Функции пользователя на Агате (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. Необходимо только следить, чтобы номера строк двух программ не перекрывались. * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |