Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт апр 18, 2024 13:12

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Удобные слова
СообщениеДобавлено: Ср июл 26, 2006 14:59 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Как сделать такое:
вместо того, чтобы опеределение переменной давало одну переменную, типа
: VARIABLE CREATE , DOES> ;
жеательно, чтобы оно опеределяло несколько слов одновременно, я хотел бы получать слова
>СЛОВО - помещение значения в переменную
СЛОВО+ - прибавление значения к пременной,
предположим, это обработка растрового изображения по кускам или игра на квадратной доске, нужна переменная структура Y-X c легкоизменяемыми в тексте значениями.

я могу создать это так:
variable CELL 4 CELL !


: 2DIM ( ... ENSIONS ) ( INITIAL_X INITIAL_Y --> VARIABLE_DIMENTIONS )
CREATE HERE ( INITIAL_X INITIAL_Y HERE )
! CELL @ ALLOT ( INITIAL_X )
HERE ! CELL @ ALLOT ( ИЛИ ЗАПЯТЫМИ ВСЁ ЭТО )
( STACK IS EMPTY )
DOES> DUP @ swap CELL @ + @ ( x y ) ;

такое слово создаёт структуру и инициализирует её первичными значениями INITIAL_X INITIAL_Y
затем при вызове слова
INITIAL_X INITIAL_Y 2DIM СЛОВО
СЛОВО ( --> INITIAL_X INITIAL_Y )
мы получаем значения на стеке.
Но как сделать, чтобы ОДНОВРЕМЕННО ОБРАЗОВЫВАЛИСЬ СЛОВА
+СЛОВО и >СЛОВО ?

т.е.
чтобы одновременно образовывалсь 3 слова
: 2DIM
CREATE ( И ТУТ ОБРАЗУЕТСЯ ПЕРВОЕ СЛОВО ) DOES>
CREATE ( И ТУТ ОБРАЗУЕТСЯ СЛЕДУЮЩЕЕ +СЛОВО ) DOES>
CREATE ( И ТУТ ОБРАЗУЕТСЯ >СЛОВО ) DOES> ;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср июл 26, 2006 15:50 
Не в сети

Зарегистрирован: Чт май 04, 2006 22:43
Сообщения: 78
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Все можно сделать. Генерится строка и скармливается EVALUATE или EVALUATE-WITH, точно не помню. Но это лишнее.

Вместо того, чтобы мусорить в словаре однотипными словами, лучше написать лексикон. Пример (работа с изображениями (SPF)):
Код:
0 VALUE Xsize
0 VALUE Ysize
0 VALUE buffer
...
: PICTURE  ( x y )  CREATE  SWAP W, W, 0 , ;
: >XY   ( pic -- x y )  DUP W@ SWAP 2+ W@ ;
: >addr ( pic -- addr )  CELL+ @ ;
: /Picture  ( pic -- size )  >XY * CELLS ;
: Picture{  ( pic )  DUP /Picture  GET-MEM SWAP CELL+ ! ;
: }Picture  ( pic )  >addr FREE-MEM ;
: Picture!  ( pic )  DUP >XY  TO Ysize  TO Xsize
    CELL+ @  TO buffer ;
: Clear     ( pic )  DUP  >addr  SWAP /Picture  ERASE ;
: Pixel  ( x y -- addr )  Xsize * CELLS buffer + ;
: PutPixel  ( RGB x y -- )  Pixel ! ;
: GetPixel  ( x y -- RGB )  Pixel @ ;

Используется:
Код:
20 30 PICTURE sprite
640 480 PICTURE screen
sprite Picture{
screen Picture{

sprite Picture!
0x102030 40 50 PutPixel
40 50 GetPixel .

screen Picture!
: horline   400 0 DO 0xFFFFFF 20 I PutPixel LOOP ;
horline

sprite Clear

sprite }Picture
screen }Picture


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Удобные слова
СообщениеДобавлено: Ср июл 26, 2006 16:15 
Не в сети

Зарегистрирован: Чт май 04, 2006 22:43
Сообщения: 78
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
вопрос писал(а):
чтобы одновременно образовывалсь 3 слова
: 2DIM
CREATE ( И ТУТ ОБРАЗУЕТСЯ ПЕРВОЕ СЛОВО ) DOES>
CREATE ( И ТУТ ОБРАЗУЕТСЯ СЛЕДУЮЩЕЕ +СЛОВО ) DOES>
CREATE ( И ТУТ ОБРАЗУЕТСЯ >СЛОВО ) DOES> ;

В таком виде работать не будет. 2DIM определит только одно слово, которое будет определяющим для +СЛОВА, которое, в свою очередь будет определяющим для >СЛОВА.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср июл 26, 2006 16:53 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Icefall писал(а):
Вместо того, чтобы мусорить в словаре однотипными словами, лучше написать лексикон.

Если кодируешь что-то сложное , то лишь бы сам понял -- не до "мусорить".


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Удобные слова
СообщениеДобавлено: Ср июл 26, 2006 17:38 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
Icefall писал(а):
вопрос писал(а):
чтобы одновременно образовывалсь 3 слова
: 2DIM
CREATE ( И ТУТ ОБРАЗУЕТСЯ ПЕРВОЕ СЛОВО ) DOES>
CREATE ( И ТУТ ОБРАЗУЕТСЯ СЛЕДУЮЩЕЕ +СЛОВО ) DOES>
CREATE ( И ТУТ ОБРАЗУЕТСЯ >СЛОВО ) DOES> ;

В таком виде работать не будет. 2DIM определит только одно слово, которое будет определяющим для +СЛОВА, которое, в свою очередь будет определяющим для >СЛОВА.


Конечно можно сделать больше одного DOES> в определении
(определив спец средства), но не очень нужно.
Можно определить отдельные определяющие слова,
затем вставить их в одно.

Код:

: 2, HERE 2! 2 CELLS ALLOT ;

: 2DIM: ( ... ENSIONS ) ( INITIAL_X INITIAL_Y --> VARIABLE_DIMENTIONS )
CREATE 2,
DOES> 2@ ;

: 2DIM+ ( pfa -- )
CREATE ,
DOES> @ DUP >R 2@ D+ R> 2! ;

: 2DIM  ( INITIAL_X INITIAL_Y --> )

  2DIM: HERE CELL- CELL-
  DUP 2DIM+
  CREATE ,
  DOES> @ 2! ;

\ test
 
6 7 2DIM СЛОВО +СЛОВО >СЛОВО

СЛОВО . . 

-2 3 +СЛОВО

СЛОВО . .

7 8 >СЛОВО

СЛОВО . .



Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 05, 2007 17:49 
Только сегодня утром почитал эту тему. Во-первых, по изначальной задаче (несколько CREATE DOES>) я давал решение. Во-вторых, постановка задачи похожа на то что нужно построить свою собственную VALUE-переменную.. В третьих... В третьих лучше в конце.

Вспомним, что VALUE-переменные сразу выдают значения при их прямом вызове, записывают значения при вызове с TO , и прибавляют их при вызове с +TO (есть ещё AT , но тут его не спрашивали, да и в ядре SPF его нету).

Смотрим описание VALUE в ядре (можно за компанию и VECT посмотреть)

Код:
: VALUE ( x "<spaces>name" -- )
  HEADER
  ['] _CONSTANT-CODE COMPILE, ,
  ['] _TOVALUE-CODE COMPILE,
;


Становится понятно что в SPF VALUE-переменные сделаны хитровато:

Код:
заголовок|CALL _CONSTANT-CODE|ячейка переменной|CALL _TOVALUE-CODE
         |     5 байт        |   4 байта       |   5 байт


Основываясь на этой схеме и посмотрев как ygrek уже делал свои VALUE-переменные (двойные): ~ygrek/lib/2value.f (или мой вариант, без дополнительного слова 2TO , ~profit/misc/2value.f), можно, по аналогии, построить похожую структуру но с ещё одним исполняемым полем, для +TO (только слово +TO лучше назвать как нибудь по-другому, из-за того что оно на самом деле, будет делать не что ожидается).

Или пришёл в голову ещё один способ: через NOTFOUND , как сделана форма вызова словарь::слово.

А теперь, в-третьих: бесмысленно это. Icefall всё правильно сказал: строить свой лексикон и проще, и удобнее, и быстрее (как в написании, так и в исполнении), и гибче, и гигиеничней (для словаря), и "фортовей", т.е. ты не будешь создавать на ровном месте новое правило синтаксиса.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср мар 07, 2007 20:33 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
profiT писал(а):
А теперь, в-третьих: бесмысленно это. Icefall всё правильно сказал: строить свой лексикон и проще, и удобнее, и быстрее (как в написании, так и в исполнении), и гибче, и гигиеничней (для словаря), и "фортовей", т.е. ты не будешь создавать на ровном месте новое правило синтаксиса.

Не надо обобщать. Иногда синтаксис поменять эффективнее и Форт лучшее средство для этого.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср мар 07, 2007 20:59 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Приведу для полноты картины и такой вариант нескольких DOES>-ов

Код:
\ declaration :
\  SIZE bytes str
\ usage :
\ str ( -- addr SIZE )  \ data addr and total allocated size
\ str@ ( -- addr u ) \ data addr and size used at the moment
\ str! ( addr u -- ) \ copy source u bytes from addr to the array
\ str# ( uaddr -- ) \ address of the cell where the size of the array resides
\ str[] ( i -- addr ) \ give address of i-th byte

REQUIRE STR-APPEND  ~ygrek/lib/string.f

MODULE: static_arrays

: (does)   DOES> DUP 2 CELLS + SWAP @ ;
: (does@)  DOES> @ DUP CELL+ SWAP @ ;
: (does!)  DOES> @ 2DUP ! CELL+ SWAP CMOVE> ;
: (does#)  DOES> @ ;
: (does[])  DOES> @ CELL+ + ;

EXPORT

: bytes
   NextWord
   2DUP                               CREATED ROT DUP , HERE >R 0 , ALLOT (does)
   2DUP [CHAR] @ CHAR-APPEND 2DUP  1+ CREATED R@ , (does@)
   2DUP [CHAR] ! CHAR-APPEND 2DUP  1+ CREATED R@ , (does!)
   2DUP [CHAR] # CHAR-APPEND 2DUP  1+ CREATED R@ , (does#)
   2DUP    S" []" STR-APPEND 2DUP 2 + CREATED R@ , (does[])
   2DROP RDROP ;

;MODULE



Код:
100 bytes str
Ok
str
Ok ( 5703560 100 )
str@
Ok ( 5703560 100 5703560 0 )
2DROP 2DROP S" qua" str!
Ok
str@
Ok ( 5703560 3 )
TYPE
qua Ok

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 03, 2007 11:13 
Не в сети

Зарегистрирован: Ср сен 13, 2006 10:06
Сообщения: 636
Откуда: Омск
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
это что, вариант записи числа в переменную по адресу?
Код:
VARIABLE EXTRA-MEM 4000 ' EXTRA-MEM EXECUTE !


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 03, 2007 11:41 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
Pretorian писал(а):
это что, вариант записи числа в переменную по адресу?
Код:
VARIABLE EXTRA-MEM 4000 ' EXTRA-MEM EXECUTE !


Во время ЦК все целевые слова заносятся в словарь TC-WL и доступны для
исполнения (это не значит, что все готовы для исполнения).
Слово ' определеное в src\tc_spf.f временно открывает TC-WL.
Код:
CR .( EM=) ' EXTRA-MEM EXECUTE .
CR .( EM=) [T]  EXTRA-MEM [I] .
CR .( EM=) ALSO TC-WL EXTRA-MEM  PREVIOUS .


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 03, 2007 12:00 
Не в сети

Зарегистрирован: Ср сен 13, 2006 10:06
Сообщения: 636
Откуда: Омск
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
Если честно, то ни чего не понял. Что такое целевые слова, что еще за словарь TC-WL (думал тока FORTH словарь есть в системе по умолчанию ).

_________________
Меня нет, не будет и не было.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 03, 2007 13:44 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
Pretorian писал(а):
Если честно, то ни чего не понял. Что такое целевые слова, что еще за словарь TC-WL (думал тока FORTH словарь есть в системе по умолчанию ).


Целевые слова - это слова, которые будут содержатся в будущей форт-системе.
Вообще, каталог spf\src содержит исходный текст самой форт-системы и
средства ее сборки. Словарь TC-WL в новой форт-системе будет
виден как FORTH.
Строка:
TC-LATEST-> FORTH-WORDLIST
в spf\src\spf.f произведет эту подмену.

В СПФ нет полной совместимости между целевой компиляцией
и работой в рантайме.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB