Шрифт:
Обычно вторая задача при обучении программированию – это написание калькулятора. В Форте калькулятор писать не нужно, так как он поддерживает основные операции изначально, правда несколько в необычном формате, которая называется обратная польская запись или постфиксная. В математике вы привыкли писать формулы в инфиксной форме типа (1+2)*5(4-5), где знак бинарной операции пишется между числами, к примеру в Лиспе сначала идёт операция, а затем операнд или операнды, а в форте наоборот, сперва мы отправляем на стек операнды, затем операция выполняет действия над ними, оставляя результат там же. Стек это просто место в памяти, поддерживаемое на аппаратном уровне, следовательно, все операции над ними выполняются очень быстро, где будет хранится наши промежуточные данные.
Так будет выглядеть работа с нашим калькулятором:
Операнд1 Операнд2 Операция. То есть вместо 1+2 в Форте мы должны написать «1 2 +».
1 2 +
Ok ( 3 ) \ 1+2=3 в скобках – это содержимое стека
1 2 *
Ok ( 3 2 ) \ 1*2=2 очередной результат на вершине стека
1 2 -
Ok ( 3 2 4294967295(-1) ) \ 1-2=-1 4294967295 – это без знаковый вариант числа -1
1 2 /
Ok ( 3 2 4294967295(-1) 0 ) \ 1/2=0 – это целочисленное деление, потому результат нуль
1 2 MOD
Ok ( 3 2 4294967295(-1) 0 1 ) \ остаток от деления 1/2
1 2 /MOD
Ok ( [7].. 4294967295(-1) 0 1 1 0 ) \ остаток от деления 1/2 и целая часть 1/2
Вы можете сказать программирование на питоне – гораздо богаче, возможностями и будете правы. Но Форт быстрее и в качестве первого языка программирования гораздо проще и легче его усвоить, а самое главное понятнее. Учить программирование на паскале, на мой взгляд уже не актуально. Хотя он и хорош для изучения различных алгоритмов, но это уже не современный язык программирования, со множеством избыточных конструкций и синтаксиса.
Приведем примеры программирования на SP-Forth.
: ^2 ( A -> A^2 ) DUP * . ; \ возведение числа в квадрат
: ^3 ( A -> A^3 ) DUP DUP * * . ; \ возведение числа в куб
: ^4 ( A -> A^4 ) DUP * DUP * . ; \ возведение числа в четвертую степень
DUP – это слово которое просто дублирует число на вершине стека.
Возведём 5 в квадрат, для этого наберём на клавиатуре:
5 ^2
25 Ok
Получаем правильный ответ. Копировать код нужно аккуратно, так при копировании первого слова, возведения в квадрат, получаем сообщение об ошибке
: ^2 ( A -> A^2 ) DUP * . ;\ возведение числа в квадрат
^ -2003 WORD OR FILE NOT FOUND
При «Копи пасте» куда-то делись символы табуляции между «;» и комментарием, вследствие видим сообщение об ошибке, из-за нарушения синтаксиса. Наверное, это особенность системы.
Также, вместо ^2, можно слово назвать **2, в стиле python:
: **2 ( A -> A^2 ) DUP * . ; \ возведение числа в квадрат
5 **2
25 Ok
В итоге получаем тот же ответ, но стилистика программы изменилась.
Для начала этого достаточно. Далее при решении конкретных задач, в среде программирования SP-Forth, процесс станет более понятным и осознанным.
BEGIN 1-10
Начать нашу практику программирования мы будем с задач из книги М. Э. Абрамян "1000 задач по программированию Часть I Скалярные типы данных, управляющие операторы, процедуры и функции" 2004. Автор пишет, что получить задачник можно по e-mail: mabr@math.rsu.ru или за подробностями обращайтесь к веб ресурсу ptaskbook.com. Текст задач я приводить не буду, дабы исключить плагиат. Думаю, пояснения к коду с описанием слов (функций-программ) должно быть достаточно, в противном случае обращайтесь к первоисточнику за текстом задач.
Пример 1. Итак, начнем, (для простоты вначале мы будем рассматривать все входные параметры как целые числа, далее мы перепишем код для вещественных аргументов, где об этом указано в условии задачи). Вот и решение первой задачи:
: B1 ( A -> P ) 4 * ; \ P=4*A
B – это сокращение от BEGIN, что обозначает первую группу заданий (мы и далее будем использовать такой вид названий в последующих группах заданий), затем слитно пишется номер примера. Сразу после имени в скобках пишется комментарий стековой нотации. Так принято в Форте. В данном случае Слово-функция B1 берет один параметр A (четырехбайтовое целое число и оставляет другое того же типа). A – сторона квадрата – вход функции, P – его периметр – возвращаемое функцией значение. Тело – очень короткое, просто умножает число на вершине стека на 4 (не забываем, что в Форте обратная польская нотация, сначала идут операнды, затем операция).
Теперь чтобы воспользоваться нашим словом, например, чтобы посчитать периметр квадрата со стороной 3, используем следующий код:
3 B1 .
12 Ok
Точка «.» – это стандартное форт слово, которое печатает число на вершине стека на экран.
Напомним, общий вид определения нового слова в Форте:
: Название-Слова ( стек до выполнение –> после ) Код-Тела-Функции ; \ комментарий
Пример 2. Нам нужно посчитать площадь квадрата:
: B2 ( A -> S ) DUP * ; \ S=A^2