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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 120 ]  На страницу 1, 2, 3, 4, 5 ... 8  След.
Автор Сообщение
 Заголовок сообщения: Маленькие хитрости
СообщениеДобавлено: Ср июл 01, 2015 12:56 
В то время, когда просвещенная часть человечества опять задумалась, с какого конца будет теоретически правильным реализовать DUP и VECT, хочу напомнить, что гораздо плодотворнее обмениваться идеями, которые лежат чуть выше: не как делать, а что делать.

Unter и Ueber...

Я тут в пылу спора, заявил, что реализация "обычных ссылок" и "обычных структур" для фортера вещь сугубо избыточная. Он может поступать проще (или сложнее).

Например, может ли быть проще указателя? Например, тот же DOES> - это, ведь, тоже ссылка (вида is_a - т.е. указывающая на "род"). И ее даже можно использовать!
Например (см. http://www.gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=%5C3.POLESNYE%20ALGORITMY%5CFORTH%20I%20STRUKTURY%20DANNYH), Таунсенд и Фохт так определяют тип слова:
Код:
: ПЕРСП  ( -- PFA+2 )  CREATE HERE 2+ , 0 , DOES> 2+ ;
ПЕРСП FOO ' FOO @ FORGET FOO
: ПЕР?  ( С -- F )  DUP @ 0= SWAP 4 - @ [ DUP ] LITERAL = AND ;
DROP
Т.е. "типом слова" будет адрес его шитого кода (лежащего за DOES>).

А что может быть сложнее указателя? Тут очевидно - какого либо "умный указатель", знающий, на что он ссылается.
Например, в новой версии FOBOS я (в основном, для динамической подгрузки библиотечных функций и сохранения параметров созданных окон/ресурсов) ввел специальную константу, помнящую, что ее еще не инициализировали.
Код:
( ВЫЧИСЛЯЕМАЯ ПРИ ПЕРВОМ ОБРАЩЕНИИ КОНСТАНТА)
: SECOND ( wa -- w) 4 + @ ;
: (WIN-CONST) >R R@ DUP SECOND ['] SECOND R@ ! R> 8 + RDROP >R ;
: (END-CONST) DUP ROT 4 + ! ;
: WIN-CONST; COMPILE (END-CONST) [COMPILE] ; ; IMMEDIATE
: WIN-CONST: ( <слово> w1 --)
CREATE ['] (WIN-CONST) , , ] DOES> ( -- w2) DUP @ EXECUTE ;
: WIN-CONST! ( <слово> w --) ' >PFA ['] (WIN-CONST) OVER ! 4 + ! ;
Пример использования
Код:
\ ИНФОРМАЦИЯ О ПРОЦЕССЕ
0 WIN-CONST: APPINST [KERNEL32] GetModuleHandleA ;WIN-CONST

Аналогично и со структурами. Что может быть проще? Очевидно, заполнение/использование "поля за полем".
Например, в том же FOBOS (точнее в WIN-API) очень часто приходится заполнить WIN-ерундой какую-то структуру и передать ее как параметр. Заводить специальную struct, вводить слова для ее полей? Господа, мы же в FORTH! Вместо этого проще зафигачить нужные значения в нужном порядке на стек, объединив всю информацию об этой "структуре" в том слове, где она используется. Подробнее смотри в разделе ТРУДНОЕ РЕШЕНИЕ в http://www.gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=%5C5.FOBOS.
Пример использования:
Код:
\ ВЫЗОВ РЕГИСТРАЦИИ КЛАССА ОКНА
: REGISTER-CLASS ( -- )
ARENE  ICON CLASS-NAME 0 ( МЕНЮ ДЛЯ НАС ЗДЕСЬ НЕДОСТУПНО)
  BACKGROUND CURSOR ICON APPINST EXT-CLASS WIN-PROCEDURE @
  CLASS-STYLE 48 ( РАЗМЕР СТРУКТУРЫ) SP@ [USER32] RegisterClassExA ARENE-DROP ;
(ARENE - это для чистки стека).

А что может быть сложнее структур! См. тех же Таунсенда и Фохта (там же): они без комплексов реализуют списки при помощи обычных массивов. И даже на этой базе реализуют кусочек PROLOG. Конечно, реализация ограниченная, но вполне достаточная для их целей.
***

Надеюсь, что моя мысль понятна. Имея такое мощное оружие как FORTH, программист совершенно не обязан реализовать что-то "общепринятое". Он может делать только то, что нужно. Тут только две трудности: нужно знать, как устроен твой FORTH и быть готовым разговаривать на уровне идей, а не "почему у меня это не компилируется?".

Так что предлагаю обмениваться подобными веселыми штуками.


Последний раз редактировалось gudleifr Чт янв 14, 2016 14:06, всего редактировалось 7 раз(а).

Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Ср июл 01, 2015 13:31 
Не в сети

Зарегистрирован: Ср фев 17, 2010 18:10
Сообщения: 323
Откуда: Тверь
Благодарил (а): 13 раз.
Поблагодарили: 11 раз.
Я часто использую форт для тестирования функций в DLL (so). Если использовать C++ то для описания функции из DLL нужно слишком долго нажимать на кнопки и растолковывать компилятору, что и как положить.

На форте мгновенно:
Код:
// Проверим возможность открыть PostGres из форт
IF=W Lib" libpq.dll" libpq
IF=W Library@ libpq 1 CDECL-Call" PQconnectdb"    PQconnectdb
IF=W Library@ libpq 1 CDECL-Call" PQstatus"          PQstatus
IF=W Library@ libpq 1 CDECL-Call" PQfinish"           PQfinish
IF=W Library@ libpq 2 CDECL-Call" PQexec"            PQexec
IF=W Library@ libpq 1 CDECL-Call" PQresultStatus" PQresultStatus
IF=W LibraryLoad libpq

// Проверка SQL

0 CONST CONNECTION_OK
1 CONST PGRES_COMMAND_OK
VAR conSQL  // Коннект на SQL
VAR resSQL  // Результат запроса

S" host = 192.168.0.3 dbname = 'genatest' user = 'gena' password = 'Htdj'" 1+ CONST СтрокаИнициализации

: ДобавитьЗаписьВтаблицуTab3
    СтрокаИнициализации PQconnectdb DUP conSQL ! PQstatus
    CONNECTION_OK = IF
        S" Base SQL open sucsess!" TYPE CR
        conSQL @ S" INSERT INTO tab3 ( id, name ) VALUES (28, 'Маша')" 1+ PQexec
        DUP resSQL !   PQresultStatus
        PGRES_COMMAND_OK = IF
            S" Exec Ok!" TYPE CR
        ELSE
            S" Exec is BAD!" TYPE CR
        THEN
    ELSE
        S" Base SQL open ERROR!" TYPE CR
    THEN
    conSQL @ PQfinish DROP
    ;
IF=W ДобавитьЗаписьВтаблицуTab3


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Пт июл 03, 2015 03:12 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Итак, продолжаем наше представление! :) После того, как на нашей ARENE объявили жонглера-эквилибриста с 11 предметами, публика было оживилась. Однако выехавший артист на одностековом, тьфу, одноколесном велосипеде всего-навсего держал в руках стопку некрупных кубиков, которые благополучно свалил в корзину с надписью WINAPI, едва доехав до нее. Где, собственно, жонглирование? Так бы спросили старожилы цирка, но их, увы, немного. Были еще намеки на укрощение хищников, а такие ожидания обманывать нельзя. Поэтому следующим номером на арену был выволочен пенек с чем-то круглым и мохнатым в центре. Очевидно, он должен был с этого пенька куда-то спрыгнуть. Однако же все знают, почему кошачьи бега непопулярны. Вот сами подумайте, оно им надо? Лапы, между прочим, не казенные. Поэтому для полноты картины место прыжка надо бы обозначить.

Обозначим же хищнику место прыжка какой-нибудь рамкой. Ну например такой:

BOX // x1, y1, x2, y2, color --

Хищник вытянул из-под пенька пару табличек HLINE и VLINE // x, y, length, color Одна табличка была вытянута по горизонтали, а другая по вертикали, что наводило на определенные мысли. И вот тут-то работникам арены пришлось пожонглировать! Итак, нам теперь надо уложить x1, y1, x2-x1, color, чтобы организовать верхнюю планочку. Не вопрос! Правда, DUP и OVER оказались с коротенькими лапками и до x1 не достают. Придется брать PICK.

Итак, 4 PICK вытянул нам x1. Теперь надо вытянуть еще y1. Фокус несложный, но тут нам поможет все тот же 4 PICK. Юные зрители на трибунах слегка ахнули, но ведь поверх всех параметров уже уложен x1, так что нумерация сместилась. Взрослых зрителей таким фокусом, понятно, не проймешь. А что дальше? А не поверите, для x2 надо еще раз 4 PICK. А дальше будет x1... и вот тут придется притормозить и пересчитать, что у нас там на стеке навалено. Оказывается, надо аж 7 PICK, а за ним уже можно ставить минус, чтобы узнать длину линии. Ну и наконец-то вытягиваем COLOR... эээ... "3 PICK" - промурчал с пенька хищник, и наконец кучка была скомпонована.

Покопавшись так еще 3 раза, оказалось возможным выложить вот такое:

Код:
: BOX // X1, Y1, X2, Y2, COLOR
  4 PICK 4 PICK 4 PICK 7 PICK - 3 PICK HLINE
  4 PICK 4 PICK 3 PICK 6 PICK - 3 PICK VLINE
  4 PICK 2 PICK 4 PICK 7 PICK - 3 PICK HLINE
  2 PICK 4 PICK 3 PICK 6 PICK - 3 PICK VLINE
  DROP DROP DROP DROP DROP


И оно даже работает. Образовалась такая симпатичная рамочка, через которую можно бы и прыгнуть. Собственно, раз некруглые хищники прыгают через круглый обруч, почему бы круглому не прыгнуть через что-то некруглое? Однако, несмотря на дежурные фоновые выкрики "впервые на арене Форт использован по назначению", хищник на пеньке даже ухом не повел. Весь его вид как бы говорил "не буду я через эту страсть прыгать". А что такое это ваше 7 PICK? Где гарантия, что при пролете не задену ушами? А если, к примеру улыбнуться в полете во всю хищническую пасть? Вы-то броситесь переделывать вашу рамочку, поправите не тот PICK, а мне отдуваться. Вдруг раскрытой пастью кого перекушу? Вон, на трибунах EuroFIG сидит. Конечно, если кого из них слопать, они не заметят. Им вообще не интересно, сколько вокруг них реальных фортеров, но почему чисткой их рядов должны заниматься мирно спящие на пеньке? :)

Придется навесить ярлычки:

Код:
: BOX // X1, Y1, X2, Y2, COLOR
         //  4    3   2   1   0
  FRAME{
    ARG4 @ ARG3 @ ARG2 @ ARG4 @ - ARG0 @ HLINE
    ARG4 @ ARG3 @ ARG1 @ ARG3 @ - ARG0 @ VLINE
    ARG4 @ ARG1 @ ARG2 @ ARG4 @ - ARG0 @ HLINE
    ARG2 @ ARG3 @ ARG1 @ ARG3 @ - ARG0 @ VLINE
  }FRAME
  DROP DROP DROP DROP DROP
;


Что делает FRAME{ ? Оно запоминает на специальном стеке текущую глубину стека данных. }FRAME, соответственно, убирает число с этого специального стека. Благодаря запомненной глубине ARG0 всегда будет давать адрес того числа, которое было на вершине в момент выполнения FRAME{. Таким образом, становится понятен смысл второй строки комментариев. Теперь встроенное слово ARG4 всегда дает x1, и так далее.

На эту картину хищник с пенька слегка заинтересованно повел ухом. Текст не то чтобы стал меньше или сильно понятнее, однако теперь стало возможным хотя бы отследить глазками соответствие номеров аргументов и их смысла. Вот еще бы имена им дать понятные, а то ведь говорят, что ARG4 это x1... поди проверь!

Покопавшись в пеньке, хищник подпихнул лапой еще пачку словечек. Из них можно соорудить рамку того же типа, но процесс как-то более симпатичен.

Код:
: BOX
  LOC[
    QUAN X1 QUAN X2 QUAN Y1 QUAN Y2 QUAN COLOR
  ]LOC
  TO COLOR TO Y2 TO X2 TO Y1 TO X1
 
  X1 Y1 X2 X1 - COLOR HLINE
  X1 Y1 Y2 Y1 - COLOR VLINE
  X1 Y2 X2 X1 - COLOR HLINE
  X2 Y1 Y2 Y1 - COLOR VLINE
;

Итак, что такое LOC[ ]LOC, куда делись DROP и почему словарь замусорен? Стоп, а кто вам таки сказал, что словарь замусорен? Оказывается, внутри LOC[ ]LOC Форт ушел в режим исполнения и наобъявлял переменных. Они были в цепочке поиска вплоть до выполнения ; , а там указатель на вход в цепочку слов оказался просто переставлен обратно на то слово, которое было до LOC[ Мы же в цирке! Тут постоянно что-то появляется и пропадает. Внутри определения BOX доступны X1 X2 Y1 Y2 COLOR. Выполнили ; ... але-оп, только BOX! Конечно, где-то глубоко в словаре эти слова по-прежнему существуют, как предметы в ящике с двойным дном. Но их просто обходят при поиске, и все.

Однако даже такая красивая рамочка не помогла. Рамку помочь построить, так еще и прыгать через нее прикажете? Нет уж, спать на пеньке полезнее и приятнее, пусть даже в цирке и шумновато стало... :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Пт июл 03, 2015 14:43 
Да... Зачем писать на FORTH, если нас напрягает работа со стеком и так не хватает "нормальных переменных"? И все равно, программа как была набором повторяющихся почти один-в-один строк, так и осталась?
И как связана проблема перетасовки стека с применением локальных переменных? Стек можно тасовать и в глобальных. Видимо, локальность здесь добавлена только для того, чтобы это было больше похоже на фокус.

Нее... Так не интересно.
Во-первых, в чем проблема? В том, что переменные попадают на стек не в том порядке, что используются?

1. А не в том ли они порядке?
X1 Y1 X2 Y2 надо преобразовать в (применение столь дурацких процедур рисования линий оставляем на совести нашего клоуна):
X1 Y1 DX
X1 Y1 DY
X1 Y2 DX
X2 Y1 DY
(позднее: пардон, D здесь означает не double, а delta).

Думаю, если Вы немножко умеете писать на FORTH, Вы вполне можете написать (для наглядности без COLOR):

: 4DUP ( X1,Y1,DX,DY -- X1,Y1,DX,DY,X1,Y1,DX,DY) 2OVER 2OVER ;
: Y+X ( X1,Y1,DX,DY -- X1,Y2,DX) SWAP >R + R> ;
: X+Y ( X1,Y1,DX,DY -- X2,Y1,DY) >R 0 D+ R> ;
: BOX 2OVER D- 4DUP DROP HLINE 4DUP NIP VLINE 4DUP Y+X HLINE X+Y VLINE ;

И, даже, добавить >R и R@ для COLOR...

Это только простой фокус, на самом деле... Дык, я о том и говорю, что "на самом деле" проще написать "то, что надо", а не вспоминать, через какую жо... тьфу, стек, были определены LOC.

2. Более интересен вариант, когда данные для наших процедур будут подаваться не просто в неудобном порядке, но в произвольном. Тогда забавнее всего будет оформить слова СТАРТ, ВПРАВО, ВНИЗ, ВЛЕВО, ВВЕРХ через DOES> (с полями под координаты и смещения), а при вводе конкретных цифр - их модифицировать через >BODY .

3. В случае же усложнения задачи будет иметь смысл создать специальное слово - итератор, при каждом обращении выдающее следующую точку для рисования.

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


Последний раз редактировалось gudleifr Чт янв 14, 2016 14:10, всего редактировалось 1 раз.

Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Ср июл 08, 2015 16:50 
Еще немного "работы над ошибками".
mgw писал(а):
в чем смысл компиляции во временный буфер ...?

Когда мы пытаемся оценить значение какой-либо FORTH-фичи, мы должны выяснить:
  • для решения какой проблемы она предназначена?
  • в каком месте зафигачена?
  • каким способом прифигачена?

Проблема? Насколько я понимаю, элегантная замена жуткой конструкции

HERE ЗАПАС ALLOT : ЗАПИХАТЬ .... ; ЗАПИХАТЬ FORGET ЗАПИХАТЬ

создающей на стеке нечто замечательное, лишь побочный эффект от использования фичи "ЗНАЧЕНИЕ=слово". Главный плюс - после того, как мы что-то прочли из ПОТОКА, мы рассматриваем считанное не как набор какой-то фигни, которую еще надо анализировать, но "всего-лишь слово", которое можно исполнить или скомпилировать.

Место? Что такое ЗНАЧЕНИЕ? Процедура СИМВОЛ (чтения/разбора ПОТОКА), оставляет после себя ЗНАЧЕНИЕ, которое нужно ВЫПОЛНИТЬ или КОМПИЛИРОВАТЬ.
Например, после процедуры NUMBER мы обычно имеем число на стеке/стеках и сведения о типе числа в специальных переменных (еще в ЗНАЧЕНИЕ входит текстовая запись числа в СЛОВАРЕ). Если мы в режиме исполнения - просто умываем руки, иначе, анализируя переменные, компилируем в СЛОВАРЬ нужный извлекатель числа (LIT) и само число. Т.е. анализ типа числа производится, по сути, дважды: в NUMBER и в КОМПИЛИРОВАТЬ. Способ же "ЗНАЧЕНИЕ=слово" за счет усложнения СИМВОЛ (путем включения временной компиляции) позволяет свести КОМПИЛЯЦИЮ к бездумному переносу кода из буфера в СЛОВАРЬ (плюс, немного усложняется ВЫПОЛНИТЬ, за счет того, что ЗНАЧЕНИЕ еще нужно исполнить).
Понятно, что подобный способ позволяет сделать ЗНАЧЕНИЕ сколь угодно сложным, например, засунуть в него (см. выше) и процедуру ЗАПИХАТЬ, и выделение ЗАПАСА.
К сожалению, примененная здесь терминология, несмотря на свою очевидность, настолько неприемлема для большинства фортеров, что сам fork-радетель за эту фичу не может внятно объяснить, что именно он сделал. Тем более, понять то, что я тут понаписал.

Способ? Есть четыре способа "улучшить FORTH": 1) добавить лексиконов (например, придумать специальные слова для размещение в СЛОВАРЕ чего-то сложного, с последующей уборкой мусора); 2) спрятать механизм фичи во внутренностях FORTH (что и сделано в fork); 3) изменить структуру FORTH (например, добавив к ВЫПОЛНИТЬ и КОМПИЛИРОВАТЬ процедуру ПРЕКОМПИЛИРОВАТЬ (и использовать третье значение STATE); 4) вынести фичу во вторичную FORTH-машину (допустим, считывающую и передающую в главную сложные структуры данных).
***
Так что, думайте сами. Радоваться каждой новой фиче как ловкому фокусу мохнатых лапок или, хотя бы для себя, создать некоторую систему понятий.
***
Что же касается конкретно этой фичи, то она окупается очень слабо.
Мусорное слово

: ТРИ-ПОРОСЕНКА 3 0 DO VARIABLE LOOP ;

весит гораздо меньше, чем механизм, позволяющий писать
mOleg писал(а):
10 FOR VARABLE NEXT one two three ... ten


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Чт июл 09, 2015 12:46 
Не в сети

Зарегистрирован: Ср фев 17, 2010 18:10
Сообщения: 323
Откуда: Тверь
Благодарил (а): 13 раз.
Поблагодарили: 11 раз.
Хм .... мысль интересная.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Пт июл 10, 2015 23:37 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
gudleifr писал(а):
Во-первых, в чем проблема? В том, что переменные попадают на стек не в том порядке, что используются?

Увы, не пойдет. Я что, чисто случайно подобрал настолько набившие оскомину примеры? Ежу понятно (конечно, если он еще и программирует графические примитивы, а не просто пользуется), что иметь размеры полезнее, чем координаты - размеры сразу идут в дело. Но так было бы совсем не показательно. Нужен пример, в котором хоть что-то бы считалось, а не просто переваливалось со стека Форта в WINAPI. А таких примеров в практике может быть сколько угодно, и не дело программиста, реализующего библиотеку, постоянно кричать "стоп, мне так неудобно! Сделайте мне иначе". Поэтому попадание на стек не в том порядке - это данность, с которой нужно уметь работать.

gudleifr писал(а):
Думаю, если Вы немножго умеете писать на FORTH, Вы вполне можете написать (для наглядности без COLOR):

: 4DUP ( X1,Y1,DX,DY -- X1,Y1,DX,DY,X1,Y1,DX,DY) 2OVER 2OVER ;
: Y+X ( X1,Y1,DX,DY -- X1,Y2,DX) SWAP >R + R> ;
: X+Y ( X1,Y1,DX,DY -- X2,Y1,DY) >R 0 D+ R> ;
: BOX 2OVER D- 4DUP DROP HLINE 4DUP NIP VLINE 4DUP Y+X HLINE X+Y VLINE ;

И, даже, добавить >R и R@ для COLOR...


Совершенная в своей наглядности иллюстрация к вопросу "вот, посмотрите, во что мы чуть было не вляпались". Распишитесь в получении трех вспомогательных слов! :) Вообще-то, BOX и так довольно-таки вспомогательное, "украшательское" словечко. Так ведь нет, надо еще и к нему сделать:
а) 4DUP, который то ли уже есть, то ли еще нет (а мало ли где еще возникла в нем потребность)
б) невнятные и многозначные Y+X и X+Y - это явные куски другого слова, которые и используются-то дальше по одному разу. Они не позволяют мгновенно, мазнув взглядом по тексту, выявить, нет ли в них ошибок (хотя бы и смысловых - вдруг они делают не то, что задумывал автор)
в) мешанину в BOX. Пришли ровно к тому, от чего собирались уйти - от необходимости мысленно отслеживать положение параметров на стеке данных. Мало того, добавился еще и стек возвратов :) И это при том, что COLOR скромно заметен под ковер, хотя с ними было бы ну совсем "красиво".

В итоге мы имеем очередную разновидность "раз я на Форте не пишу, то пусть и никто не пишет". Если без хитростей нельзя сделать уже простейших, базовых шагов, то может и не стоит мучать скрипочку?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Сб июл 11, 2015 00:00 
Hishnik писал(а):
...
Именно! Если три "вспомогательных" и "невнятных" (но при этом кристально-прозрачных) слова заменяют сложный механизм, это ли не прелесть FORTH-программирования? Не понимаю, зачем изобретать велосипед? Более того, найдя через 10 лет эти "три слова", я легко пойму, в чем дело (сталкивался с аналогичными случаями). А, вот, вспомнить, как я 10 лет назад реализовывал механизм локальных переменных (и какие налагались ограничения) - вряд ли. Дело, видимо, в том, что Вы рассматриваете FORTH в качестве конечного продукта, а я все-таки на нем пописываю.

P.S. не понимаю боязни стека возвратов. Класс задач удобно решаемых использованием "двух лент" столь значителен, что изобретать по способу обхода на каждый случай, пожалуй, будет слишком накладно.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Сб июл 11, 2015 00:19 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
gudleifr писал(а):
Именно! Если три "вспомогательных" и "невнятных" (но при этом кристально-прозрачных) слова заменяют сложный механизм, это ли не прелесть FORTH-программирования?

В чем тут прелесть-то? Разве что в самом процессе. Но для меня процесс - это не придумывание слов и придание им искусственной "Форт-красоты", а проект в целом. Он должен красиво работать, красиво сопровождаться и модифицироваться, а не выглядеть лоскутным сборником маленьких хитростей.
gudleifr писал(а):
А, вот, вспомнить, как я 10 лет назад реализовывал механизм локальных переменных (и какие налагались ограничения) - вряд ли.

Я же написал - никаких там специальных ограничений нет. Это обычные "глобальные" слова, только при компиляции ; они убираются из цепочки поиска. Если это не Форт-решение, то я уже и не знаю...
gudleifr писал(а):
Дело, видимо, в том, что Вы рассматриваете FORTH в качестве конечного продукта, а я все-таки на нем пописываю.

Конечный продукт - это прибор или аппаратно-программный комплекс. Применять Форт меня там никто не заставляет. Поэтому шелуха отлетает сама - ведь есть и сроки, и объективная сложность реализации алгоритмов, да и элементарная лень :) Поэтому годами таскать за собой фикции мне как-то не с руки. А вот облегчать повседневную деятельность - очень даже.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Сб июл 11, 2015 00:32 
Hishnik писал(а):
В чем тут прелесть-то?
В том, что программа строится "по ходу мысли". И каждое отдельное слово - не попытка применить примерно подходящую по смыслу "умную" парадигму, а просто описание очередного шага решения. Если мне понадобилось переставить параметры в нужном порядке, почему я должен это сам от себя прятать? Раз понадобилось - делаем! Наличие смысловых контрольных точек "красивой работе и красивому сопровождению" не помешает. Наоборот.
Hishnik писал(а):
лоскутным сборником маленьких хитростей.
Это от плохого знания FORTH. Если Вы понимаете, как работает FORTH, для Вас подобные решения прозрачны.
Hishnik писал(а):
Это обычные "глобальные" слова, только при компиляции ; они убираются из цепочки поиска. Если это не Форт-решение, то я уже и не знаю...
А Вы попробуйте подумать. Не рассматривайте слова только как "метки необходимые из-за недостаточности синтаксиса". Слова, это, в первую очередь, повторю, шаги осмысления/решения. Помните картинку Броуди - зачем прятаться в клетку от собственного зверя?
Hishnik писал(а):
Поэтому годами таскать за собой фикции мне как-то не с руки.
Без комментариев.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Сб июл 11, 2015 01:13 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
gudleifr писал(а):
Если мне понадобилось переставить параметры в нужном порядке, почему я должен это сам от себя прятать? Раз понадобилось - делаем! Наличие смысловых контрольных точек "красивой работе и красивому сопровождению" не помешает. Наоборот.

Это все очень мелкие контрольные точки. С ними легко растерять все на вот таких мелочах, которые по сути никому не нужны и ничего к основному назначению программы не добавляют. Однако создается иллюзия следования какой-то парадигме, которая должна бы помочь. Только это замкнутый круг. "Форт берется, чтобы было лучше.... но лучше не становится... зато Форт... а зачем? Чтобы было лучше!". На колу мочало, начинай сначала. Надо сказать, что не то что порядок аргументов, а и более серьезные вещи в программе иногда надо менять сообразно с привходящими факторами, и делать это надо быстро и безболезненно. А если на каждый чих придумывать новую порцию маленьких хитростей, будет долгострой и копание в мелочах.
gudleifr писал(а):
Это от плохого знания FORTH.

Ой, а я-то думал, что от плохой погоды :))
gudleifr писал(а):
А Вы попробуйте подумать. Не рассматривайте слова только как "метки необходимые из-за недостаточности синтаксиса". Слова, это, в первую очередь, повторю, шаги осмысления/решения.

Я собираюсь свободно пользоваться наработанными инструментами, а не каждый раз по пустяковому поводу имитировать мыслительный процесс. Если программист начинает думать, только когда сталкивается с необходимостью реализации мелких вспомогательных вещей, ему надо идти тренироваться делать завершенные проекты, а не накачивать себя теорией программирования. Из 100 имеющихся в багаже навыков могут потребоваться 3-5, только вот кто ж заранее скажет, какие именно? Потому и надо знать/уметь именно 100. А вот на ходу доучиваться и домысливать - увольте. Осмысливать рисование рамки по ходу программирования, придумывая вспомогательные слова? Ну, для ругани на форумах это еще потянет, а на проектах 50+ кб текста уже накопится столько мусора и затычек, что проще будет выкинуть и переписать заново, предварительно наступив на горло теоретической форт-песне.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Сб июл 11, 2015 01:35 
Hishnik писал(а):
...
Слишком утрированно, но суть FORTH описано верно. Помните, у Мура: "Пишите сами!", "Не предполагайте!"?
Не знаю, для каких целей используете FORTH Вы, но для меня он является, в первую очередь, средством отодвинуть порог сложности программ.
Допустим, я могу держать в голове объект сложности X. Тогда, при структурном программировании (которое Вы все стремитесь привнести в FORTH) эта память делится на "универсальные парадигмы" - X1 - и саму программу - X2. Причем, по Вашим же прикидкам, я могу выиграть 3-5% от X1 за счет перекрытия X1 и X2. А в FORTH, минимизируя X1 путем его удаления из памяти (оставив там только самые общие принципы), я выиграю до 95-98% от X1. Конечно, я проиграю в скорости разработки, т.к. упомянутые Вами 3-5% мне придется изобретать заново, но оно обычно окупается.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Сб июл 11, 2015 01:49 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
gudleifr писал(а):
Слишком утрированно, но суть FORTH описано верно. Помните, у Мура: "Пишите сами!", "Не предполагайте!"?

Ну, Мур уже написал OKAD по такому принципу... без слез не взглянешь. Он про кремний такого напредполагал, что можно топологам как страшную сказку рассказывать. Именно так они это и воспринимают - живет где-то почтенный (в прошлом) программист, который на субмикронные технологии пошел с шашкой наголо и попросту ("не предполагая") нарисовал руками транзисторы, как будто у него там техпроцесс 10 микрон. Для меня это теперь хрестоматийный пример, как можно вляпаться на лихом программистском коне в проблемы предметной области и выглядеть там более чем глупо. Проблемы с топологией не только у Мура, но люди, по крайней мере, честно признают недоработки и пытаются искать, где они неправы, а не превращают свое неописуемое невежество в новые лозунги.

Впрочем, это моя рефлексия. Предлагаю практическую штуку. Warhammer :) Конкретное боестолкновение, хотя бы на уровне уже вошедших в соприкосновение melee-отрядов без спецсвойств и артефактов. Все, так сказать, богатство возможностей и инструментов. Код должен быть достаточно прозрачен и понятен, чтобы можно было его подкорректировать под другую редакцию правил, эффекты от психологии, спецсвойств и артефактов. В том смысле, что должно быть понятно, что и куда надо вставить, чтобы учесть, например, "при потерях в 25% численности отряда за ход необходимо пройти проверку на лидерство".С полученным кодом должно быть также достаточно удобно проводить проверки вида "сколько надо скейвенов для удержания 10 черных орков хотя бы на 3 хода", поэтому помещение всех параметров на стек вряд ли прокатит.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Сб июл 11, 2015 02:52 
Hishnik писал(а):
почтенный (в прошлом) программист
Дык, похоже, он и потерял "почтенность" уйдя от своих принципов в нишу "языка управления".
Hishnik писал(а):
Предлагаю практическую штуку. Warhammer
Работаю сейчас над чем-то подобным (в рамках написания второго тома "записок об играх"). Что получится, пока не знаю. Даже оглавление пока под вопросом.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Сб авг 29, 2015 18:35 
Не в сети
Аватара пользователя

Зарегистрирован: Вт авг 12, 2008 03:18
Сообщения: 327
Откуда: Москва
Благодарил (а): 36 раз.
Поблагодарили: 7 раз.
Срочно помогите придумать хитрость.

Дана последовательность байт X0 X1 X2 ... XN

Какие операции нужно совершить с этой последовательностью и какие данные
с нее нужно получить, что бы восстановить последовательность,
в случае утраты любых двух байтов этой последовательности.
Номера утерянных байт известны.
Слышал, такие алгоритмы есть, в гугле невнятные описания.

Задача крайне практическая, если кому интересно

надежное хранение данных на ненадежных носителях floppy cdrom

Код:
[size=85]Файл разделяется на отрезки одинаковой длинны L.
Каждый байт каждого отрезка сумируется с соответствующими байтами всех отрезков и записывается в слово.
Получается последовательность из L слов. В случае, если при востановление файла не удалось
прочитать один из отрезков, то его легко восстановить, вычитая из сохраненной последовательности
слов сумму байт других отрезков, не считая байты потерянного отрезка.
Во времена дискет, эта штука меня очень выручала. Но простое суммирование работает только для
одного потеряного отрезка, а хотелось бы на хотя бы на два[/size].


Помогите, надо срочно освободить диск, не хватает места для mingw и qt о которой
здесь говорилось.

_________________
Линукс решает, винда глотает.


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

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


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

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


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

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