Страница произведения
Войти
Зарегистрироваться
Страница произведения

Руководство по Фокалу


Автор:
Жанр:
Изобретательство
Опубликован:
22.04.2025 — 23.04.2025
Читателей:
1
Аннотация:
Нет описания
 
↓ Содержание ↓
↑ Свернуть ↑
  Следующая глава
 
 

Одни пишут стихи, другие прозу.

В том числе фанфики на чужие произведения.

А вот я, как оказалось — тоже фанфик,

но на древний алгоритмический язык...

Руководство по Фокалу

Типа от простого к сложному. Сначала про Фокал вообще, а потом про

конкретную его реализацию, Фокал-1А (или Б) сделанную в рамках проекта по

модернизации этого языка.

А на самом деле еще один своего рода акт ревизии сделанного. И выложенного. А предыдущие: якобы дополнение к гл. 4 книжки о Фокале и еще одно такое-же типа дополнение к 4й главе удалил к коврюжьей матери — что-то не нравится мне, как они были написаны...

Это не оглавление, а этапы развития и реализации тамошних идей

1.0 Базовый Фокал (как я его застал у Муравьёва Николая Ивановича)

1.1 Опен "имя_файла" Псвдоним; — чтобы сохранять и загружать программы под ОС

1.2 Всякие удобства: оператор Хелп, просмотрщик к нему, редактор командной

строки с прибамбасами

1.3 Позиционирование: Open (позиция) Псвд; и функция FTEll() чтобы её получить

1.4 Функции FBip FЦвет FKурсор FTmp FМышь FMAx FMIn — чисто красивости

1.5 Усовершенствование операторов: For — по поводу шага; If — чтобы и в

"прямой" строке (т.е. без меток) — с прицелом на скриптовые файлы, где как раз

все строчки — "прямые"; Go — чисто "за компанию", ну и чтобы цикл без счетчика

в одной (тоже "прямой") строке; Ret — чтобы результат из функции возвращать;

Set и Xecut — по нескольку выражений — выпендрёж чистой воды.

1.6 Дополнительные ключевые слова в операторе Write — чтобы выдавал

результаты работы операторов Set, Open, Do... И другую полезную информацию.

1.7 Усовершенствование функций — расширение их функционала (вместо добавления

новых) за счет:

— переменного числа параметров (что уже было, например в FRnd)

— пропуска параметров (при условии сохранения разделяющих их запятых)

— параметра в виде текстовой константы

1.8 Переменное число параметров для спецфункции FSUbroutine и настоящие

локальные перменные.

1.9 Обнаружение в недрах Фокала числового аккумулятора А1 и осознание самой

идеи "аккумуляторности".

2. Реализация графики (оператор Vizual и функция FViz) и откат к Фок-1Б:

отправка её на переосмысление и модернизацию — в силу излишней примитивности

графических примитивов.

3. Обработка ошибок: оператор Break, усовершенствование Quit и Kill

4.0 Обнаружение в недрах Фокала строчного аккумулятора А2.

4.1 Усовершенствование оператора Ask для работы с А2 — спецформаты, ввод

4.2 Усовершенствование функции FCHr для работы с А2 — редактирование

4.3 Write % — вывод из А2, скриптовые файлы: просмотр текстов и переходы

4.4 Write %форм_выражение; регистры; к параметрам "..." еще и ! и :N

4.5 Усовершенствование оператора Modify — перемещение строк, самомодификация

4.6 Шаблоны (анализирующие) в форматном выражении оператора Write %

4.7 Генерирующие шаблоны, протокол -//-

4.8 Перекодировка символов — встроенные шаблоны, передача параметра в %Х

4.9 Средство расширенной перекодировки %r и %R

5.0 Обнаружение в недрах Фокала потокового аккумулятора А3.

5.1 Механизм табулостопов как попытка деления на поля; спецкомментарий : : ;

5.2 Буферизация вывода и двойная буферизация ввода

5.3 Устройства

5.4 Усовершенствование оператора Operate для нужд навигации

5.5 Описания полей структуры — тоже в виде спецкомментария

6.0 Пересмотр графики — разделение её на "растровую" (функции FTочка FLиния)

и "векторную" (оператор Vizual) — для построения графиков по вычисленным

точкам в любых, каких хотим осях.

6.1 "Коллекции"...

.......

многое из перечисленного уже сделано, кое что — еще нет, в том числе даже

как следует не продумано...

Да, кстати: нумерация этапов — условная. Я её вот только сейчас придумал

чтобы в тексте на неё ссылаться. То есть это (увы) не номера версий: многое

стало понятно только задним числом... (В том числе в результате сочинения вот

таких вот якобы "руководств". Для чего они собственно и пишутся...)

Но сначала (1.0) то есть "базовый" Фокал. Поехали!

Фокал — очень, чрезвычайно простой интерпретируемый алгоритмический язык,

изначально предназначенный на роль калькулятора (программируемого): само его

название происходит от слов КАЛькулятор ФОрмул. Предназначен для решения

небольших задач преимущественно вычислительного характера (ну калькулятор же!),

хотя теперь уже не обязательно. Хорош именно тем, что его можно весь целиком

окинуть одним мысленным взором. (По крайней мере базовую его часть.)

Фокал во-многом похож на Бейсик, но рассчитан вовсе не на начинающих (с

сомнительной "опорой на естественный язык"), а на подготовленных пользователей,

хорошо понимающих что делают; лучше продуман, куда более лаконичен и заточен на

экономию всех видов ресурсов, в том числе и мыслительных.

Так же как и Бейсик, Фокал является языком первого поколения:

— работает с данными только встроенных в язык типов. Более того — с одним

единственным: числами с плавающей запятой. (Двойной точности.)

— для управления порядком действий использует метки и переходы к ним.

(Условный, безусловный и к подпрограмме.)

Так же как и Бейсик, Фокал ориентирован на диалоговый режим, когда

пользователь сидит за терминалом и вводит командные строчки. Строка без номера

выполняется сразу; имеющая в начале номер — помещается в память, чтобы её

можно было выполнить потом — по команде в ненумерованной, "нулевой" "прямой"

строке. (А пронумерованные строчки, соответственно "косвенные".) Строки

упорядочиваются по номерам независимо от того, в каком порядке их ввели. Уже

существующая строка с таким же номером — заменяется на новую.

Эти хранящиеся в памяти строки и являются "программой". Хотя конечно можно

заранее записать множество "прямых" строк в какой ни будь файл и переключить на

него ввод: Фокалу без разницы откуда поступают командные строки. (То есть

"скриптовым" языком он был всегда, изначально.) А вот способен ли на такое

Бейсик — даже и не знаю: сильно от реализации зависит...

Так же как и в Бейсике, в Фокале номера строк служат как метками для

операторов передачи управления, так и используются для всяких манипуляций со

строками: сохранения, удаления, вывода на терминал или на печать.

Но в отличии от Бейсика, строки в Фокале нумеруются не целыми, а дробными

числами. В результате программа получается не сплошным массивом строк, а

разбита на группы, в каждую из которых удобно поместить одну подпрограмму,

выполняющую некоторое законченное действие. Соответственно, целое число

обозначает всю группу, а дробное — одну конкретную строку. А вот когда надо

указать всю программу (в операторах запускающих её выполнение Go, Do, выводящем

на печать — Write или стирающем — Eraze) то используют ключевое слово Ales

("всё").

Так же как и в Бейсике, в Фокале командная строка состоит из "операторов",

каждый из которых выполняет одно законченное элементарное (для данного языка)

действие. Каждый оператор обязательно начинается с ключевого слова. И иногда

только из него и состоит. Например Quit ("завершить", "прекратить", "покинуть")

в косвенной строке останавливает выполнение программы, а в прямой — завершает

работу самого интерпретатора Фокала — позволяет "выйти" из него обратно в

операционную систему, откуда он запущен. (Хотя в оные времена выходить было

просто некуда: Фокал, как и Бейсик, работал на "голой" машине и был сам себе

операционной системой.)

Однако, в отличии от Бейсика, в Фокале все ключевые слова подобраны на

разные буквы алфавита. И могут сокращаться до одной первой буквы. (Все

остальные всё равно игнорируются — до ближайшего символа-разделителя, например

пробела.)

В строке может быть как один оператор, так и несколько — сколько

поместится. В Фокале операторы разделяются символом точка с запятой. Внутри

оператора он не встречается. Части оператора, если надо, разделяются запятыми.

А более мелкие вещи — точками: например так целая часть числа отделяется от

дробной: 3.14159265358979323846 — число Пи.

(А вот в Бейсике — когда спохватились, что надо бы разместить в строке

более одного оператора, точка с запятой оказалась уже занята: с её помощью в

операторе вывода PRINT указывали переход на следующую строку. Так что пришлось

разделять операторы чем попало. В разных реализациях и двоеточием и даже

символом (обратная косая черта). А в Фокале в аналогичном операторе Type для

перехода на следующую строку используется восклицательный знак. Но не будем

забегать вперёд...)

Элементарное (с точки зрения Фокала) действие это вычислить выражение и

как ни будь использовать его результат. Например оператор Type ("печатать")

выводит его на терминал (или туда, куда направлен канал вывода) а оператор Set

("установить" или Save — "сохранить": без разницы — важна только первая буква)

сохраняет в ячейке памяти — "переменной" чтобы можно было использовать потом.

Или еще говорят что он это значение переменной "присваивает".

Переменные обозначаются "именами" — словами, состоящими из букв и цифр и

начинающимися обязательно с буквы. (Впрочем буквой считается всё, что не цифра

и не разделитель. В том числе и значки: # @ $ & | _ ~.) Сейчас в Фокале

действует ограничение — что переменные различаются только по двум первым

символам. (Остальные если есть — просто игнорируются.) Впрочем, для

калькулятора этого впринципе более чем достаточно. (Фокал ненавязчиво приучает

к лаконичности.)

Кстати, в именах переменных все буквы различаются, а в ключевых словах и

именах функций — нет. Например переменные S s С с — разные, а ключевые слова

S s С с это одно и то же "Set", сокращенное до первой буквы.

"Выражение" это изображение формулы, записанное в одну строку. Знаков

операций — пять: + — * / и ^ (возведение в степень). В остальном от обычной

школьной алгебры отличается разве что тем, что нельзя опускать знак операции

умножения. Потому что там любую величину принято обозначь одной буквой, ну

разве что с индексами (или еще какими штрихами/засечками...), а здесь — словом.

Пусть даже и из одной буквы. И если там что то типа: aX+bY/7c понимается вполне

однозначно, то тут придётся писать: a*X+b*Y/(7*c) потому что иначе как узнать,

что 'a' и 'X' это две разные вещи, а не одна 'aX'? Никак!

И еще: там, в алгебре, формула конечно тоже описывает, какие действия над

входящими в неё величинами надо бы выполнить... Но как ни будь потом: часть

величин, возможно, пока что еще неизвестна. А пока что мы эту формулу малость

того... Ну по-преобразовываем например. А то и в другую формулу подставим...

Чтобы здесь так делать — другой алгоритмический язык нужен. Рефал или Лисп.

Или вот есть такая штука "Дериве"... А в Фокале — всё проще: выражение

предписывает выполнить указанные в нём действия вот прямо сейчас, немедленно.

И все указанные в нём величины уже должны быть — лежать по своим переменным.

А если какой нету — будет ой! (Заругается.) Это — чтобы не вызывало удивления

нечто типа:

Set X=X+1

Здесь вовсе не утверждается, что "икс равен самому себе увеличенному на

единицу", чего и в самом деле быть не может. А велено взять переменную икс,

извлечь оттуда число, прибавить к нему единичку и положить обратно.

Кстати, переменные с индексами — тоже бывают. И обычно называются

"массивами". Хотя вот именно в Фокале каждая из них существует сама по себе,

независимо от других с тем же именем, но другими индексами.

А вот в других языках место под все одноимённые переменные с разными индексами действительно выделяют сразу одним массивом смежных ячеек памяти — для экономии. Но там подобное надо заказывать заранее. А здесь — нет. Более того: в большинстве языков место под обычные переменные тоже надо заказывать заранее — в виде предварительного их объявления. Здесь же переменная создаётся автоматически в момент первого ей присваивания. В пресловутом Бейсике простыe переменнымe как и в Фокале тоже заводятся автоматически, а вот массивы надо объявлять оператором DIM. Но в одной из реализаций Фокала, когда понадобились по-настощему большие массивы, для выделения под них памяти тоже ввели оператор П. И мы тоже об этом подумаем...))

Так как всё в одну строчку — индексы приходится указывать после имени

переменной в скобках. Если их несколько — через запятую. В Фокале их может

быть один или два. (Ну или ни одного, тогда и скобочек не надо;-) Например:

x(1), x(2), x(3)... Скобки, кстати, любые. А их аж четыре вида: ([{<>}]).

y[1,2], y{2,3}, y<3,7>... Это в других языках скобки специализированные.

(Например в Си для индексов — только [], а {} только для кода, а <> вообще не

скобки, а знаки операций сравнения, которых в Фокале просто нет.) Индекс не

обязательно константа, а выражение произвольного вида: x(/4.5)

но используется только целая часть.

Неприятный побочный эффект: возможность обратиться к одной и той же

переменной как с одним так и с двумя индексами. Да еще и зависящая от

реализации. Впрочем, гарантируется что нулевое значение индекса эквивалентно

его отсутствию. Так что и X(0) и X(0,0) это одна и та же переменная X.

А еще есть функции для вычисления всяких синусов с косинусами. Но только

"встроенные": возможности, как в других языках, сделать из подпрограммы функцию

с содержательным именем в Фокале не предусмотрено. Впрочем, предусмотрена

возможность подгрузить в интерпретатор дополнительные функции (оператором

Load), до сих пор, впрочем, так и не реализованная. (Но вот когда реально

понадобятся какие ни будь функции Бесселя...)

Все встроенные функции называются на букву Ф (чтобы опознавать проще).

T.e. не sin, cos, exp, а FSIn, FCos, FExp. А вот переменные на букву Ф

называть нельзя, увы. (Можно, но использовать их потом не получится. Может

по-позже исправим?)

Здесь, да и в названиях операторов, пишу заглавными те буквы, которые

обязательные: функции, как и операторы, распознаются по первым уникальным

буквам. Но на самом деле конечно могут быть любые: хоть fsin, хоть ФсИн — без

разницы. Более того, для некоторых функций, чтобы например не вспоминать как

правильно: FSUbroutine или FSBr — сделано чтобы правильно было и так и так.

Аргумент функции — тоже в скобках после её имени. Если аргументов несколько,

тоже через запятые.

Ну-с, для начала теории достаточно. Перейдём к практике.

Решать задачи типа 2+2 конечно тоже можно, но неинтересно. Нужно что-то

простенькое, но не совсем тривиальное. Например найти корни квадратного

123 ... 121314
 
↓ Содержание ↓
↑ Свернуть ↑
  Следующая глава



Иные расы и виды существ 11 списков
Ангелы (Произведений: 91)
Оборотни (Произведений: 181)
Орки, гоблины, гномы, назгулы, тролли (Произведений: 41)
Эльфы, эльфы-полукровки, дроу (Произведений: 230)
Привидения, призраки, полтергейсты, духи (Произведений: 74)
Боги, полубоги, божественные сущности (Произведений: 165)
Вампиры (Произведений: 241)
Демоны (Произведений: 265)
Драконы (Произведений: 164)
Особенная раса, вид (созданные автором) (Произведений: 122)
Редкие расы (но не авторские) (Произведений: 107)
Профессии, занятия, стили жизни 8 списков
Внутренний мир человека. Мысли и жизнь 4 списка
Миры фэнтези и фантастики: каноны, апокрифы, смешение жанров 7 списков
О взаимоотношениях 7 списков
Герои 13 списков
Земля 6 списков
Альтернативная история (Произведений: 213)
Аномальные зоны (Произведений: 73)
Городские истории (Произведений: 306)
Исторические фантазии (Произведений: 98)
Постапокалиптика (Произведений: 104)
Стилизации и этнические мотивы (Произведений: 130)
Попадалово 5 списков
Противостояние 9 списков
О чувствах 3 списка
Следующее поколение 4 списка
Детское фэнтези (Произведений: 39)
Для самых маленьких (Произведений: 34)
О животных (Произведений: 48)
Поучительные сказки, притчи (Произведений: 82)
Закрыть
Закрыть
Закрыть
↑ Вверх