День второй

День второй

Решил разобраться с переопределениями слов – замена старого варианта новым. Очень нужно для отладки и для целей изучения. Стандартное слово FORGET здзесь нет. Думал сначала делать как обычно – набиарю текст программы в редакторе, сохраняю, вызываю в среде и пытаюсь ее гонять... Тут вырсиоывается только один вариант – это запуск каждый раз новой копии интерпретатора и в ней тестировать...

Другая идея – завести временный словарь и в него запихивать свои определения. Но как заводить и управлять словарями я через встроенноую справку TOPIC ничего путного и внятного не нашел. Попробовал посмотреть в листингах. Ходил наугад по директориям, открывал листинги... Потратил минут 40, результат нет. Ладно, смотрю коцанный файл справки docs\papers\spf_hlp.chm. Сделан красиво. Но не до конца, просто брошен в самом начале. И почему-то лежит не в директории docs\help ... Дывно... В прочем пояснила как заводить новый словарь, как сделать его активным, а вот как его удалить – нет.

Придется пользоваться привычным вариантов :(. Честно говоря ожидалось свовсем не-то, а что-то вроде интегрированной среды автоматом, по умолчанию...

Суть такая: набираем текст программы в редакторе Far, благо плугин colorer поддерживает подстветку Forth, и пытаемся из под него стартовать каждый раж экземпляр нашей программы. На интегрированность мало похолже, но уже что-то...

Вот, еще, кстати, а зачем в дистрибутиве атрибуты CVS? Только загромаждает файловую систему, и увеличивает количество не заполненных кластеров. Пришлось написать простенький скриптец на Perl, который сниосил все эти директории.

Нашели глук – при инситалляции можно было бы и расширения прописать... А не искать и руками это делать. Из папки docs/install нужно запускать только spf_path_install.reg – второй файл содержит ссылки на отсутсвующий компонент! Судя по названию, раньше в дистрибутиве было что-то вроде графической оболочк.

Связка Far + spf4.exe явно на удобную среду не тянут. На полуудобную – да. Итак, для того чтобы запустить проект мне нуджно:

  1. Сохранит текст, одно нажатие

  2. Переключиться в консоль, еще лдно действие

  3. Найти мой файл и нажать Enter

  4. В появившейся консоли набрать нужное мне слово.

Слишком много вато получается. И очень неудобно. Плюс тереяется контекст. На этапе изучения и простеньких примеров – еще куда ни шло...

Ну пункт 4 обходится легко – достаточно в конце листинга прогарммы набрать то слово которое нужно сразу запустить.

В иделе, конечно, хотелось бы запускать по одной клавише... Нажал клавишу – проект сохранился, запустился интерпретатор с программой в отдельном окне. Хотя бы так...

Подстветка синтаксиса есть – уже хорошо :)

Выход из интерпретатора – по Ctrl+Break или Ctrl+C. Довольно удобно.

Попробую другой редактор, ну скажем, Aditor – он неплохо настраивается и подстветка для Forth у него есть. Правда, он ShareWare. И уже автором не поддерживается, сайт закрыт.

Нашел редактор KoEdit Легко настривается, значительно удобнее. Симпатичный. Но! Отсутсвует подстветка Forth-a, и даже настройка подсветки. В принципе с этим смириться можно. Удобный редактор, привязка клавиш настраивается. Так у меня вызов интерпретатора по F8, единственное что задалбывает – постоянный перезапрос ан сохрангение файла... Можно держать множество открытых файлов. Плюс редактор распространяется под свободной лицензией GPL. Русскоязычный интерфейс. Перекоджирвока DOS, CP1251, KOI8-R.

Начал отлаживать программы, используя редактор KoEdit. Потихоньку также руссифиицирую некотрые сообщение об ошибках. Работать удобнее чем в Far-е, но до полного удобства – как до луны.

Несколько путаюсь со строчными коментариями и пока непривычно после знака комментария оставлять пробел, но это дел наживное :)

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

: BAR ( n – Вывод столбика из X длиной n )
  0 DO
     ." Х"
 LOOP
 CR
; ( – )

: L ( n – ограничение длины столбика, не более 80 символов ) DUP 80 > IF DROP 64 THEN BAR ;

: GRAPH ( n1 n2 n3 ... – Рисует горизонтальный график ) CR DEPTH 0 DO L LOOP ; ( – )

( Текст. Рисуем горизонтальную диаграмму ) 1 20 53 88 GRAPH

Перешел ко второй главе.

Слово .S в SP-Forth есть. Печатает содержимое стека без его разрушения. Хотя и отображает верхние элементы стека в приглашении, все равно полезное слово.

Да, Келли и Спайс несколько устаревшая книжка – "7-разрядное представление кода символа ASCII" :( Ссылки на устаервшие стандарты (Форт-79 и Форт-83, а также их сравнение) тоже не есть хорошо.

Разнообразие типов, что-то мне не очень нравится... Ладно, там будет видно.

Насчет именованяи слов для оперирования данными на стеке, мне кажется, что более подходящим был бы вариант следующий. Обозначим первые четыре ячейки буквами латинского алфавита: A, B, C, D – причем A это вершина стека, тогда можнго было переписать основные команды Forth следующим образом:

 DROP – delA –  Очищает вершину стека
 DUP – cpA –  Делает копию числа на вершине стека
 SWAP – mvB –  Переставляет местами два числа
 OVER – cpB –  Копирует второе число на вершину
 ROT – mvC –  Перекладывает третье число на вершину
n PICK – cpN –  Кладет на вершину копию п-го элемента
n ROLL – mvN –  Перекладывает п-й элемент на вершину
 ?DUP – 0?cpA –  Выполняет операцию DUP, если n ==0
 DEPTH –  - –          Возвращает в стек n - число элементов

Сокращения команд понятны – они стандартны, из мира файловых операций UNIX, а дальше легко догадаться... Они и короче и вроде более понятны и запоминаются гораздо проще.

Решил переопределить эти стандартные слова на предложенный вариант. Сделал свою библиотечку – C:\SPF\~ff\word.f Подключил ее к SP-Forth, добавив следующую строчку в файл C:\SPF\spf4.ini

\ Библиотека с моими словами

 REQUIRE AlexLib ~ff\word.f

Все работает :) Может еще и русскоязычные названия дать? Посмотрим по ходу работы работы – будут ли восстребованы.

Глава 3. Работаем с памятью...

М-да, чуствуется, что книжка писалась для 16-ричной платформы...

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

 BASE @

Попробовал сам написать слово, которое показывает в двоичной системе счисления число, находящееся на вершине стека. Получилось.

: toBin ( n )
 BASE @
   2 BASE !
   mvB
   .
 BASE !
; ( – )

5 toBin

Но очевидно, что текст, ну скажем так, не читемый. Нужно, садиться и въезжать в него. Большй частью из-за того что в тексте программы не видны оперируемые данные...

: Base? ( – )
 BASE @
; ( n )

: =Base ( n ) BASE ! ; ( – )

: toBin ( n ) Base? mvB 2 =Base . =Base ; ( – )

5 toBin

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

: toBin     ( n )
 BASE @      ( n 10 )
    2 BASE !   ( n 10 )
     mvB       ( 10 n )
     .         ( 10 )
 BASE !      ( )
;           ( )

Угу. Так проще и понятнее. Стековая нотация отображает состояние стека после выполнения всех слов в текущей строке, вершина стека справа. Только формлять больше пришлось. В приниципе это можно (и даже нужно автоматизировать)...

Сделал библиотечку из них. Для конвертации, нужно иногда бывает. Добавил в библиотеку слово

: q     ( Окончание работы )
 BYE ;

стало удобнее работать. Чтобы закрыть окно – буква и Ентер. Привычно и естественно. :)

SP-Forth работает со знаковыми 32-х разрядными числами, это здорово. Для большинства задач можно не беспокоится о типе, только помнить, что работа идет только с целыми числами. Не нужно добавлять слово U как в книжке.

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

Байты. Извлекаются и сохраняются словами C@ и C! Интерсено, что система адресации оперирует байтами, независимо от типа данных. Операторры @ ! адресует по байтовыми адресам, хотя размер ячеки составляет 4-ре байта. С одной стороны это однородность, а с другой... С другой стороны, наверное не нужно напрямую работать с адресами...

EMIT – печать одного символа в стандартный поток. KEY – возврат кода нажатой клавиши. Программа ждет, пока не будет нажата клавиша.

Глава 4

Посвящена вопросам округления, потери точности, представлению чисел в формаетс фиксированной запятой и операций над ними, а также над вещественными числами. Пока это не нужно, учитывае 32-х разярядность, а вот вещетсвенные числа нужны...

Операции над вещественными числами доступны по встроенной справке

  TOPIC float
  TOPIC float-ext

Блин, ну как же эти числа вводить-то??? книжка не помогает, она описывает како-то свой диалект Forth.

<<< Предыдущий Начало   Следующий >>>
Copyright © Alex Furashev 2004

При цитировании, ссылка на оригинальный текст обязательна. Допускается копирование материалов только целиком, без внесения каких-либо изменений в оригинальный текст, меняющих смысл, структуру материала и проч.

Hosted by uCoz