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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 195 ]  На страницу Пред.  1 ... 9, 10, 11, 12, 13  След.
Автор Сообщение
 Заголовок сообщения: Re: WIN-FORTH ДЛЯ МИНИМАЛИСТОВ (ПРОЕКТ FOBOS)
СообщениеДобавлено: Пн фев 06, 2012 21:27 
Дурацкий вопрос по ходу дела. Тут, экспериментируя с компилирующими словами, сам себя обманул. Захотел конструкцию следующего вида (что-то вроде виртуальных ф-ий или макроопределений).

ОБЪЯВИТЬ ЧАСТНОЕ
МАКРО: ДЕЙСТВИЕ ОБЩЕЕ-1 ЧАСТНОЕ ОБЩЕЕ-2 ;
...
ОПРЕДЕЛИТЬ: ЧАСТНОЕ ЧАСТНОЕ-1 ;
ДЕЙСТВИЕ ЭКЗЕМПЛЯР ДЕЙСТВИЕ-1
...
ОПРЕДЕЛИТЬ: ЧАСТНОЕ ЧАСТНОЕ-2 ;
ДЕЙСТВИЕ ЭКЗЕМПЛЯР ДЕЙСТВИЕ-2
...
ДЕЙСТВИЕ-1
ДЕЙСТВИЕ-2

Кто-нибудь видел что-нибудь подобное (без злоупотребления переменными и EXECUTE), а то я сейчас наизобретаю велосипедов... Может, я просто брежу, и все делается проще?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: WIN-FORTH ДЛЯ МИНИМАЛИСТОВ (ПРОЕКТ FOBOS)
СообщениеДобавлено: Вт фев 07, 2012 12:31 
Не в сети
Аватара пользователя

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

Непонятно что за компилирующие слова.
Что имеется ввиду под макросами тоже непонятно. В рамках форта можно реализовать макросы, которые работают по разному
в зависимости от STATE, поддерживают или не поддерживают слова читающие вперед из входного потока.
Вот пример макроса:
Код:
M: macros1 VARIABLE VAR1 ; macros1
0 VAR1 !  VAR1 @
так работает
Еще пример:
Код:
M: var VARIABLE ;  var VAR2
так не работает потому, что слово VARIABLE 'заглядывет' вперед по входному потоку для получения
'имени' , а там его нет и на VAR2 появляется сообщение транслятора "WORD NOT FOUND"
Эти макросы не поддерживают слова, читающие из входного потока.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: WIN-FORTH ДЛЯ МИНИМАЛИСТОВ (ПРОЕКТ FOBOS)
СообщениеДобавлено: Вт фев 07, 2012 12:52 
Не в сети

Зарегистрирован: Ср июл 05, 2006 14:44
Сообщения: 236
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
Вы можете определить два слова
Цитата:
: ДЕЙСТВИЕ-1 ОБЩЕЕ-1 ЧАСТНОЕ-1 ОБЩЕЕ-2 ;
: ДЕЙСТВИЕ-2 ОБЩЕЕ-1 ЧАСТНОЕ-2 ОБЩЕЕ-2 ;

а чтобы подчеркнуть связь ДЕЙСТВИЕ-Х и ЧАСТНОЕ-Х
можно определить фрагменты ОБЩЕЕ-1 и ОБЩЕЕ-2 через макросы дав им краткие имена
Цитата:
: ДЕЙСТВИЕ-1 [[ ЧАСТНОЕ-1 ]] ;
: ДЕЙСТВИЕ-2 [[ ЧАСТНОЕ-2 ]] ;

причем ОБЩЕЕ-1 ( [[ ) может содержать начало управляющей конструкции (IF,BEGIN...)
а ОБЩЕЕ-2 ( ]] ) содержать завершение управляющей конструкции (THEN,AGAIN...)
я в СПФ использую магию (макросы) от chess-а:
Код:
: LOAD-LEX ( a u -- ) HERE SWAP DUP ALLOT MOVE 0 C, ;
: LOAD-TEXT
5 ALLOT HERE >R
BEGIN NextWord 2DUP 1 = IF C@ [CHAR] ; = IF 2DROP 1 ELSE OVER C@ [CHAR] \ =
      IF DROP 0xD PARSE DROP OVER - 0 FILL ELSE LOAD-LEX THEN 0 THEN
      ELSE DROP DUP 0= IF 2DROP REFILL DROP ELSE LOAD-LEX THEN 0 THEN
UNTIL HERE R@ 5 - DP ! 0xE9 C, DUP R@ - , DUP DP ! R@ SWAP R> - DLIT, ;
\ Макросы многострочные - допускают комментарии вида (  ) и \
: M: ( name "text" -- ) : IMMEDIATE LOAD-TEXT POSTPONE EVALUATE POSTPONE ; ;

примерчик:
Цитата:
M: [[ 0= IF ;
M: || EXIT ELSE ;
M: ]] EXIT THEN ;
: tst [[ ." = 0" || ." <> 0" ]] ;

0 tst CR ( выдает = 0 )
1 tst CR ( выдает <> 0 )


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: WIN-FORTH ДЛЯ МИНИМАЛИСТОВ (ПРОЕКТ FOBOS)
СообщениеДобавлено: Вт фев 07, 2012 13:38 
Спасибо за M:
Только не совсем понятно, стоит ли игра свеч. Компилировать все слова макроопределения по одному, или скомпилировать слово, содержащее их компиляцию? Разница только в возможности разбивать структуры управления и лишнем уровне вложения.

М: ДЕЙСТВИЕ-1 ДЕЙСТВИЕ-11 ДЕЙСТВИЕ-12 ;
: ДЕЙСТВИЕ ДЕЙСТВИЕ-1 ДЕЙСТВИЕ-2;

тоже самое (по результату исполнения), что и

: ДЕЙСТВИЕ-1 ДЕЙСТВИЕ-11 ДЕЙСТВИЕ-12 ;
: ДЕЙСТВИЕ ДЕЙСТВИЕ-1 ДЕЙСТВИЕ-2 ;

Пока писал, понял, что у меня в частном случае все просто:

ДЕЙСТВИЕ CREATE , DOES> @ >R ОБЩЕЕ-1 R> EXECUTE ОБЩЕЕ-2 ;
...
' ЧАСТНОЕ-1 ДЕЙСТВИЕ ДЕЙСТВИЕ-1
...
' ЧАСТНОЕ-2 ДЕЙСТВИЕ ДЕЙСТВИЕ-2
...
ДЕЙСТВИЕ-1
ДЕЙСТВИЕ-2

Однако, пока это изобретал, понял, что даже такой мутант меня не спасет.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: WIN-FORTH ДЛЯ МИНИМАЛИСТОВ (ПРОЕКТ FOBOS)
СообщениеДобавлено: Вт фев 07, 2012 14:36 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
gudleifr писал(а):
Только не совсем понятно, стоит ли игра свеч. Компилировать все слова макроопределения по одному, или скомпилировать слово, содержащее их компиляцию? Разница только в возможности разбивать структуры управления и лишнем уровне вложения.

С помощью макросов еще можно программировать сверху-вниз и связывать слова с локальными словами в них через общие имена
этих локальных слов.
Код:
M: !4  ( a1 u1 a2 u2 -- ) u2! a2! u1! a1! ;
: s+s ( a1 u1 a2 u2  -- str )  !4 256 s]
  a1 s u1 MOVE a2 s u1 + u2 MOVE s u1 u2 + ;

S" 123 " S" 321 " s+s S" 456" s+s TYPE ( 123 321 456 )

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: WIN-FORTH ДЛЯ МИНИМАЛИСТОВ (ПРОЕКТ FOBOS)
СообщениеДобавлено: Вт фев 07, 2012 14:42 
chess писал(а):
С помощью макросов еще можно программировать сверху-вниз
1) Это как?
2) А разве на обычном Forth этого нельзя? И в нем отсутствуют какие-то механизмы, которые якобы есть, например, в Pascal, для которого разработка сверху-вниз норма?
3) Так можно додуматься до отложенного распознавания строки макроса...


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: WIN-FORTH ДЛЯ МИНИМАЛИСТОВ (ПРОЕКТ FOBOS)
СообщениеДобавлено: Вт фев 07, 2012 14:59 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
gudleifr писал(а):
2) А разве на обычном Forth этого нельзя? И в нем отсутствуют какие-то механизмы, которые якобы есть, например, в Pascal, для которого разработка сверху-вниз норма?

В форте это можно делать с помощью векторов. Но векторы надо сначала создать, то есть определить их имена.
Только потом можно пользоваться их именами.
Код:
M: summa-bytes ( a u -- s )  0 arr len + arr DO I C@ + LOOP ;

здесь именам arr len ничего конкретно не соответствует. Они могут быть определены позже.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: WIN-FORTH ДЛЯ МИНИМАЛИСТОВ (ПРОЕКТ FOBOS)
СообщениеДобавлено: Вт фев 07, 2012 15:06 
chess писал(а):
В форте это можно делать с помощью векторов.
Они есть в Pascal?
chess писал(а):
Они могут быть определены позже.
Да, тут я лопухнулся - не разглядел хранение нераспознанных слов. Рассмотрение этого вопроса требует отдельной темы. Как-то смутно подозреваю, что эта возможность избыточна, но доказать затрудяюсь.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: WIN-FORTH ДЛЯ МИНИМАЛИСТОВ (ПРОЕКТ FOBOS)
СообщениеДобавлено: Вт фев 07, 2012 15:20 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
gudleifr писал(а):
Да, тут я лопухнулся - не разглядел хранение нераспознанных слов. Рассмотрение этого вопроса требует отдельной темы. Как-то смутно подозреваю, что эта возможность избыточна, но доказать затрудяюсь.

В Форте принято быстрое связывание имен с кодом. Тут отложенное связывание. Разрешить имена в код можно в тот момент когда это будет нужно и таким образом каким нужно. arr len могут быть разрешены в переменные, константы в процедуры и тп.
Затем они могут быть переопределены во что-то другое любое количество раз.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: WIN-FORTH ДЛЯ МИНИМАЛИСТОВ (ПРОЕКТ FOBOS)
СообщениеДобавлено: Вт фев 07, 2012 15:28 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
gudleifr писал(а):
Они есть в Pascal?

Нет. Так как там отложенное связывание имен с кодом, то вектора не нужны.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: WIN-FORTH ДЛЯ МИНИМАЛИСТОВ (ПРОЕКТ FOBOS)
СообщениеДобавлено: Вт фев 07, 2012 15:33 
chess писал(а):
Разрешить имена в код можно в тот момент когда это будет нужно и таким образом каким нужно.
Мне это не нравится:
1) Это, разумеется, не имеет никакого отношения к разработке "сверху-вниз".
2) Это навязывает Forth некий синтаксис.
3) Это вызывает отложенную компиляцию не только неизвестных слов, но всего фрагмента.
4) Тот же результат ("по-научному" речь идет о "замыкании") может быть легко получен с помощью DOER или, как выше, EXECUTE.
5) Злоупотребление подобными конструкциями приводит к путанице между моментами объявления, определения и использования. И, самое страшное, ни один из фортеров не может записать смысл данных преобразований в виде, исключающем двусмысленности и/или противоречия.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: WIN-FORTH ДЛЯ МИНИМАЛИСТОВ (ПРОЕКТ FOBOS)
СообщениеДобавлено: Вт фев 07, 2012 16:01 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
gudleifr писал(а):
5) Злоупотребление подобными конструкциями приводит к путанице между моментами объявления, определения и использования. И, самое страшное, ни один из фортеров не может записать смысл данных преобразований в виде, исключающем двусмысленности и/или противоречия.

В форте нет объявлений. Процесс программирования в голове у программиста. К путанице приводит неверное профилирование сложности задачи, а не запись смысла преобразований.
gudleifr писал(а):
4) Тот же результат ("по-научному" речь идет о "замыкании") может быть легко получен с помощью DOER или, как выше, EXECUTE.

Еще есть вектора и EVALUATE.
gudleifr писал(а):
3) Это вызывает отложенную компиляцию не только неизвестных слов, но всего фрагмента.

Для машин с большой памятью это не критично. Сейчас это не критично и для микропроцессоров.
gudleifr писал(а):
2) Это навязывает Forth некий синтаксис.

Что за синтаксис? Кстати я не против введения синтаксиса в Форте. На уровне лексем, генерирующих код использую широко.
Не надо придумывать массу ненужных имен слов.
gudleifr писал(а):
1) Это, разумеется, не имеет никакого отношения к разработке "сверху-вниз".
Еще бы определить что такое писать программу сверху-вниз, тогда я наверное с этим бы согласился. :)

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: WIN-FORTH ДЛЯ МИНИМАЛИСТОВ (ПРОЕКТ FOBOS)
СообщениеДобавлено: Вт фев 07, 2012 19:50 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
chess писал(а):
gudleifr писал(а):
Они есть в Pascal?

Нет. Так как там отложенное связывание имен с кодом, то вектора не нужны.

А как тогда назвать переменные Паскаля типа procedure и function? Вектора и есть.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: WIN-FORTH ДЛЯ МИНИМАЛИСТОВ (ПРОЕКТ FOBOS)
СообщениеДобавлено: Вт фев 07, 2012 20:23 
chess писал(а):
В форте нет объявлений.
Почему же? Тот же DOER или M: , с натягом - DOES> .
chess писал(а):
Для машин с большой памятью это [отложенная компиляция]не критично.
Это критично для программиста.
chess писал(а):
Что за синтаксис?
Ограничения на использование слов похожих на завершение макроса.
chess писал(а):
Еще бы определить что такое писать программу сверху-вниз
Начал отдельную тему.
Хищник писал(а):
А как тогда назвать переменные Паскаля типа procedure и function?
На самом деле в PC-версии Pascal есть честные завершения, позволяющие определять функции, вызываемые не в контексте определения, а в контексте исполнения.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: WIN-FORTH ДЛЯ МИНИМАЛИСТОВ (ПРОЕКТ FOBOS)
СообщениеДобавлено: Вт фев 07, 2012 23:53 
Не в сети

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

уже додумывались


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 195 ]  На страницу Пред.  1 ... 9, 10, 11, 12, 13  След.

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


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

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


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

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