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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 148 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7 ... 10  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Пт янв 09, 2009 20:51 
Не в сети

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

ФОРК выдаёт следующее
Код:
mOleg kernel fork(mininoleg@yahoo.com). build from SPF4.17 sources.
windows Version 4.07 Build 623 at 03.Jan.2009


>s" pfx.f " INCLUDED
Error at line:  98: 94
                IF  CR ." END OF COPIED STRING IS NOT THE END OF CURRENTLY ALLOC
ATED MEMORY ! " anykey? KEY DROP BYE   THEN
pfx.f
Error: Нельзя интерпретировать файлы в режиме компиляции!
>

это что должно быть?

_________________
понимаю некоторую бестолковость некоторых вопросов


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

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
Код:
MODULE: _INF_MOD
: |   [COMPILE] OR ; IMMEDIATE
;MODULE

CR _INF_ {  first * 2 - 4 * second + ( | a | b ) } TYPE
first 2 * 4 second * - a OR b OR +


Заимствует значение на стеке.

Код:
_INF_ { first * 2 - 4 * second + ( a  b ) } TYPE
first 2 * 4 second * - a b +


Оставляет значение.
Это можно рассмотреть как фичу.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт янв 09, 2009 21:02 
Не в сети

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

_________________
понимаю некоторую бестолковость некоторых вопросов


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт янв 09, 2009 21:03 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
у меня другую ошибку выдает:
Error at line:  119: 11
S" * / % + - >> << < <= > >= == != & ^ | && || = *= /= %= += -= <<= >>= &= ^=
|= " pfx.str_accept
pfx.f
Error: Неверный номер функции
FORTH(0)>

но это потому, что S" в форке заменена на s" который понимает символы квотирования,
и там надо писать s" //= " к примеру, а не s" /="
вопросы по форку желательно задавать в его родном разделе

вопрос писал(а):
Вообще, ненавязчиво напомню, что обе рабочие - для разных систем, но постараюсь изменить вторю и положить на место первой - ссылку придётся присоединить для табуляторов.
Перед зачисткой темы

ненавязчиво подскажу, что на альтернативные варианты можно оставлять ссылки
несколько вариантов решения можно представлять лишь когда они очень сильно отличаются (другое решение) друг от друга.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


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

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
вопрос писал(а):
если мы захотим. чтобы ловил?


Без проблем. Данные и операции идут через один. Просто заводится переменная THEOP? ,
которая содержит флаг того, что должно следовать.


Код:
REQUIRE [IF] ~mak/CompIF.f
REQUIRE [IFNDEF] ~nn\lib\ifdef.f
REQUIRE $+! ~mak\place.f

[IFNDEF]   SCAN
: SCAN ( adr len char -- adr' len' )
\ Scan for char through addr for len, returning addr' and len' of char.
        >R 2DUP R> -ROT
        OVER + SWAP
        ?DO DUP I C@ =
                IF LEAVE
                ELSE >R 1 -1 D+ R>
                THEN
        LOOP DROP ;
[THEN]

: PASS\N
  BEGIN  SkipDelimiters  EndOfChunk
  WHILE REFILL 0= IF TRUE  EXIT THEN
  REPEAT      FALSE ;

: MTOKEN ( TABL -- ADDR N )
  PASS\N
  IF DROP CharAddr  0  EXIT THEN
  DUP >R COUNT PeekChar SCAN NIP
  IF RDROP CharAddr 1 DUP >IN +! EXIT THEN
  CharAddr
  BEGIN 1 >IN +!
     EndOfChunk
     IF  TRUE
     ELSE   R@ COUNT PeekChar SCAN NIP
     THEN
  UNTIL   CharAddr OVER -
  RDROP
;

MODULE: _INF_MOD

CREATE OP HERE 0x20 CELLS ALLOT  HERE SWAP !  \ STACK OF OPERATIONS
CREATE OP_BUF 0x101 ALLOT

: >OP  ( A -- ) 0 CELL - OP +! OP @ !  ;
:  OP@ ( -- A )
   OP @ @   ;
:  OP> ( -- A )  [ OP @ ] LITERAL @ OP @ =
ABORT" BRACKET IS EXPECTED"
   OP@  CELL OP +! ;

: >OP> ( N -- )   \ N IS PRIORITY
        DUP >R
        BEGIN OP@ > 0=
        WHILE OP> DROP
              OP>  COUNT OP_BUF $+! BL OP_BUF $C+!
               R@
        REPEAT RDROP ;

0 VALUE THEOP?

:  #2-OP ( N -- )  \ N IS PRIORITY
     CREATE IMMEDIATE LAST @ , ,
     DOES>  2@  >R
  THEOP? 0= ABORT" expected data"
      FALSE TO THEOP?
            DUP >R >OP>
           R> R>  >OP >OP ;

:   2-OP ( N -- )  \ N IS PRIORITY
    #2-OP ;

: 1-OP 10 2-OP ;

WARNING 0!
   3 2-OP OR  3 2-OP XOR  4 2-OP AND    5 2-OP =
   6 2-OP <   6 2-OP >
   7 2-OP +   7 2-OP -
   8 2-OP *   8 2-OP /    8 2-OP MOD

: |   [COMPILE]  OR ; IMMEDIATE
: &   [COMPILE] AND ; IMMEDIATE

: ( 0 >OP  ; IMMEDIATE
: ) 1 >OP>  OP> DROP ; IMMEDIATE
TRUE WARNING !

;MODULE


: _INF_
  C"  }"  MTOKEN DROP C@ [CHAR] { <> ABORT" ожидается {"

[ ALSO _INF_MOD ] POSTPONE ( OP_BUF 0! FALSE TO THEOP?
[ PREVIOUS ]
  BEGIN   C"  ~!@#$%^&*()+|{}:<>?`-=\[];',./" \ символы разделители
          MTOKEN DUP
          IF  OVER  C@  [CHAR] }  = IF DROP 0 THEN
          THEN  DUP
  WHILE
     2DUP ['] _INF_MOD >BODY @ SEARCH-WORDLIST
    IF   NIP NIP EXECUTE
    ELSE    _INF_MOD::THEOP? ABORT" expected operation"
      TRUE _INF_MOD::TO THEOP?

_INF_MOD::OP_BUF $+! BL _INF_MOD::OP_BUF $C+!
    THEN
    ?STACK
  REPEAT 2DROP
  [ ALSO _INF_MOD ] POSTPONE ) [ PREVIOUS ]
   _INF_MOD::OP_BUF COUNT
; IMMEDIATE


CREATE _INF_BUFF 100 ALLOT
FALSE  VALUE  _INF_FLAG

: NOTFOUND
  2DUP 2>R ['] NOTFOUND CATCH ?DUP
  IF _INF_FLAG IF THROW THEN
      DROP 2DROP
     S"  _INF_  { " _INF_BUFF $!
            2R>     _INF_BUFF $+!
             S"  }" _INF_BUFF $+!
    _INF_BUFF COUNT
    TRUE TO _INF_FLAG ['] EVALUATE CATCH
   FALSE TO _INF_FLAG  THROW
  ELSE 2R> 2DROP
  THEN
;

\ TEST

_INF_ { first * 2 - 4 * second + ( a | b ) } TYPE


Код:
>_INF_ { first * 2 - 4 * second + ( | a | b ) } TYPE
_INF_ { first * 2 - 4 * second + ( | a | b ) } TYPE
                                  ^ expected data

Только ненужно это. Изначально программа должна быть максимально простой.
За тем, решать только те проблемы, которые встретились на практике.


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
mOleg писал(а):
вопрос писал(а):
Цитата:да, но работает до первого F2 (сохранения) в редакторе ...я что-то не пойму - почему сохранение и почему по Ф2 ? что за редактор? пробелы не меняет?

Редактор автоматом заменяет табуляции на пробелы (я использую NDN).
Желательно, чтобы в теме осталась рабочаяя версия в явном виде(а не в виде ссылок), причем в единственном экземпляре.
Да, организационные вопросы я из темы вычищу (чтобы небыло неожиданностью)
Просьба всем соблюдать правила данного раздела!

OFFTOP BEGIN
Не пойму - зачем НДН (это дос навигатор как я понял) - есть де куча других - даже блокнот в конце концов ... OFFTOP END :)
я думаю, чтобы поэкспериментировать с разными наборами операторов , имеет смысл запустить строку в более обычном редакторе. BRED кажется тоже табуляторы сохраняет

_________________
понимаю некоторую бестолковость некоторых вопросов


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

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

и вот это вот
Код:
: |   [COMPILE]  OR ; IMMEDIATE
: &   [COMPILE] AND ; IMMEDIATE

некоторые операторы добавляются отдельно - отчего их не в строку?

_________________
понимаю некоторую бестолковость некоторых вопросов


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 10, 2009 14:23 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
вопрос писал(а):
: |   [COMPILE]  OR ; IMMEDIATE
: &   [COMPILE] AND ; IMMEDIATE

Как интересно, а зачем [COMPILE]-то? AND и OR вроде как не имеют признака немедленного исполнения и компилируются без [COMPILE]?

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Кстати, такой метод ловли ошибок не всегда надёжен
Код:
>_INF_ { ( a - b | c ) + ( a ( b - c ) ) }
_INF_ { ( a - b | c ) + ( a ( b - c ) ) }
                             ^ expected operation
>_INF_ { ( a - b | c ) + ( a ( - b - c ) ) }
Ok ( 5796897 23 )
>
во второй паре строк

_________________
понимаю некоторую бестолковость некоторых вопросов


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

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
вопрос писал(а):
она должна быть простой для глаз программиста

Субъективного взгляда. Единственный объективный показатель наглядности исходного кода
является его объем. Своя программа всегда кажется простой.
вопрос писал(а):
некоторые операторы добавляются отдельно - отчего их не в строку?

Это как?
VoidVolker писал(а):
зачем [COMPILE]-то? AND и OR вроде как не имеют признака немедленного исполнения

Там AND и OR переопределены словом #2-OP, в котором вызывается IMMEDIATE.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 10, 2009 16:08 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
Mihail писал(а):
Там AND и OR переопределены словом #2-OP, в котором вызывается IMMEDIATE.

Ааа, понятно.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 10, 2009 21:31 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
А как насчет тригонометрических функций?

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 10, 2009 21:48 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
В моём алгоритме просто вводим строку - пару строк, т.к. операторы могут быть любыми - многознаковыми, включающими любые символы, кроме разделительных (пробел и табулятор :) - именно поэтому табулятор и понадобился) и если пользоваться для форта, то операторы определяем предварительно как слова. Единственная трудность - необходимо добавить правила для префиксных операторов, т.к. sin cos и т.п. применяются к одному числу (градусной или радианной мере) , впрочем, ничто не мешает ввести инфиксный оператор sin= духе С++ += или -=, хотя в сложной формуле всё равно потребуется префикс.

_________________
понимаю некоторую бестолковость некоторых вопросов


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 10, 2009 22:05 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
вопрос писал(а):
OFFTOP BEGIN
Не пойму - зачем НДН (это дос навигатор как я понял) - есть де куча других - даже блокнот в конце концов ... OFFTOP END

потому что для меня это самый удобный редактор ;)

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

табуляторы невидимы, кроме того, не всем они по душе (я терпеть не могу, когда курсор скачет далеко).
Программа, использующая табуляторы, или, к примеру, распространенное в фортране явление, когда распознаются значения стоящие в определенных местах строки, и не дай боже съехать на один символ в сторону, так вот, такие программы дают глюки в самых непредвиденных случаях.
Вот, достаточно открыть в текстовом редакторе, и сохранить текст без изменения :)

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 10, 2009 22:28 
Не в сети

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

если добавить в код такой блок (очень примитивно за 5 минут)
Код:
\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\\ \\ \\ \\ \\ \\
\ ----------------  _ARITHM_TRIGONOMETR
: fictituous ;
:  sin ; \ как если бы слово существовало
:  cos ; \ как если бы слово существовало
:  sin!  sin SWAP F! ;
:  cos!  cos SWAP F! ;

0 VALUE priority_str_ARITHM_TRIGONOMETRY
   S"  sin cos * / + - sin= cos=   "  pfx.str_accept
   TO priority_str_ARITHM_TRIGONOMETRY
\ строка оканчивается нулём и перед закрывающей кавычкой должно быть пару пробелов!
\ ---------------- аналоги форта для С_LIKE

0 VALUE analog_str_ARITHM_TRIGONOMETRY
   S"  sin  cos * / + - sin!  cos!    " pfx.str_accept
    TO analog_str_ARITHM_TRIGONOMETRY

0 VALUE analog_pointers_ARITHM_TRIGONOMETRY
HERE TO analog_pointers_ARITHM_TRIGONOMETRY
100 CELL * ALLOT

:  _ARITHM_TRIGONOMETRY (  --  ) \ to set _ARITHM_TRIGONOMETRY as active
   analog_str_ARITHM_TRIGONOMETRY TO analog_str
   priority_str_ARITHM_TRIGONOMETRY TO priority_str   
   analog_pointers_ARITHM_TRIGONOMETRY TO analog_pointers   
    -1 TO   transformation_type_flag
;   
\ ---------------- аналоги форта для _ARITHM_TRIGONOMETR  END  ----------------
\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\\ \\ \\ \\ \\ \\   

где
Код:
: fictituous ;
:  sin ; \ как если бы слово существовало
:  cos ; \ как если бы слово существовало
:  sin!  sin SWAP F! ;
:  cos!  cos SWAP F! ;
это заглушки, фикции, то код станет выдавать что-нибудь наподобие

>S" addr_of_float sin= a * ( b + c ) " _ARITHM_TRIGONOMETRY >postfix CR TYPE

addr_of_float a b c + * sin! Ok

>S" a * ( 2 * fictituous sin b + fictituous cos c ) " _ARITHM_TRIGONOMETRY >postfix CR TYPE

a 2 fictituous b sin * fictituous c cos + * Ok

a 2 b sin * c cos + * Ok

в строках (жирным) 3 и 4 - fictituous - фиктивная переменная (пустое слово для сохранения инфиксности) её можно убрать и получится строка 5

:!: Да, и строки нужно проинициализировать перед _ARITHM_TRIGONOMETRY >postfix

_ARITHM_TRIGONOMETRY a_init

_________________
понимаю некоторую бестолковость некоторых вопросов


Последний раз редактировалось вопрос Сб янв 10, 2009 22:32, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 148 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7 ... 10  След.

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


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

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


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

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