Её вопрос про библиотеки... аналог try ... finally?

classic Classic list List threaded Threaded
13 messages Options
Reply | Threaded
Open this post in threaded view
|

Её вопрос про библиотеки... аналог try ... finally?

Алексей Царегородцев
Доброго времени суток!

  Вот ещё возник вопрос по готовым библиотекам...
  Делал ли кто-нибудь аналог TRY-FINALLY блока из Java или Delphi?
  Кто не знает что такое - краткий пример на подобии Паскаля:

  // Инициализируем переменную
  ObjectA := TObjectA.Create();

  try
    // Делаем здесь что-то много и потенциально кидающее исключение
  finally
    // Этот код выполнится гарантированно
    ObjectA.Free;
  end;

  В общем, была бы полезной такая штука, имхо...

  Конечно, можно сделать как CATCH с вынесением в отдельное слово, но
сильно не хочется пложить сущности без надобности - со всеми локальными
переменными и т.п. :(

--
Алексей Царегородцев.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Её вопрос про библиотеки... аналог try ... finally?

Dmitry Yakimov-2
Привет,

я делал - ~day\lib\try.f

finally нет, но она заменяется на IF ... THEN после TRAP.

Алексей Царегородцев wrote:

> Доброго времени суток!
>
>   Вот ещё возник вопрос по готовым библиотекам...
>   Делал ли кто-нибудь аналог TRY-FINALLY блока из Java или Delphi?
>   Кто не знает что такое - краткий пример на подобии Паскаля:
>
>   // Инициализируем переменную
>   ObjectA := TObjectA.Create();
>
>   try
>     // Делаем здесь что-то много и потенциально кидающее исключение
>   finally
>     // Этот код выполнится гарантированно
>     ObjectA.Free;
>   end;
>
>   В общем, была бы полезной такая штука, имхо...
>
>   Конечно, можно сделать как CATCH с вынесением в отдельное слово, но
> сильно не хочется пложить сущности без надобности - со всеми локальными
> переменными и т.п. :(
>
> --
>  
Dmitry.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Её вопрос про библиотеки... аналог try ... finally?

Nicholas Nemtsev-2
In reply to this post by Алексей Царегородцев
Алексей Царегородцев пишет:
>   Вот ещё возник вопрос по готовым библиотекам...
>   Делал ли кто-нибудь аналог TRY-FINALLY блока из Java или Delphi?
>   Кто не знает что такое - краткий пример на подобии Паскаля:
Я пользуюсь такой конструкцией:
[NONAME
  ...
NONAME] CATCH ...




: [NONAME
     ?COMP HERE BRANCH, >MARK 1
     HERE
; IMMEDIATE

: NONAME]
     ?COMP RET,
     >R >RESOLVE
     R> POSTPONE LITERAL
; IMMEDIATE

DECIMAL
{{ vocLocalsSupport
     WARNING @ WARNING 0!
     : [NONAME    POSTPONE [NONAME  [  11 CELLS ] LITERAL  uAddDepth +!
;; IMMEDIATE
     : NONAME]    POSTPONE NONAME]  [ -11 CELLS ] LITERAL  uAddDepth +!
;; IMMEDIATE
     WARNING !
}}

То, что находится между {{ }} зависит от реализации локальных
переменных. В SPF 3.75 работать будет.

--
Best regards,       | [hidden email]
    Nicholas         | http://www.nncron.ru/

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Её вопрос про библиотеки... аналог try ... finally?

Dmitry Yakimov-2
In reply to this post by Алексей Царегородцев
Привет,

я делал - ~day\lib\try.f

finally нет, но она заменяется на IF ... THEN после TRAP.

Алексей Царегородцев wrote:

> Доброго времени суток!
>
>   Вот ещё возник вопрос по готовым библиотекам...
>   Делал ли кто-нибудь аналог TRY-FINALLY блока из Java или Delphi?
>   Кто не знает что такое - краткий пример на подобии Паскаля:
>
>   // Инициализируем переменную
>   ObjectA := TObjectA.Create();
>
>   try
>     // Делаем здесь что-то много и потенциально кидающее исключение
>   finally
>     // Этот код выполнится гарантированно
>     ObjectA.Free;
>   end;
>
>   В общем, была бы полезной такая штука, имхо...
>
>   Конечно, можно сделать как CATCH с вынесением в отдельное слово, но
> сильно не хочется пложить сущности без надобности - со всеми локальными
> переменными и т.п. :(
>
> --
>  
Dmitry.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Её вопрос про библиотеки... аналог try ... finally?

azekeprofit
Administrator
In reply to this post by Алексей Царегородцев
>   Вот ещё возник вопрос по готовым библиотекам...
>   Делал ли кто-нибудь аналог TRY-FINALLY блока из Java или Delphi?

~ss\lib\except\try.f

И пример:

~ss\lib\except\try-example.f
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Её вопрос про библиотеки... аналог try ... finally?

Andrey Cherezov
In reply to this post by Алексей Царегородцев
Добрый день, Алексей Царегородцев!

Ваше сообщение от 18.10.2007 12:06:
>   Конечно, можно сделать как CATCH с вынесением в отдельное слово,
Хороший форт-стиль предполагает именно это. В DSSP пошли еще дальше - там
даже части if и then выносят в отдельные слова :)
>  но
> сильно не хочется пложить сущности без надобности - со всеми локальными
> переменными и т.п. :(
>  
В данном случае это не зазорно. И не без надобности: позволяет лучше
отладить
тот участок кода, в котором ловишь исключения. Да и нужда в локальных
переменных
сильно уменьшится, если привыкнешь писать более короткие слова
(предложения точнее :).
И за счет "вынужденного" присвоения имени выделенной части код
становится намного
читабельнее.

И, если уж снова зашла речь об Occam's razor, то нужно помнить контекст
высказывания.
Он критиковал многословие и сложность. Т.е. тот сишный стиль, который ты
пытаешься
сохранить. Фортовскую простоту, краткость и ясность он бы похвалил :) И
в движении к
простоте первый шаг - это как раз минимизация размера определений. Даже
если слово
используется всего один раз.

Мне можно возразить, что сам я часто пишу достаточно длинные функции.
Считайте это сыростью кода первых версий или наоборот наростами длительного
сопровождения (когда сверху лепятся патчи вместо рефакторинга). Такого
кода я стыжусь ;)
В зрелых либах и в самом ядре SPF мой код достаточно краток.
Ну, по крайней мере выделить отдельное слово для CATCH я точно не ленюсь :)


-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Её вопрос про библиотеки... аналог try ... finally?

Алексей Царегородцев
In reply to this post by Dmitry Yakimov-2
Доброго времени суток!

> я делал - ~day\lib\try.f
>
> finally нет, но она заменяется на IF ... THEN после TRAP.

Спасибо, вполне подойдёт.

--
Алексей Царегородцев.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Её вопрос про библиотеки... аналог try ... finally?

Алексей Царегородцев
In reply to this post by azekeprofit
Доброго времени суток!

> ~ss\lib\except\try.f
>
> И пример:
>
> ~ss\lib\except\try-example.f

Хм... недавно залили? В моей копии дистрибутива нету...

--
Алексей Царегородцев.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Её вопрос про библиотеки... аналог try ... finally?

Алексей Царегородцев
In reply to this post by Andrey Cherezov
Доброго времени суток!

> Хороший форт-стиль предполагает именно это. В DSSP пошли еще дальше -
> там
> даже части if и then выносят в отдельные слова :)

Интересно - какие имена им присваиваются?

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

Она и так не велика... Но всё-таки локальные переменные позволяют
сократить зависимость между словами. А каждое слово, имхо, должно
выражать что-то конкретное, а не "половина присваивания + пол чего-то".
Вот то слово, которое мне надо переписать "по путю":

\ Развернуть тело определения
: expand-macro ( a-addr -- )
  { | buf mem pos }

  \ Выделяем память для буфера и макроса
  /buffer ALLOCATE THROW TO buf
  /memory ALLOCATE ?DUP 0<>  IF
  buf FREE THROW THROW       THEN
  DUP TO mem TO pos

  \ Трансляция тела макроса
  DUP CELL+ SWAP @ 0 ?DO
    next-line
    buf >buffer expand-line
    pos >memory TO pos
  LOOP DROP

  \ Дописываем 0-терминатор и освобождаем строку
  0 pos C!
  buf FREE THROW

  mem
;

Я и так уже сделал из одного слова три (это правильнее с точки зрения
идеологии Форта, но на практике, скорее, потребует группировки этих трёх
слов в одно :) ). Но вот то что осталось - оно выражает вполне ясную и
конкретную вещь. Я могу вынести центральную часть слова в отдельное
слово, но как его назвать? К тому же - если использовать технику с CATCH
- мне всё равно придётся сделать три слова. Будет дурдом типа:

: развернуть-макрос-на-самом-деле ... ;

: выделить-память-под-буфер-строки-и-развернуть-макрос ... ;

: выделить-память-под-развёрнутый-макрос-и-развернуть-макрос ... ;

: развернуть-макрос .... ;

> И за счет "вынужденного" присвоения имени выделенной части код
> становится намного
> читабельнее.

Вспоминается "Имя сестра! Имя!". :) Читабельность меня и беспокоит,
вообще-то. :(

> Т.е. тот сишный стиль, который ты
> пытаешься
> сохранить.

В С-ях бы это выглядело совсем по другому... Хотя общая стркутура,
конечно, была та же самая.

> если слово
> используется всего один раз.

У меня там уже и так N слов, которые используются один раз. :(

--
Алексей Царегородцев.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Её вопрос про библиотеки... аналог try ... finally?

azekeprofit
Administrator
In reply to this post by Алексей Царегородцев
Алексей Царегородцев wrote
Доброго времени суток!

> ~ss\lib\except\try.f
>
> И пример:
>
> ~ss\lib\except\try-example.f

Хм... недавно залили? В моей копии дистрибутива нету...
Относительно недавно:

http://forth.org.ru/~ss/lib/except/try.f
http://forth.org.ru/~ss/lib/except/try-example.f
Reply | Threaded
Open this post in threaded view
|

Re: Её вопрос про библиотеки... аналог try ... finally?

Andrey Cherezov
In reply to this post by Алексей Царегородцев
Добрый день, Алексей Царегородцев!

Ваше сообщение от 19.10.2007 6:36:
даже части if и then выносят в отдельные слова :)
    
Интересно - какие имена им присваиваются?
  
Не знаю / не помню. DSSP - это не совсем форт. И у меня не было повода его
использовать на практике. Где-то есть у нас на сайте, можно посмотреть.
Она и так не велика... Но всё-таки локальные переменные позволяют 
сократить зависимость между словами. А каждое слово, имхо, должно 
выражать что-то конкретное, а не "половина присваивания + пол чего-то". 
Вот то слово, которое мне надо переписать "по путю":

\ Развернуть тело определения
: expand-macro ( a-addr -- )
  { | buf mem pos }

  \ Выделяем память для буфера и макроса
  /buffer ALLOCATE THROW TO buf
  /memory ALLOCATE ?DUP 0<>  IF
  buf FREE THROW THROW       THEN
  DUP TO mem TO pos

  \ Трансляция тела макроса
  DUP CELL+ SWAP @ 0 ?DO
    next-line
    buf >buffer expand-line
    pos >memory TO pos
  LOOP DROP

  \ Дописываем 0-терминатор и освобождаем строку
  0 pos C!
  buf FREE THROW

  mem
;
  
Да, выделение памяти и её освобождение лучше, конечно, оставить в одном слове.
А вот серединка слова очень просится на выделение:
: Трансляция_тела_макроса { buf pos -- }
  DUP CELL+ SWAP @ 0 ?DO
    next-line
    buf >buffer expand-line
    pos >memory TO pos
  LOOP DROP
;

: expand-macro ( a-addr -- )
  { | buf mem pos }

  /buffer ALLOCATE THROW TO buf
  /memory ALLOCATE ?DUP 0<>  IF
  buf FREE THROW THROW       THEN
  DUP TO mem TO pos

  buf pos ['] Трансляция_тела_макроса CATCH ...

  0 pos C!
  buf FREE THROW

  mem
;
Обрати внимание, комментарий стал именем слова - это тебе
ответ на "имя сестра, имя". А все остальные комментарии были
вообще бесполезны, т.к. являются дословным переводом ALLOCATE/FREE.
В комментарии нужно писать почему и для чего, если это не
очевидно (по именам!), а не дублировать код.
Будет дурдом типа:
: выделить-память-под-развёрнутый-макрос-и-развернуть-макрос ... ;
  
Это действительно дурдом по вышеописанной причине.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Её вопрос про библиотеки... аналог try ... finally?

Алексей Царегородцев
In reply to this post by azekeprofit
Доброго времени суток!

> Относительно недавно:
>
> http://forth.org.ru/~ss/lib/except/try.f
> http://forth.org.ru/~ss/lib/except/try-example.f

Спасибо, гляну вечером...
--
Алексей Царегородцев.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Её вопрос про библиотеки... аналог try ... finally?

Алексей Царегородцев
In reply to this post by Andrey Cherezov
Доброго времени суток!

> Обрати внимание, комментарий стал именем слова - это тебе
> ответ на "имя сестра, имя". А все остальные комментарии были
> вообще бесполезны, т.к. являются дословным переводом ALLOCATE/FREE.
> В комментарии нужно писать почему и для чего, если это не
> очевидно (по именам!), а не дублировать код.

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

Интересно бы было как-то обойтись без локальных переменных...
Естественно, без пляски на стеке. :)

--
Алексей Царегородцев.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev