Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт мар 29, 2024 09:24

...
Google Search
Forth-FAQ Spy Grafic

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




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

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

для отладки и тестирования целочисленных алгоритмов хватит
но можно и довести до определённого уровня, определяемого здравым смыслом
для этого желательно предметное обсуждение, а не просто критика

например - где в кварке <# #S #> , где были case?
"Ужас. Теперь всем надо ждать, "
:) :) :)


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

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
вопрос писал(а):
например - где в кварке <# #S #>

В разделе форума "Кварк" в теме "форматированный вывод".

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


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
ну, вот мои коментарии к коду (в основном замечания по форме написания, а не по содержанию)
да, мои коментарии в тексте предварены последовательностями \! или \?
<pre>
VARIABLE fp.current_out \ куда выводим
0 fp.current_out ! \ экран
\? в ноль сбрасывать VARIABLE переменные не нужно (они и так в нем)

0 CONSTANT fp.screen_out
1 CONSTANT fp.string_out
2 CONSTANT fp.file_out

VARIABLE fp.error_id \ если ошибка
0 CONSTANT fp.no_err
1 CONSTANT fp.err_nos \ не выводится символ
2 CONSTANT fp.err_so \ исчерпание стека с аргументами
3 CONSTANT fp.err_le \ long bad specified
\! имена переменных ужастны (на мой взгляд не читаемы)

VARIABLE fp.error_repneed \ если нужна информация об ошибке сразу
-1 fp.error_repneed ! \ 0 было бы " не нужна " - переменная - флаг
VARIABLE fp.error_p \ указатель на символ, кот. соответствует ошибке

VARIABLE fp.temp \ временное

\ directly intended for code_a only variables
VARIABLE fp.code_a_i \ pointer
VARIABLE fp.code_a_end \ string end
VARIABLE fp.code_a_beg \ string begin

\ identifiers of destination
VARIABLE fp.spec_sym \ символ начала спецификатора преобразования
37 fp.spec_sym ! \ %
VARIABLE fp.file_id \ файл собственно для вывода
VARIABLE fp.ostring_id_a \ string для вывода addr
VARIABLE fp.ostring_id_n \ string для вывода length
VARIABLE fp.ostring_id_i \ string для вывода pointer

\! очень много переменных, причем все глобальные. Подозреваю, что в реальности
\! надо бы их сделать USER-переменными


: fp.errorrep_todo \ ( -- )
\ не особо привлекательный код, но что поделаешь ...
\ неясно, какое представление строк избрать совместимым для всех трансляторов
\ этот код нужен только для отладки
\ собственно можно назвать этот код аварийным
CR
45 EMIT 45 EMIT 45 EMIT 102 EMIT 112 EMIT 45 EMIT 45 EMIT 45 EMIT
fp.error_id @
DUP
1 = IF 110 EMIT 115 EMIT DROP ELSE \ ns - no symbol out success
DUP
2 = IF 110 EMIT 118 EMIT DROP ELSE \ nv - no variable on stak
3 = IF 110 EMIT 108 EMIT ELSE \ nl - no long number type
110 EMIT 101 EMIT \ ne - no recognized error
THEN THEN THEN
58 EMIT fp.code_a_i @ fp.code_a_beg @ - . 45 EMIT 45 EMIT 45 EMIT
CR
;
\! в СПФ вызвать EMIT для вывода сообщения бессмысленно, так как каждый отдельный EMIT - это
\! вызов TYPE. Короче, гораздо проще строку набрать. Да и понятнее оно будет.
\ ( end: fp.errorrep_todo )


: fp.sym_out_s \ ( char -- ) for string one char
fp.ostring_id_i @ fp.ostring_id_n @ >
\! если переменные читаюся часто, лучше исползовать VALUE или USER-VALUE
IF
fp.err_nos fp.error_id ! DROP
ELSE
fp.ostring_id_i @ fp.ostring_id_a @ + C!
fp.ostring_id_i @ 1 + fp.ostring_id_i !
THEN
;
\ ( end: fp.sym_out_s )
: fp.sym_out_file \ ( char -- )
fp.temp C!
fp.temp 1 fp.file_id @ WRITE-FILE \ presently: ior
DUP 0 > SWAP 0 < OR IF fp.err_nos fp.error_id ! THEN
;

\ ( end: fp.sym_out_file )
: fp.sym_out \ ( char -- )
\ этот код - последующее ветвление - разумеется, неэкономен
\ наиболее экономно делать разные слова для вывода в файл и т.д.
\ и вызывать их непосредственно: как printf и fprintf в С++
\! да, тут напрашивается использование примитивнейшего VECT слова
fp.current_out @ DUP
IF
1 = \ STRING?
IF
fp.sym_out_s
ELSE
\ FILE
fp.sym_out_file
THEN
ELSE
\ SCREEN
DROP EMIT
THEN


;
\ ( end: fp.sym_out )

\ -----------------------------------------------------------------------------
\ HERE BEGINS CODE_B STUB
\ -----------------------------------------------------------------------------
VARIABLE fp.code_b_i \ пока и не нужно
VARIABLE fp.code_b_j \ pointer for obtained string
VARIABLE fp.code_b_n \ length of obtained string
VARIABLE fp.code_b_baset \ base temporarly
VARIABLE fp.code_b_sign \ знак нужен?
VARIABLE fp.code_b_cv \ specificator-symbol
VARIABLE fp.code_b_strsh \ string shift - returned by fp.code_b for fp.code_a
\! очень надеюсь, что прислушаетесь к моему совету:
\! уберите нафиг префиксы с точками (ну нечитаемо оно!) и все в отдельный словарь определите
\! да, ваш код сразу не многопоточен (что плохо) не забывайте про USER переменные
VARIABLE fp.code_b_success \ flag for the consequence of attempts; -1 is failure

\ заглушка - пока только десятичные, hex, octal, bin, sym и строки без прочих радостей
: fp.code_b_hss \ ( integer -- asc n ) HOLDS SINGLE WITH SIGN : for fp.code_b
DEPTH 0 > IF
\! ужастно! уберите DEPTH и никогда, НИКОГДА так не делайте!!!
DUP 0 < IF ABS 45 ELSE 32 THEN fp.code_b_sign !
S>D <# #S fp.code_b_sign C@ HOLD #>
ELSE fp.err_so fp.error_id ! 0 0 THEN
;
\! вы конечно можете со мной не согласиться, но вот такое форматирование удачнее, имхо:
\ заглушка - пока только десятичные, hex, octal, bin, sym и строки без прочих радостей
: fp.code_b_hss ( integer -- asc n ) \ HOLDS SINGLE WITH SIGN : for fp.code_b
DEPTH 0 >
IF DUP 0 <
IF ABS 45 ELSE 32 THEN
fp.code_b_sign !
S>D <# #S fp.code_b_sign C@ HOLD #>
ELSE fp.err_so fp.error_id ! 0 0
THEN ;

\ ( end: fp.code_b_hss )
: fp.code_b_hds \ ( integer -- asc n ) HOLDS DOUBLELENGTH WITH SIGN : for fp.code_b
DEPTH 0 > IF
DUP 0 0 D< IF DABS 45 ELSE 32 THEN fp.code_b_sign !
<# #S fp.code_b_sign C@ HOLD #>
ELSE fp.err_so fp.error_id ! 0 0 THEN
;
\ ( end: fp.code_b_hss )
: fp.(0#S) DEPTH 0 > IF 0 <# #S #> ELSE fp.err_so fp.error_id ! 0 0 THEN ;
: fp.(#S) DEPTH 0 > IF <# #S #> ELSE fp.err_so fp.error_id ! 0 0 THEN ;

: fp.code_b_nulls \ ( asc -- asc n ) fp.code_b _null search : for ANSI strings
DUP \ asc asc
BEGIN
DUP C@ 0 = IF -1 ELSE 1 + 0 THEN
UNTIL
OVER - ;

\! мое соченение на заданную тему:
: fp.code_b_nulls ( asc --> asc # ) DUP BEGIN DUP C@ WHILE 1 + REPEAT OVER - ;
\! хотя есть стандартное слово ASCIIZ> с более понятным и выразительным именем!

\ ( end: fp.code_b_nulls )
\! все же коментировать что же делает слово очень полезно...
: fp.code_b_cycle \ ( -- )
0
BEGIN
DUP fp.code_b_j @ + C@ fp.sym_out
1 +
DUP fp.code_b_n @ =
UNTIL
DROP
;
\! кстати, ; не обязательно выделять в отдельную строку

\ ( end: fp.code_b_cycle )
: fp.code_b
\! очень плохо, когда человек использует разные методики оформления кода в одном тексте 8(
fp.no_err fp.error_id !
-1 fp.code_b_success ! \ until failure
fp.code_a_i @ 1 + C@ fp.code_b_cv C! \ presently : values (?)
BASE @ fp.code_b_baset !
fp.code_b_cv C@ DUP

108 = SWAP 76 = OR \ ----------------------- numbers : 'l' or 'L' LONG -----------------------
IF fp.code_a_i @ 2 + C@ fp.code_b_cv C! 3 fp.code_b_strsh !
0 fp.code_b_success ! \ если преобразование специфицировано, то несовп. 2й буквы - ошибка
\ в противном случае - успех
fp.code_b_cv C@ DUP
98 = SWAP 66 = OR \ binary : 'b' or 'B'
\! ужеб использовали CASE - он читабельне этого
IF 2 BASE ! fp.(#S) fp.code_b_n ! fp.code_b_j ! ELSE
fp.code_b_cv C@ DUP
111 = SWAP 79 = OR \ octal : 'o' or 'O'
IF 8 BASE ! fp.code_b_hds fp.code_b_n ! fp.code_b_j ! ELSE
fp.code_b_cv C@ DUP
105 = SWAP 73 = OR
fp.code_b_cv C@ DUP
100 = SWAP 68 = OR OR \ decimal : 'i' or 'I' or 'd' or 'D'
IF 10 BASE ! fp.code_b_hds fp.code_b_n ! fp.code_b_j ! ELSE
fp.code_b_cv C@ DUP
104 = SWAP 72 = OR \ hex : 'h' or 'H'
IF 16 BASE ! fp.(#S) fp.code_b_n ! fp.code_b_j ! ELSE
\! обратите внимание, что вы во многих местах используете этот код: fp.code_b_n ! fp.code_b_j !
\! его можно легко вынести за пределы CASE
fp.code_b_cv C@ DUP
117 = SWAP 85 = OR \ unsigned : 'u' or 'U' тут предполагается, что число long беззнаковое
IF 10 BASE ! fp.(#S) fp.code_b_n ! fp.code_b_j ! ELSE
\ error - type of long number not specified
fp.err_le fp.error_id !
THEN THEN THEN THEN THEN

THEN
fp.code_b_success @
IF \ ----------------- continue recognition specificators : strings & symbols -----------------
2 fp.code_b_strsh !
0 fp.code_b_success ! \ wait success
fp.code_b_cv C@ DUP
99 = SWAP 67 = OR \ char : 'c' or 'C'
IF DEPTH 0 > IF fp.sym_out ELSE fp.err_so fp.error_id ! THEN 0 fp.code_b_n ! ELSE

fp.code_b_cv C@ DUP
97 = SWAP 65 = OR \ ansi string : 'a' or 'A'
IF
DEPTH 0 =
IF fp.err_so fp.error_id ! 0 0 ELSE fp.code_b_nulls THEN fp.code_b_n ! fp.code_b_j !
ELSE
fp.code_b_cv C@ DUP
115 = SWAP 83 = OR \ string : 's' or 'S'
IF DEPTH 0 = IF fp.err_so fp.error_id ! 0 0 THEN fp.code_b_n ! fp.code_b_j ! ELSE
-1 fp.code_b_success ! \ no success
THEN THEN THEN

THEN

fp.code_b_success @
IF \ ----------------- continue recognition specificators : single numbers -----------------
0 fp.code_b_success ! \ wait success
fp.code_b_cv C@ DUP
98 = SWAP 66 = OR \ binary : 'b' or 'B'
IF 2 BASE ! fp.(0#S) fp.code_b_n ! fp.code_b_j ! ELSE
fp.code_b_cv C@ DUP
111 = SWAP 79 = OR \ octal : 'o' or 'O'
IF BASE @ fp.code_b_baset ! 8 BASE ! fp.code_b_hss fp.code_b_n ! fp.code_b_j ! ELSE
fp.code_b_cv C@ DUP
105 = SWAP 73 = OR
fp.code_b_cv C@ DUP
100 = SWAP 68 = OR OR \ decimal : 'i' or 'I' or 'd' or 'D'
IF 10 BASE ! fp.code_b_hss fp.code_b_n ! fp.code_b_j ! ELSE
fp.code_b_cv C@ DUP
104 = SWAP 72 = OR \ hex : 'h' or 'H'
IF 16 BASE ! fp.(0#S) fp.code_b_n ! fp.code_b_j ! ELSE
fp.code_b_cv C@ DUP
117 = SWAP 85 = OR \ unsigned : 'u' or 'U' тут предполагается, что число короткое, но беззнаковое
IF 10 BASE ! fp.(0#S) fp.code_b_n ! fp.code_b_j ! ELSE
-1 fp.code_b_success ! \ no success
THEN THEN THEN THEN THEN

THEN
fp.code_b_baset @ BASE !

\ ----------------- после определения спецификаторов - вывод строки -----------------
fp.code_b_success @
IF \ неудача
\ если символ - не спецификатор, то выводится он сам
\ тут возможны исключения или непредсказуемое поведение,
\ если в строке присутствует недопустимый символ после спецификатора
\ note !!! no check of allowed symbols
fp.code_b_cv C@ fp.sym_out 2 \ specifier self and next symbol

ELSE \ удача (или ошибка)
fp.error_id @ 0 =
IF
fp.code_b_n @ 0 = IF 2 ELSE fp.code_b_cycle fp.code_b_strsh @ THEN
ELSE
0
THEN
THEN
; \ stub fp.code_b end

\ -----------------------------------------------------------------------------



: fp.code_a \ ( i*x " : values " asc n --> success_flag )
OVER + \ string end
fp.code_a_end !
DUP fp.code_a_beg !
fp.code_a_i !

BEGIN
fp.code_a_i @ C@
DUP fp.spec_sym @ =
IF
DROP \ symbol is not to out
fp.code_b \ call for transformation
fp.code_a_i @ + DUP fp.code_a_i ! \ pointer increase from code_b
ELSE
fp.sym_out
fp.code_a_i @ 1 + DUP fp.code_a_i !
THEN
fp.code_a_end @ = fp.error_id @ 0 > OR \ error or end - break
UNTIL
fp.error_id @
;
\ ( end: fp.code_a )

: fp.run \ ( asc n -- ) initialization of variables & call code_a
\ also a error - show report or no
0 fp.error_id !
0 fp.ostring_id_i !
0 fp.error_p !
fp.code_a \ presently: success_flag success is 0
0 > fp.error_repneed @ AND
IF
fp.errorrep_todo
THEN
;
\ ( end: fp.run )

: fp.str \ ( addr1 n1 addr2 n2 -- ) addr2 n2 - destination address string
\ even too simply
fp.ostring_id_n !
fp.ostring_id_a !
fp.string_out fp.current_out !
fp.run
;
\ ( end: fp.str )

: fp.scr \ ( addr1 n1 -- ) screen
\ even too simply
fp.screen_out fp.current_out !
fp.run
;
\ ( end: fp.scr )

: fp.fl \ ( addr1 n1 fileid -- ) fl - destination file
\ even too simply
fp.file_id !
fp.file_out fp.current_out !
fp.run
;
\? а если я хочу одновременно копию выводить и в файл и на экран?
\? собственно, почему вам не нравится просто возвращать результирующую строку?
\ ( end: fp.fl )

</pre>

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


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Я пришёл к выводу, что Олег (может, не всегда) очень наблюдателен. Отловлены и прокомментированы как-раз в-основном те места, где я очень сомневался, чем пользоваться. :) Скажем - тот же case - очень хотелось бы использовать - но
:( он вынесен в отдельную библиотеку, и, даже, кажется, таковая не одна (я не стал разбираться), а мне всё-таки хотелось бы сделать код максимально совместимым, т.е. вот в кварке case достаточно долго не было. Кроме того, я ориентировался (оглядывался - нельзя сказать, чтобы ориентировался) - и на другие форты. Скажем, на "фортек", т.е. тут на самом деле достаточно сложная проблема. Вот, скажем :( :( есть форты, где любое положительное чсисло - истина. Есть - где только 0 и -1. И что делать? Каждый раз 0 = , между прочим, я старался также не использовать NOT <> т.к. они тоже неодинаковы в разных фортах - где есть, где нет и где инверсия, а где сравнение (меня понятно?)

Да, правильно, такие переменные должны быть "юзер" - но во всех ли фортах они есть. Короче - написание библиотеки для форта - это решение совсем не программистских проблем :weep;
Цитата:
\! все же коментировать что же делает слово очень полезно...

: fp.code_b_cycle \ ( -- )
Это слово - цикл посимвольного вывода "вставки" в строку. Т.е. вот fp.code_b разобрал спецификаторы; понял какая длина и ...
поскольку вставка одна - каждый раз - хотя я помню - речь в упоминавшейся статье шла и о вложенных, то и цикл один
Цитата:
\! да, тут напрашивается использование примитивнейшего VECT слова
Да, точно , но снова - везде ли они есть
Цитата:
\? в ноль сбрасывать VARIABLE переменные не нужно (они и так в нем)
неизвестное мне обстоятельство
Цитата:
\! очень плохо, когда человек использует разные методики оформления кода в одном тексте 8(
Да :(
Цитата:
\! если переменные читаюся часто, лучше исползовать VALUE или USER-VALUE
та же проблема - не уверен, что всюду есть


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

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

такой вариант тоже есть - fp.str \ ( addr1 n1 addr2 n2 -- ) addr2 n2 - destination address string

единственное, памятуя о проблемах с сохранностью строк я предпочитаю addr2 n2 , чтобы слово получало строку

\? а если я хочу одновременно копию выводить и в файл и на экран?

для этого придётся переделать, но ведь можно построчно


DEPTH 0 > IF

\! ужастно! уберите DEPTH и никогда, НИКОГДА так не делайте!!!

почему


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
вопрос писал(а):
есть форты, где любое положительное чсисло - истина. Есть - где только 0 и -1.

на самом деле не так.
любое отличное от нуля число - истина :) причем везде.
а вот флаг TRUE и флаговые значения, возврщаемые словами только 0 и -1

вопрос писал(а):
Да, правильно, такие переменные должны быть "юзер" - но во всех ли фортах они есть. Короче - написание библиотеки для форта - это решение совсем не программистских проблем

вы не правы в том, что пытаетесь найти решение для всех фортов сразу - а так никогда ни у кого не получится!
Найдите удачное решение для одной системы, а потом задумывайтесь над тем, как это сделать переносимо.

вопрос писал(а):
Цитата:\! да, тут напрашивается использование примитивнейшего VECT слова
Да, точно , но снова - везде ли они есть

оно есть даже в других ЯП :)

вопрос писал(а):
Цитата:\! если переменные читаюся часто, лучше исползовать VALUE или USER-VALUE
та же проблема - не уверен, что всюду есть

нету в однозадачных фортах. Но, все серьезные форты поддерживают многозадачность :)

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


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
вопрос писал(а):
DEPTH 0 > IF
\! ужастно! уберите DEPTH и никогда, НИКОГДА так не делайте!!!
почему

по той же причине, по которой нельзя давать обезьяне играться с гранатами :)
у меня на DEPTH уже рефлекс - если вижу это слово в коде - код не рабочий, точнее его надо переделывать, так как пользоваться им нельзя.
НЕЛЬЗЯ ПРИВЯЗЫВАТЬСЯ К ГЛУБИНЕ СТЕКА ДАННЫХ! КАТЕГОРИЧЕСКИ!

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


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Цитата:
НЕЛЬЗЯ ПРИВЯЗЫВАТЬСЯ К ГЛУБИНЕ СТЕКА ДАННЫХ! КАТЕГОРИЧЕСКИ!
А-а , я понял, но это не часть алгоритма - это отлов ошибки
именно ошибки стеко-исчерпания


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

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

тем более так не делайте = это вам не позволит найти ошибку
еще раз, к глубине стека данных привязываться нельзя!!!

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


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

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


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
вопрос писал(а):
Цитата:тем более так не делайте = это вам не позволит найти ошибку
еще раз, к глубине стека данных привязываться нельзя!!!Этого уже не понял

вы положите лишний параметр на стек данных во время редактирования своей же поделки, и ошибка магическим образом исчезнет :)
переопустошение стека данных = это область организации системы. Вы же должны проектировать слова так, чтобы на входе и на выходе количество параметров желательно было фиксированным. С этой точки зрения слово ?DUP и подобные ему слова уже плохи, так как легко плодят ошибки.
DEPTH - это диагностическое средство, в коде ему делать нечего!
другое дело, если вы во время тестирования пишете что-то такое:

DEPTH test sample bla bla bla
DEPTH 1 - <> THROW

внутри определения слову DEPTH делать нечего

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


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

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

внутри определения слову DEPTH делать нечего

Хм, видимо, этот случай - исключение, ведь тут слово DEPTH играет именно диагностическую роль :
оно проверяет, не закончились ли аргументы на стеке раньше, чем спецификаторы в строке, т.е. не написал ли программист строчку с таким количеством чисел, что на стеке не хватает. И делается это именно перед снятием очередного числа со стека, т.е. никаких дополнительных значений положить не предполагается: или очередное снятие числа возможно или нет

как иначе решить задачу?


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

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

вопрос писал(а):
спецификаторы далеко не все - позиционирование, точность, размер, дополнение, плав. точка не реализованы - это ведь прикидка

Ужас. Теперь всем надо ждать, пока прикидка превратится в устойчивый продукт? А заодно "на ходу" (с учетом производимых изменений) осваивать использование, привыкать к форматам, "наметывать глаз" на диагностику ошибок...
Мне нужно решить, в какую сторону двигаться
- можно сделать копию С
- можно сделать как в прологе
- можно изобретать для форта - демонстрировать гибкость

я жду каких-либо суждений на этут тему

на данный момент я ориентировался на форт - для отладки, даже заглавные буквы предусмотрел и отлов типично фортовской ошибки
теперь вместо того, чтобы "контрольную точку" сравнивать с исходником и смотреть, что же там на стеке расположено, можно пользоваться строкой, где всё указано

вроде ( в циклe do loop )
OVER OVER I \ ( C A I - предположим )
S" ( I = %d ) значение А = %d , значение С = %d , в то время, как А должно быть меньше С " fp.scr


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

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

так делать нельзя! вы так ничего не проверите, а проблем наживете.
на самом деле проверка не нужна. Если прогрммист что-то упустил или оставил лишнее, то он практически моментально получит свою ошибку или исключение :) Еще раз, слову DEPTH делать в коде нечего!

вопрос писал(а):
И делается это именно перед снятием очередного числа со стека, т.е. никаких дополнительных значений положить не предполагается: или очередное снятие числа возможно или нет
как иначе решить задачу?

обычно это не проверяется. То есть, есть вариант выложить в явном виде количество параметров, как, например, это делает слово GET-ORDER и тогда забирать указанное количество SET-ORDER (тоже как пример - надо смотреть в код к ним!)
Либо "волшебное значение", например 0 . Но 0 при форматном преобразовании очень легко может встетиться, значит magic value отменяется.
Третий вариант, чаще всего встречающийся в Форте - ничего не проверять (а зачем усложнять алгоритм, тратить байты и рабочее время?), а надеяться на то, что программист будет следить за количеством параметров сам.

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


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
вопрос писал(а):
Мне нужно решить, в какую сторону двигаться
- можно сделать копию С
- можно сделать как в прологе
- можно изобретать для форта - демонстрировать гибкость

у Форта свой путь. И следовать лучше ему.
Я лично не пойму никак, чем вам не нравится существующий порядок вещей. То есть те средства, которые уже есть, опробованы временем.
Их реально хватает на все, зачем 305 строчек ненужностей?

вопрос писал(а):
я жду каких-либо суждений на этут тему

вы видите, я пытаюсь вам отвечать ;)

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


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

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


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

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


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

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