Компонентный Паскаль/Ввод данных в программу

Взаимодействие с пользователем править

По примерам из других частей уже известно как выводить данные на экран. Выводился и текст, и целые и дробные числа. Но в программах не было ни разу использования ввода, хотя в реальных программах оно используется постоянно. Настал момент, когда необходимо устранить этот недостаток, для успешного продолжения. Потоки ввода/вывода являются абстракцией, и на каких компьютерах (домашних, рабочих) есть и клавиатура, и мышь, и экран, и принтер -- множество каналов ввода и вывода. А на других компьютерах (промышленные, сервисные, регулирующие) этих каналов ввода/вывода нет, зато есть вводы от датчиков и выходы на исполнительные механизмы. И у них свои потребности в воде/выводе. Поэтому такой операции, как "print" в "python" у КП нет. Все подобные операции вынесены в отдельные подсистемы. И во многом -- это положительно. Ведь если что-то в языке может вполне оказаться необязательным, зачем его утяжелять? В любом случае, необходимую подсистему всегда можно либо установить, либо создать самому.

Модуль In править

В БлэкБоксе определено множество подсистем и модулей, и модуль "In" как раз предназначен для ввода информации. Более того, на самом деле этот модуль лишь побочный продукт -- он обеспечивает возможность исполнения примеров книги написанной Никлаусом Виртом в соавторстве с Райзером "Программирование на Обероне" (родственный язык КП). Какие определены переменные и структуры в модуле In:

  • VAR Done-: BOOLEAN; единственная доступная переменная, доступна только для чтения ("Done-"). Устанавливается в значение TRUE при открытии потока на чтение. И устанавливается в FALSE при первом неудачном чтении входного потока, и остаётся в этом значении до момента повторного открытия потока на чтение.
  • PROCEDURE Open. Эта процедура открывает входной поток. В BlackBox, входной поток открывается на ту точку, которая в фокусе ввода содержит тест (например, текст выделен). Если нет точки фокуса ввода, или если он не содержит текста переменная Done устанавливается в FALSE. Если есть цель фокусировки, содержащая текст, но при этом ничего не выбрано, входной поток соединяется с началом этого текста, в противном случае ввод начинается с начала выделения.
  • PROCEDURE Char (OUT ch: CHAR). Если переменная Done удерживается в TRUE, эта процедура пытается считать символ, в противном случае она ничего не делает.
  • PROCEDURE Int (OUT i: INTEGER). Если переменная Done удерживается в TRUE, эта процедура пытается считать число INTEGER, в противном случае она ничего не делает.
  • PROCEDURE LongInt (OUT l: LONGINT). Если переменная Done удерживается в TRUE, эта процедура пытается считать число LONGINT, в противном случае она ничего не делает.
  • PROCEDURE Real (OUT x: REAL). Если переменная Done удерживается в TRUE, эта процедура пытается считать число REAL, в противном случае она ничего не делает.
  • PROCEDURE Name (OUT name: ARRAY OF CHAR). Если переменная Done удерживается в TRUE, эта процедура пытается считать идентификатор, в противном случае она ничего не делает. Имя представляет собой последовательность допустимых идентификаторов Компонентный Паскаль сцепленных точками, например, "Dialog.Beep".
  • PROCEDURE String (OUT str: ARRAY OF CHAR). Если переменная Done удерживается в TRUE, эта процедура пытается считать строку, в противном случае она ничего не делает.Строка представляет собой последовательность символов, разграниченных пробелами (например: перевод строки, возврат каретки, табуляции) или двойные кавычки "").

Как видно из описания модуля, на ввод могут подаваться различные данные, и даже команды, которыми можно влиять на состояние BlackBox.