Здравствуйте, Gaperton, Вы писали:
G>Здравствуйте, sergesokolov, Вы писали:
G>>>Кстати, приглашаю поиграть в "пятнашки". Помоги мне, попробуй улучшить дизайн. Принципы дизайна, которые надо сохранить — очень простые: если ты посмотришь внимательно на код, то ты обратишь внимание, что модули не знают про структуры данных друг друга — между ними ходят либо абстрактные, либо очень простые типы данных. Предлагается это свойство сохранить, и попытаться уменьшить связность.
S>>Поставив себя сразу в очень удобное от критики положение, тем что я здесь алгоритмами не занимаюсь, а только дизайном, G по сути дела прыгнул с головой в смоляную яму – отличная позиция. Полностью конечно отрешиться от алгоритмов не удалось, появилась какая-то жуткая мистика про живые процессы, которые должны быть мало связанны и не должны что знать друг про друга, а в следующем мастер классе можно будет сказать, что они наоборот теперь жестко связанны и все друг про друга знают. Конечно от геморроя это никак не избавит, а напротив усугубит еще в большей степени чем раньше. Это я могу гарантировать. S>>Поэтому еще так слаба пояснительная часть написанная псевдокодами, а чего пояснять –то? S>>Чистописание кода понравилось, я так не умею. Но сам язык беден.
G>Симметричный ответ: Вы, любезный, поставили себя в очень удобное для критики положение. По сути — вы нырнули с головой просто в яму какую-то с чем-то, не скажу с чем. Сами посудите — чистый код вы писать не умеете, проблем дизайна не понимаете, понятие "связности" для вас мистика. И единственное, что вы можете гарантировать — это геморрой. Прям хоть в резюме включай .
G>Несимметричный ответ: Короче, в этом топике обсуждается проблема и подходы к дизайну для ФЯ. Не мое чистописание, не бедность языков, не алгоритмы (алгоритмы в этой задаче тривиальны — не о чем тут говорить). На примере простой задачи. По существу вопроса есть что сказать? Считаешь, что само понятие дизайна в контексте ФП — глупость? Да ради бога — раскрой тему, с тобой поговорят. Может быть. А вые..ся и переходить на личности здесь не надо.
Если Вы обиделись на Яму так это не я выдумал, а это классический труд http://webkomora.com.ua/ru/articles/web/management/man-month/18.html
вы конечно же его читали, но сгоряча не смогли вспомнить.
Экзамен я у Вас сдавать не собираюсь, потому что семь лет назад создал лучшее в мире решение ввода Пирамидальную Клавиатуру ни японцы ни штитники пока еще ничего не могут этому противополстивить. Я думаю вы тоже когда нибудь что-нибудь сможете, если только будете к себе достаточно критично.
програмирование каждомы нужно для решение своих нужд. Моя цель сейсас создать семантику распознания жеста, Марковские модели для этого не очень годятся, впрочем если у вас другое мнение на эту тему выслушаю с большим удовольствием любую конструктивную критику.
с Огромным уважением
Т>Это, конечно, плохо – нельзя исключить перевычислений и к тому же ни разу не идиоматически.
Поговорил с potan-ом, он развил и эту мысль. Можно строить весь дизайн на closures, делая на них иммутабельные объекты, как делают в scheme. Собственно, не фокус, это давно известный трюк, мы его обсуждали тут год-два назад. Скажем, можно передавать в expression вот такую штуку:
Вот так. Такой вот дизайн-паттерн. Я не говорю, что так делать надо в данном случае — но это просто прикольный паттерн, так сказать, про который не надо забывать, что так можно.
Как по разному оказывается можно-то. Короче — поле для деятельности большое. У меня, к сожалению, время не скоро появится — кому-нибудь кроме меня интересно сделать "идеоматический" дизайн на closures-ах? Посмотреть хочется, что получится.
Здравствуйте, sergesokolov, Вы писали:
S>програмирование каждомы нужно для решение своих нужд. Моя цель сейсас создать семантику распознания жеста, Марковские модели для этого не очень годятся, впрочем если у вас другое мнение на эту тему выслушаю с большим удовольствием любую конструктивную критику.
Должен вас разочаровать — мне совершенно не интересна эта тема. Я вам настоятельно рекомендую удовлетворять свои нужды в специально отведенных для этого местах, а не в профильных профессиональных форумах. Для замеров пиписьками, самоутверждения, наездов, и переливания из пустого в порожнее есть "священные войны". Для создания пирамидальных клавиатур — "коллеги улыбнитесь".
Здравствуйте, sergesokolov, Вы писали:
C>>Так ведь все просто: предложи лучшее решение S>решение чего?
Этот тред — о решении некоторой задачи (см. в первое сообщение).
S>мистических вещей, тут одна словестная ловушка в той терминологии которую выдумавает G. S>Бьен Страуструп тоже был в определенной степени мистик со скрытием данных, но у него была четкая цель, которой здесь сознательно нет.
С этим в флеймовые форумы, пожалуйста.
Здравствуйте, Gaperton, Вы писали:
G>Здравствуйте, sergesokolov, Вы писали:
S>>програмирование каждомы нужно для решение своих нужд. Моя цель сейсас создать семантику распознания жеста, Марковские модели для этого не очень годятся, впрочем если у вас другое мнение на эту тему выслушаю с большим удовольствием любую конструктивную критику.
G>Должен вас разочаровать — мне совершенно не интересна эта тема. Я вам настоятельно рекомендую удовлетворять свои нужды в специально отведенных для этого местах, а не в профильных профессиональных форумах. Для замеров пиписьками, самоутверждения, наездов, и переливания из пустого в порожнее есть "священные войны". Для создания пирамидальных клавиатур — "коллеги улыбнитесь".
конечно не все на rsdn такие как этот самоуверенный осел
Здравствуйте, Gaperton, Вы писали:
G>Как по разному оказывается можно-то. Короче — поле для деятельности большое. У меня, к сожалению, время не скоро появится — кому-нибудь кроме меня интересно сделать "идеоматический" дизайн на closures-ах? Посмотреть хочется, что получится.
Я попробую — даже самому интересно стало
Здравствуйте, sergesokolov, Вы писали:
G>>Должен вас разочаровать — мне совершенно не интересна эта тема. Я вам настоятельно рекомендую удовлетворять свои нужды в специально отведенных для этого местах, а не в профильных профессиональных форумах. Для замеров пиписьками, самоутверждения, наездов, и переливания из пустого в порожнее есть "священные войны". Для создания пирамидальных клавиатур — "коллеги улыбнитесь". S>конечно не все на rsdn такие как этот самоуверенный осел
Тут недавно Gaperton подрался с примерно таким же персонажем на форуме "Менеджмент и управление проектами". Было очень интересно наблюдать — за персонажем. Чувствую, что в этот раз будет еще веселее
Здравствуйте, sergesokolov, Вы писали:
G>>Должен вас разочаровать — мне совершенно не интересна эта тема. Я вам настоятельно рекомендую удовлетворять свои нужды в специально отведенных для этого местах, а не в профильных профессиональных форумах. Для замеров пиписьками, самоутверждения, наездов, и переливания из пустого в порожнее есть "священные войны". Для создания пирамидальных клавиатур — "коллеги улыбнитесь". S>конечно не все на rsdn такие как этот самоуверенный осел
Ой, смотрите-ка, мы обиделись. Чего ты ждал, интересно, в ответ на свои хамские выходки и оффтоп?
Здравствуйте, Cyberax, Вы писали:
C>Тут недавно Gaperton подрался с примерно таким же персонажем на форуме "Менеджмент и управление проектами". Было очень интересно наблюдать — за персонажем. Чувствую, что в этот раз будет еще веселее
Не, не будет. Я не буду отвечать.
А персонаж реально похож. В тот раз, кстати, сначала не забанили никого, потому что типа пришлось бы банить всех сразу — поэтому просто удалили ветку и сказали "мальчики не деритесь". После чего тот персонаж обрадовался и немедленно потребовал от всей конфы извинений — этого уже было малехо через край, и на волне народного гнева награда нашла своего героя .
Здравствуйте, Gaperton, Вы писали:
G>Здравствуйте, sergesokolov, Вы писали:
G>>>Должен вас разочаровать — мне совершенно не интересна эта тема. Я вам настоятельно рекомендую удовлетворять свои нужды в специально отведенных для этого местах, а не в профильных профессиональных форумах. Для замеров пиписьками, самоутверждения, наездов, и переливания из пустого в порожнее есть "священные войны". Для создания пирамидальных клавиатур — "коллеги улыбнитесь". S>>конечно не все на rsdn такие как этот самоуверенный осел
G>Ой, смотрите-ка, мы обиделись. Чего ты ждал, интересно, в ответ на свои хамские выходки и оффтоп?
Да я извиняюсь. Мне кстати в вашей работе многое нравится, есть чему поучиться и конечно вам надо ее продолжать. То что сказал не берите близко, тем более, что вы мне ответили и я не в обиде. Последняя фраза была конечно лишней, сказал в запальчивости. Из разговора вышел, что бы не делать удовольствия Cyberax . Придется бедняге сегодня пускать сопли счастья по другому поводу.
R>Чтобы не перевычислять одно и тоже по нескольку раз.
Не "наверное лучше", а "единственно правильно". Оно не будет перевычислять, а просто сломается. Я перепутал порядок, в котором topsort возвращет значения.
Просто занятное наблюдение.
Посмотрел решения, которые опубликовал thesz. Все аккуратно обрабатывают деление на ноль, и никто нипарицца с переполнением.
Допустим, на языках с бесконечными целыми это неактуально. Но сам thesz использует Int, а не Integer.
R>>Чтобы не перевычислять одно и тоже по нескольку раз.
Т>Не "наверное лучше", а "единственно правильно". Оно не будет перевычислять, а просто сломается. Я перепутал порядок, в котором topsort возвращет значения.
Угу. Я пропустил эту ошибку, потому что предположил, что невычисленные элементы Context, могут быть довычислены в expression:evaluate(), не заметив, что sheet() не передаётся в cell:evaluate(). То есть sheet:evaluate() при таком дизайне становится ключевым элементом, трогать который руками очень не рекомендуется.
Здравствуйте, red75, Вы писали:
Т>>Не "наверное лучше", а "единственно правильно". Оно не будет перевычислять, а просто сломается. Я перепутал порядок, в котором topsort возвращет значения.
R>Угу. Я пропустил эту ошибку, потому что предположил, что невычисленные элементы Context, могут быть довычислены в expression:evaluate(), не заметив, что sheet() не передаётся в cell:evaluate(). То есть sheet:evaluate() при таком дизайне становится ключевым элементом, трогать который руками очень не рекомендуется.
Я пришел к выводу, что изначальный дизайн — говно. Я сейчас работаю над новым, с учетом предложений и замечаний твоих, Трурля, Potan-a, и своих собственных. Что это за функциональный дизайн, в котором для инкапсуляции не применяются замыкания? Это какая-то калька с С++/Java/C#, а не дизайн.
Вот сейчас добавим в нужные места замыкания, пробросим где надо exceptions, да воспользуемся подходом Трурля с раздельным запросом зависимостей... Вот тогда посмотрим.
Здравствуйте, Gaperton, Вы писали:
G>Вот сейчас добавим в нужные места замыкания, пробросим где надо exceptions, да воспользуемся подходом Трурля с раздельным запросом зависимостей... Вот тогда посмотрим.
Что-то мне эти зависимости не очень нравятся... А, вот: функция таблицы "=get(Cell)" должна возвращать значение ячейки, указанной в строке/ячейке Cell. Через зависимости не выражается.
Здравствуйте, red75, Вы писали:
R>Здравствуйте, Gaperton, Вы писали:
G>>Вот сейчас добавим в нужные места замыкания, пробросим где надо exceptions, да воспользуемся подходом Трурля с раздельным запросом зависимостей... Вот тогда посмотрим.
R>Что-то мне эти зависимости не очень нравятся... А, вот: функция таблицы "=get(Cell)" должна возвращать значение ячейки, указанной в строке/ячейке Cell. Через зависимости не выражается.
Здравствуйте, Gaperton, Вы писали:
R>>Что-то мне эти зависимости не очень нравятся... А, вот: функция таблицы "=get(Cell)" должна возвращать значение ячейки, указанной в строке/ячейке Cell. Через зависимости не выражается.
G>Пардон, а что такое в данном случае Cell?
Здравствуйте, red75, Вы писали:
R>Здравствуйте, Gaperton, Вы писали:
R>>>Что-то мне эти зависимости не очень нравятся... А, вот: функция таблицы "=get(Cell)" должна возвращать значение ячейки, указанной в строке/ячейке Cell. Через зависимости не выражается.
G>>Пардон, а что такое в данном случае Cell?
R>Строка или ячейка. Пример таблицы: R>
R> a b
R>1 'b1 'No ref
R>2 =get("a1") =get(a1)
R>
R>Вычисленная таблица R>
R> a b
R>1 b1 b2
R>2 b1 No ref
R>
Понятно. А зачем такая во всех смыслах вредная штука нужна? У меня только-только красиво начало получаться. Зацени:
Проблема с рефом:
-module( ref ).
-export( create/1, create/2, row_range/3 ).
%% create( integer(), integer() ) -> ref().
create( Row, Col ) -> { Row, Col }.
%% create( string() ) -> ref() | throws value:error().
create( [ Row, Col ] ) when Row >= $a, Row =< $z, Col >= $0, Col =< $9 ->
{ Row - $a + 1, Col - $0 };
create( _ ) -> value:throw_error( 'invalid ref' ).
%% row_range( Row, From, To ) -> [ ref() ]
%% Row = From = To = integer()
row_range( Row, From, To ) -> [ ref( Row, Col ) || Col <- lists:seq( From, To ) ].
Проблема с value:
-module( value ).
-compile( export_all ).
%% Public data type
%% value() = integer() | string() | error() | empty.
create( [ $', String ] ) -> String;
create( [ $#, String ] ) -> error( list_to_atom( String ) );
create( "" ) -> empty;
create( Int ) -> catch integer( Int ).
%% to_string( value() ) -> string().
%% get text representation for the given cell value
as_string( Int ) when is_integer( Int ) -> integer_to_list( Int );
as_string( { error, Msg } ) -> "#" ++ atom_to_list( Msg );
as_string( empty ) -> "";
as_string( String ) is_list( String ) -> String.
%% error( atom() ) -> error() = { error, Code }
error( Code ) when is_atom( Code ) -> { error, Code }.
throw_error( Msg ) when is_atom( Msg ) -> throw( error( Msg ) ).
%% integer( String ) -> integer() | throw error()
integer( String ) ->
case string:to_integer( T ) of
{ Int, [] } -> Int;
{ error, no_integer } -> throw_error( 'not a number' ).
end.
as_integer( empty ) -> 0;
as_integer( Int ) when is_integer( Int ) -> Int;
as_integer( _ ) -> throw_error( 'not a number' ).
А теперь — внимание: операция.
-module( operation ).
-export( [ tokens/0, create/1 ] ).
%% create( char() ) -> Operation
%% Operation = fun( value(), value() ) -> value() | throws error()
%% create binary operator...
create( $+ ) -> fun add/2;
create( $- ) -> fun sub/2;
create( $* ) -> fun mult/2;
create( $/ ) -> fun divd/2.
%% tokens() -> [ char() ].
%% binary operators' token list...
tokens() -> "+-*/".
%% Binary operations implementation...
%%______________________________________
add( X, Y ) when is_list( X ), is_list( Y ) -> X ++ Y;
add( X, Y ) -> value:as_number( X ) + value:as_number( Y ).
mult( X, Y ) -> value:as_number( X ) * value:as_number( Y ).
sub( X, Y ) -> value:as_number( X ) - value:as_number( Y ).
divd( X, Y ) ->
X_1 = value:as_number( X ),
Y_1 = case value:as_number( Y ) of
0 -> value:throw_error( 'division by zero' );
Y -> Y
end,
X_1 / Y_1.
Здравствуйте, red75, Вы писали:
R>Что-то мне эти зависимости не очень нравятся...
Ну, мне тоже не совсем.
R>А, вот: функция таблицы "=get(Cell)" должна возвращать значение ячейки, указанной в строке/ячейке Cell. Через зависимости не выражается.
А если представить что будет делать функция "=put(Cell;Value)"...