Skip navigation.

проФорт

Форт и всё такое

SP-Forth, Linux и Vim

Настройка окружения для использования SP-Forth в Linux с редактором vim (который умеет не только бибикать).

SPF под Linux существует в трёх ипостасях :
  • Официальный дистрибутив на http://spf.sf.net (в исходниках и deb-пакет)
  • Порт by ~mak (obsolete?)
  • SPF/Win32 под wine (эмулятор WinAPI)

Далее речь пойдёт о первом варианте.

Установка

Счастливые пользователи Debian могут поставить бинарный пакет. После этого остаётся только настроить devel -- распаковываем слепок devel или берём каталог из CVS и связываем симлинком с /usr/lib/spforth4/devel. Можно не трогать системные каталоги, а добавить путь поиска в ~/.spf4.ini, например так :
H-STDOUT
0 TO H-STDOUT
/full/path/to/devel/~ygrek/spf/included.f
with: /full/path/to/devel/
TO H-STDOUT

\ ~ygrek/lib/linux/readline.f

Джедаи собирают из исходников, что впрочем совсем не сложно. Для сборки понадобятся gcc, binutils и make. Создаём файл конфигурации сборки src/compile.ini
TRUE TO UNIX-ENVIRONMENT
TRUE TO TARGET-POSIX
и затем
cd src && make
Для того чтобы можно было запускать spf одной командой кидаем симлинк на бинарник в /usr/bin или в пользовательский ~/bin -- при необходимости дописать в .bashrc
if [ -d ~/bin ]; then
    export PATH=~/bin:$PATH
fi

Теперь можно запускать код на выполнение с помощью spf4 forthcode.f. Также можно сделать файл с кодом исполняемым и дописать в начале shebang
#! /usr/bin/spf4
после этого запускать ./forthcode.f

Замечание

В текущей версии deb-пакета есть одна неисправленная проблема. Библиотека компилированных констант не сможет найти сами файлы констант, для того чтобы обойти это просто добавьте в ~/.spf4.ini
\ workaround broken TryOpenFile
: TryOpenFile >R FIND-FULLNAME R> OPEN-FILE ;
Беэ этого многие системно-зависимые либы работать не будут.

Окружение

В файловом менеджере mc есть возможность назначить действия для выполнения с текущим файлом при нажатии Enter итп. F9-Команда-Файл расширений и добавляем в конец :
# Forth
shell/.f
    Open=spf4 %f
    Edit=sensible-editor %f
При этом не забудьте удалить настройки для фортрана которые по умолчанию захватывают расширение файлов .f.
Действие Open выполняется по Enter'у, действие Edit по F4 - запускается sensible-editor который вызывает (как видно из названия) "вменяемый редактор", который определяется по переменной окружения EDITOR. Я добавил в .bashrc export EDITOR=vim для вызова Vim.

Полезные настройки vim.

(Общие настройки для облегчения ломки после FAR'а).

Для включения форт-специфичных настроек (например подсветки синтакиса) добавляем в ~/.vimrc
syntax on
filetype on
filetype plugin on

au BufRead,BufNewFile *.f            set filetype=forth
au BufRead,BufNewFile *.F            set filetype=forth
au BufRead,BufNewFile *.spf          set filetype=forth
Дополнительные настройки прописываем в ~/.vim/ftplugin/forth.vim :
" Cловарь для автодополнения,
set dictionary+=/full/path/to/devel/~ygrek/doc/docbook/words.dic

" Сделаем удобную навигацию по словам
set keywordprg=spf4\ \\~ygrek/doc/docbook/words.f\ help

" Проверка синтаксиса
"set makeprg=spf4\ %
set makeprg=spf4\ \\\~ygrek/spf/vim.f\ VIMINCLUDE\ %

" Формат вывода ошибок
set errorformat=%m\ at:\ %f:%l:%c:

" Полезные "быстрые шаблоны"
" Вывод отладочной информации
iabbrev dbg CR DEPTH . .S

" Открывать файл с кодом по spf-относительному пути под курсором
nmap <LocalLeader>f :call SpfOpenFile(expand("<cword>"))<CR>

" Only definitions below -- executed once

if exists("*SpfOpenFile")
  finish
endif

function SpfFindFullname(filename)
  let tmp = tempname()
  exe "!spf4 " . shellescape(":NONAME S\" ".substitute(a:filename,'"',"","g")."\" FIND-FULLNAME TYPE CR ; CATCH BYE") . " > " . tmp
  return get(readfile(tmp),0)
endfunction

function SpfOpenFile(filename)
  let filename = SpfFindFullname(a:filename)
  if filereadable(filename)
    exe "edit" filename
  endif
endfunction
Словарь для автодополнения это просто список слов собранный из SPF_DEVEL, позволяет быстро набирать часто используемые слова из devel (сочетание клавиш по умолчанию CTRL-N/CTRL-P).
keywordprg определяет показ контекстной справки по слову под курсором (команда K), я использую тот же список слов что и для автодополнения со стековой нотацией к каждому слову.
makeprg вызывается командой :make, которую можно назначить например на F9:
" F9 - "make" команда
map <F9> :make<cr>
vmap <F9> <esc>:make<cr>i
imap <F9> <esc>:make<cr>i
Можно напрямую вызывать spf4\ % (знак процента заменяется на имя текущего файла), но это будет неправильно работать если имя файла содержит пробелы, также при ошибке в программе spf перейдёт в интерактивный режим, что для меня не очень удобно, поэтому используется простая обёртка, которая решает эти проблемы.
errorformat распознаёт информацию об ошибке от spf и автоматически переходит в указанную строку.
Функция SpfOpenFile (назначена на <LocalLeader>f, т.е. \f) открывает файл по его пути под курсором. Полный путь к файлу находит сам spf с помощью FIND-FULLNAME, что позволяет быстро перемещаться по REQUIRE и INCLUDED.

Заключение.

Ну и какой же блог без скриншотов? :wink:


PS: Код на скриншоте - затравка для следующего поста.

Динамический scoping... и bac4th

Comments

Anonymous 18. June 2009, 08:26

Аноним writes:

можно ссылку на Порт by ~mak (obsolete?) ?

exs 29. June 2009, 14:19

http://fpauk.narod.ru/linuxspf.10.tar.bz2

и на sf.net :
http://sourceforge.net/project/showfiles.php?group_id=17919&package_id=141388 (те файлы что за 2005 год)

Какие из них новее и как они между собой связаны я не в курсе. Михаил безусловно крут, но тягой к излишним подробностям в документации не отличается :)

ЗЫ А что, spf/linux чем-то не устраивает?

Anonymous 18. July 2009, 14:06

Аноним writes:

хотел посмотреть как вызываются внешние ф-ции из форта, написанного на С.

http://osdir.com/ml/lang.forth.spf/2008-08/msg00007.html
(в Си (который мы вызываем) - это мудрое упрощение API-CALL я подглядел
у Миши в его варианте LinuxSPF (который вперемешку с Си). Т.е. не надо
даже никакого API-CALL - затолкал все сишные параметры в сишный стек и
делаешь обычный EXECUTE)

Anonymous 6. August 2009, 06:44

i writes:

Ubuntu 8.10 и 9.4.
Ставил из пакета, spf4 запускается, но не работает SAVE, (то же самое происходит при попытке компиляции из исходников), объектный файл создается, но линковщик вываливается с ошибкой.
...
ld завершилась по сигналу 11 [Segmentation fault]
make: *** [spf4] Ошибка 1

Попытка слинковать вручную выдает:
host:~/spforth4/src$ ld spf4.o
ld: warning: cannot find entry symbol _start; not setting start address
spf4.o:(.forth+0x21a1): undefined reference to `dlopen'
spf4.o:(.forth+0x21bd): undefined reference to `dlsym'
spf4.o:(.forth+0x21fd): undefined reference to `realloc'
spf4.o:(.forth+0x2219): undefined reference to `write'
spf4.o:(.forth+0x2d65): undefined reference to `calloc'
spf4.o:(.forth+0x21dd): undefined reference to `dlerror'

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

exs 9. August 2009, 08:57

Это видимо известная проблема ld.
Смотрите
http://www.nabble.com/next-release-td21288367.html#a21673239
и
http://www.nabble.com/to-ygrek-3-td21692569.html

Если это так, то попробуйте более новую версию binutils, по крайней мере в 2.19.51.20090723-1 эту багу исправили. Наверное неплохо было бы иметь альтернативный способ получения бинарника независимо от ld/gcc чтобы избавиться от таких фокусов в будущем.

Anonymous 10. August 2009, 07:30

i writes:

Благодарю! После установки http://aist.ring.gr.jp/archives/linux/debian/debian/pool/main/b/binutils/binutils_2.19.51.20090805-1_i386.deb на Ubuntu 9.04 spf4 собрался из исходников. SAVE работает. Проверил и на установке из пакета.

Anonymous 31. October 2009, 04:11

Аноним writes:

Ubuntu 9.04 AMD64
/Downloads/spf-4.20/src$ make
make -C posix
make[1]: Вход в каталог `/Downloads/spf-4.20/src/posix'
gcc -Wall -Werror -DSPF_SRC config.c -oconfig.gen
config.c: В функции ‘main’:
config.c:56: ошибка: ‘REG_EDI’ не описан (первое использование в этой функции)
config.c:56: ошибка: (Сообщение о неописанном идентификаторе выдается один раз
config.c:56: ошибка: для каждой функции, в которой он используется.)
config.c:58: ошибка: ‘REG_EIP’ не описан (первое использование в этой функции)
config.c:60: ошибка: ‘REG_ESP’ не описан (первое использование в этой функции)
config.c:62: ошибка: ‘REG_EAX’ не описан (первое использование в этой функции)
config.c:64: ошибка: ‘REG_EBP’ не описан (первое использование в этой функции)
make[1]: *** [config.gen] Ошибка 1
make[1]: Выход из каталога `/Downloads/spf-4.20/src/posix'
make: *** [spf4.o] Ошибка 2
Куда копать?

exs 31. October 2009, 11:16

Очевидно glibc для 64-битной OC не определяет эти макросы, потому что они не имеют смысла.. spf на текущий момент поддерживает только архитектуру x86, поэтому просто собрать "родной" бинарник под amd64 не получится. Но собранный на x86 будет работать на amd64 (уж не знаю какая там магия участвует).

How to use Quote function:

  1. Select some text
  2. Click on the Quote link

Write a comment

Comment
(BBcode and HTML is turned off for anonymous user comments.)

If you can't read the words, press the small reload icon.


Smilies