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

13 messages Options
Embed this post
Permalink
Алексей Царегородцев

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

Reply Threaded More More options
Print post
Permalink
Доброго времени суток!

  Вот ещё возник вопрос по готовым библиотекам...
  Делал ли кто-нибудь аналог 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
Dmitry Yakimov-2

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

Reply Threaded More More options
Print post
Permalink
Привет,

я делал - ~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
Nicholas Nemtsev-2

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

Reply Threaded More More options
Print post
Permalink
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
Dmitry Yakimov-2

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

Reply Threaded More More options
Print post
Permalink
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
azekeprofit

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

Reply Threaded More More options
Print post
Permalink
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
Andrey Cherezov

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

Reply Threaded More More options
Print post
Permalink
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
Алексей Царегородцев

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

Reply Threaded More More options
Print post
Permalink
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
Алексей Царегородцев

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

Reply Threaded More More options
Print post
Permalink
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
Алексей Царегородцев

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

Reply Threaded More More options
Print post
Permalink
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
azekeprofit

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

Reply Threaded More More options
Print post
Permalink
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
Andrey Cherezov

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

Reply Threaded More More options
Print post
Permalink
In reply to this post by Алексей Царегородцев
Some javascript/style in this post has been disabled (why?)
Добрый день, Алексей Царегородцев!

Ваше сообщение от 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
Алексей Царегородцев

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

Reply Threaded More More options
Print post
Permalink
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
Алексей Царегородцев

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

Reply Threaded More More options
Print post
Permalink
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