Re[5]: Код expression, sheet, cell: задачка
От: sergesokolov Россия http://www.ideashag.spb.ru
Дата: 08.11.07 11:07
Оценка: :))
Здравствуйте, Gaperton, Вы писали:

G>Здравствуйте, sergesokolov, Вы писали:


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


S>>Поставив себя сразу в очень удобное от критики положение, тем что я здесь алгоритмами не занимаюсь, а только дизайном, G по сути дела прыгнул с головой в смоляную яму – отличная позиция. Полностью конечно отрешиться от алгоритмов не удалось, появилась какая-то жуткая мистика про живые процессы, которые должны быть мало связанны и не должны что знать друг про друга, а в следующем мастер классе можно будет сказать, что они наоборот теперь жестко связанны и все друг про друга знают. Конечно от геморроя это никак не избавит, а напротив усугубит еще в большей степени чем раньше. Это я могу гарантировать.

S>>Поэтому еще так слаба пояснительная часть написанная псевдокодами, а чего пояснять –то?
S>>Чистописание кода понравилось, я так не умею. Но сам язык беден.

G>Симметричный ответ: Вы, любезный, поставили себя в очень удобное для критики положение. По сути — вы нырнули с головой просто в яму какую-то с чем-то, не скажу с чем. Сами посудите — чистый код вы писать не умеете, проблем дизайна не понимаете, понятие "связности" для вас мистика. И единственное, что вы можете гарантировать — это геморрой. Прям хоть в резюме включай .


G>Несимметричный ответ: Короче, в этом топике обсуждается проблема и подходы к дизайну для ФЯ. Не мое чистописание, не бедность языков, не алгоритмы (алгоритмы в этой задаче тривиальны — не о чем тут говорить). На примере простой задачи. По существу вопроса есть что сказать? Считаешь, что само понятие дизайна в контексте ФП — глупость? Да ради бога — раскрой тему, с тобой поговорят. Может быть. А вые..ся и переходить на личности здесь не надо.


Если Вы обиделись на Яму так это не я выдумал, а это классический труд
http://webkomora.com.ua/ru/articles/web/management/man-month/18.html
вы конечно же его читали, но сгоряча не смогли вспомнить.
Экзамен я у Вас сдавать не собираюсь, потому что семь лет назад создал лучшее в мире решение ввода Пирамидальную Клавиатуру ни японцы ни штитники пока еще ничего не могут этому противополстивить. Я думаю вы тоже когда нибудь что-нибудь сможете, если только будете к себе достаточно критично.
програмирование каждомы нужно для решение своих нужд. Моя цель сейсас создать семантику распознания жеста, Марковские модели для этого не очень годятся, впрочем если у вас другое мнение на эту тему выслушаю с большим удовольствием любую конструктивную критику.
с Огромным уважением
Re[4]: Еще один паттерн проектирования.
От: Gaperton http://gaperton.livejournal.com
Дата: 08.11.07 11:41
Оценка:
Здравствуйте, Трурль, Вы писали:

Т>Каюсь, первая мысль была передавать в expression:evaluate функцию-разыменователь

Т>
Т>evaluate(expression(), Ref->Value ) -> Value.
Т>

Т>Это, конечно, плохо – нельзя исключить перевычислений и к тому же ни разу не идиоматически.

Поговорил с potan-ом, он развил и эту мысль. Можно строить весь дизайн на closures, делая на них иммутабельные объекты, как делают в scheme. Собственно, не фокус, это давно известный трюк, мы его обсуждали тут год-два назад. Скажем, можно передавать в expression вот такую штуку:

sheet_obj( Sheet ) -> fun
   ( get, Ref ] ) ->
       get_cell( Ref, Sheet );
   ( set, { Ref, Value } ) ->
       sheet_obj( set_cell( Ref, Value, Sheet ) );
   ( return, _ ) ->
       Sheet
end.

И тогда

%% evaluate( Ref, Expression, Sheet ) -> { Value, UpdatedSheet }.
%% evaluate expression...
evaluate( _, updating, Sheet ) -> { { error, '#cycle' }, Sheet };
evaluate( Ref, Expr, Sheet ) ->
    Sheet_1 = Sheet( set, { Ref, updating } ),
    { Value, Sheet_2 } = evaluate( Expr, Sheet_1 ),
    { Value, Sheet( set, { Ref, Value } ) }.


Вот так. Такой вот дизайн-паттерн. Я не говорю, что так делать надо в данном случае — но это просто прикольный паттерн, так сказать, про который не надо забывать, что так можно.

Как по разному оказывается можно-то. Короче — поле для деятельности большое. У меня, к сожалению, время не скоро появится — кому-нибудь кроме меня интересно сделать "идеоматический" дизайн на closures-ах? Посмотреть хочется, что получится.
Re[6]: Код expression, sheet, cell: задачка
От: Gaperton http://gaperton.livejournal.com
Дата: 08.11.07 12:09
Оценка:
Здравствуйте, sergesokolov, Вы писали:

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


Должен вас разочаровать — мне совершенно не интересна эта тема. Я вам настоятельно рекомендую удовлетворять свои нужды в специально отведенных для этого местах, а не в профильных профессиональных форумах. Для замеров пиписьками, самоутверждения, наездов, и переливания из пустого в порожнее есть "священные войны". Для создания пирамидальных клавиатур — "коллеги улыбнитесь".
Re[6]: Код expression, sheet, cell: задачка
От: Cyberax Марс  
Дата: 08.11.07 12:15
Оценка:
Здравствуйте, sergesokolov, Вы писали:

C>>Так ведь все просто: предложи лучшее решение

S>решение чего?
Этот тред — о решении некоторой задачи (см. в первое сообщение).

S>мистических вещей, тут одна словестная ловушка в той терминологии которую выдумавает G.

S>Бьен Страуструп тоже был в определенной степени мистик со скрытием данных, но у него была четкая цель, которой здесь сознательно нет.
С этим в флеймовые форумы, пожалуйста.
Sapienti sat!
Re[7]: Код expression, sheet, cell: задачка
От: sergesokolov Россия http://www.ideashag.spb.ru
Дата: 08.11.07 12:19
Оценка: -3
Здравствуйте, Gaperton, Вы писали:

G>Здравствуйте, sergesokolov, Вы писали:


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


G>Должен вас разочаровать — мне совершенно не интересна эта тема. Я вам настоятельно рекомендую удовлетворять свои нужды в специально отведенных для этого местах, а не в профильных профессиональных форумах. Для замеров пиписьками, самоутверждения, наездов, и переливания из пустого в порожнее есть "священные войны". Для создания пирамидальных клавиатур — "коллеги улыбнитесь".

конечно не все на rsdn такие как этот самоуверенный осел
Re[5]: Еще один паттерн проектирования.
От: Cyberax Марс  
Дата: 08.11.07 12:22
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Как по разному оказывается можно-то. Короче — поле для деятельности большое. У меня, к сожалению, время не скоро появится — кому-нибудь кроме меня интересно сделать "идеоматический" дизайн на closures-ах? Посмотреть хочется, что получится.

Я попробую — даже самому интересно стало
Sapienti sat!
Re[8]: Код expression, sheet, cell: задачка
От: Cyberax Марс  
Дата: 08.11.07 13:04
Оценка:
Здравствуйте, sergesokolov, Вы писали:

G>>Должен вас разочаровать — мне совершенно не интересна эта тема. Я вам настоятельно рекомендую удовлетворять свои нужды в специально отведенных для этого местах, а не в профильных профессиональных форумах. Для замеров пиписьками, самоутверждения, наездов, и переливания из пустого в порожнее есть "священные войны". Для создания пирамидальных клавиатур — "коллеги улыбнитесь".

S>конечно не все на rsdn такие как этот самоуверенный осел
Тут недавно Gaperton подрался с примерно таким же персонажем на форуме "Менеджмент и управление проектами". Было очень интересно наблюдать — за персонажем. Чувствую, что в этот раз будет еще веселее

2Модератор: эту ветку пора в СВ, ИМХО.
Sapienti sat!
Re[8]: Код expression, sheet, cell: задачка
От: Gaperton http://gaperton.livejournal.com
Дата: 08.11.07 13:05
Оценка:
Здравствуйте, sergesokolov, Вы писали:

G>>Должен вас разочаровать — мне совершенно не интересна эта тема. Я вам настоятельно рекомендую удовлетворять свои нужды в специально отведенных для этого местах, а не в профильных профессиональных форумах. Для замеров пиписьками, самоутверждения, наездов, и переливания из пустого в порожнее есть "священные войны". Для создания пирамидальных клавиатур — "коллеги улыбнитесь".

S>конечно не все на rsdn такие как этот самоуверенный осел

Ой, смотрите-ка, мы обиделись. Чего ты ждал, интересно, в ответ на свои хамские выходки и оффтоп?
Re[9]: Код expression, sheet, cell: задачка
От: Gaperton http://gaperton.livejournal.com
Дата: 08.11.07 14:05
Оценка: +1 :)
Здравствуйте, Cyberax, Вы писали:

C>Тут недавно Gaperton подрался с примерно таким же персонажем на форуме "Менеджмент и управление проектами". Было очень интересно наблюдать — за персонажем. Чувствую, что в этот раз будет еще веселее


Не, не будет. Я не буду отвечать.

А персонаж реально похож. В тот раз, кстати, сначала не забанили никого, потому что типа пришлось бы банить всех сразу — поэтому просто удалили ветку и сказали "мальчики не деритесь". После чего тот персонаж обрадовался и немедленно потребовал от всей конфы извинений — этого уже было малехо через край, и на волне народного гнева награда нашла своего героя .
Re[9]: Код expression, sheet, cell: задачка
От: sergesokolov Россия http://www.ideashag.spb.ru
Дата: 08.11.07 16:54
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Здравствуйте, sergesokolov, Вы писали:


G>>>Должен вас разочаровать — мне совершенно не интересна эта тема. Я вам настоятельно рекомендую удовлетворять свои нужды в специально отведенных для этого местах, а не в профильных профессиональных форумах. Для замеров пиписьками, самоутверждения, наездов, и переливания из пустого в порожнее есть "священные войны". Для создания пирамидальных клавиатур — "коллеги улыбнитесь".

S>>конечно не все на rsdn такие как этот самоуверенный осел

G>Ой, смотрите-ка, мы обиделись. Чего ты ждал, интересно, в ответ на свои хамские выходки и оффтоп?


Да я извиняюсь. Мне кстати в вашей работе многое нравится, есть чему поучиться и конечно вам надо ее продолжать. То что сказал не берите близко, тем более, что вы мне ответили и я не в обиде. Последняя фраза была конечно лишней, сказал в запальчивости. Из разговора вышел, что бы не делать удовольствия Cyberax . Придется бедняге сегодня пускать сопли счастья по другому поводу.
Re[7]: Код expression, sheet, cell: задачка
От: Трурль  
Дата: 09.11.07 05:58
Оценка:
Здравствуйте, red75, Вы писали:


R>Вместо

R>
R>RefList = digraph_utils:topsort(DepGraph)
R>

R>наверное лучше
R>
R>RefList = lists:reverse(digraph_utils:topsort(DepGraph))
R>

R>Чтобы не перевычислять одно и тоже по нескольку раз.

Не "наверное лучше", а "единственно правильно". Оно не будет перевычислять, а просто сломается. Я перепутал порядок, в котором topsort возвращет значения.
Re: Не про дизайн
От: Трурль  
Дата: 09.11.07 06:49
Оценка:
Просто занятное наблюдение.
Посмотрел решения, которые опубликовал thesz. Все аккуратно обрабатывают деление на ноль, и никто нипарицца с переполнением.
Допустим, на языках с бесконечными целыми это неактуально. Но сам thesz использует Int, а не Integer.
Re[8]: Код expression, sheet, cell: задачка
От: red75  
Дата: 09.11.07 09:28
Оценка:
Здравствуйте, Трурль, Вы писали:

R>>Вместо

R>>
R>>RefList = digraph_utils:topsort(DepGraph)
R>>

R>>наверное лучше
R>>
R>>RefList = lists:reverse(digraph_utils:topsort(DepGraph))
R>>

R>>Чтобы не перевычислять одно и тоже по нескольку раз.

Т>Не "наверное лучше", а "единственно правильно". Оно не будет перевычислять, а просто сломается. Я перепутал порядок, в котором topsort возвращет значения.


Угу. Я пропустил эту ошибку, потому что предположил, что невычисленные элементы Context, могут быть довычислены в expression:evaluate(), не заметив, что sheet() не передаётся в cell:evaluate(). То есть sheet:evaluate() при таком дизайне становится ключевым элементом, трогать который руками очень не рекомендуется.
Re[9]: Код expression, sheet, cell: задачка
От: Gaperton http://gaperton.livejournal.com
Дата: 09.11.07 14:07
Оценка:
Здравствуйте, red75, Вы писали:

Т>>Не "наверное лучше", а "единственно правильно". Оно не будет перевычислять, а просто сломается. Я перепутал порядок, в котором topsort возвращет значения.


R>Угу. Я пропустил эту ошибку, потому что предположил, что невычисленные элементы Context, могут быть довычислены в expression:evaluate(), не заметив, что sheet() не передаётся в cell:evaluate(). То есть sheet:evaluate() при таком дизайне становится ключевым элементом, трогать который руками очень не рекомендуется.


Я пришел к выводу, что изначальный дизайн — говно. Я сейчас работаю над новым, с учетом предложений и замечаний твоих, Трурля, Potan-a, и своих собственных. Что это за функциональный дизайн, в котором для инкапсуляции не применяются замыкания? Это какая-то калька с С++/Java/C#, а не дизайн.

Вот сейчас добавим в нужные места замыкания, пробросим где надо exceptions, да воспользуемся подходом Трурля с раздельным запросом зависимостей... Вот тогда посмотрим.
Re[10]: Код expression, sheet, cell: задачка
От: red75  
Дата: 09.11.07 14:48
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Вот сейчас добавим в нужные места замыкания, пробросим где надо exceptions, да воспользуемся подходом Трурля с раздельным запросом зависимостей... Вот тогда посмотрим.


Что-то мне эти зависимости не очень нравятся... А, вот: функция таблицы "=get(Cell)" должна возвращать значение ячейки, указанной в строке/ячейке Cell. Через зависимости не выражается.
Re[11]: Код expression, sheet, cell: задачка
От: Gaperton http://gaperton.livejournal.com
Дата: 09.11.07 15:01
Оценка:
Здравствуйте, red75, Вы писали:

R>Здравствуйте, Gaperton, Вы писали:


G>>Вот сейчас добавим в нужные места замыкания, пробросим где надо exceptions, да воспользуемся подходом Трурля с раздельным запросом зависимостей... Вот тогда посмотрим.


R>Что-то мне эти зависимости не очень нравятся... А, вот: функция таблицы "=get(Cell)" должна возвращать значение ячейки, указанной в строке/ячейке Cell. Через зависимости не выражается.


Пардон, а что такое в данном случае Cell?
Re[12]: Код expression, sheet, cell: задачка
От: red75  
Дата: 09.11.07 15:15
Оценка:
Здравствуйте, Gaperton, Вы писали:

R>>Что-то мне эти зависимости не очень нравятся... А, вот: функция таблицы "=get(Cell)" должна возвращать значение ячейки, указанной в строке/ячейке Cell. Через зависимости не выражается.


G>Пардон, а что такое в данном случае Cell?


Строка или ячейка. Пример таблицы:
    a          b

1  'b1        'No ref
2  =get("a1") =get(a1)

Вычисленная таблица
    a          b

1  b1         b2
2  b1         No ref
Re[13]: Ошибка в таблице
От: red75  
Дата: 09.11.07 15:17
Оценка:
Вычисленная таблица должна быть
    a          b

1  b1         No ref
2  b1         No ref
Re[13]: Решение №2
От: Gaperton http://gaperton.livejournal.com
Дата: 09.11.07 15:45
Оценка:
Здравствуйте, 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.


А теперь — полный ахтунг. Выражение.

-module( expression ).
-export( [ create_expr/1 ] ).

%% create_expr( string() ) -> { Expression, [ ref() ] } | value().
%% Expression = fun( [ value() ] ) -> value()
create_expr( String ) -> catch
        { Expr, Refs } = create( String ),
        F = fun( Args ) -> catch
            { Res, [] } = evaluate( Expr, Args ),
            Res
        end,
        { F, Refs }

%% create( string() ) -> { expression(), refs() }.
%% create expression from text...        
create( Expr ) ->
    Pos = string:cspan( Expr, operation:tokens() ),
    case lists:split( Pos, Expr ) of
        { Val, [ Op | Rest ] } ->
            L = create_arg( Val ),
            { R, Refs } = create( Rest ),
            Node = { L, operation:create( Op ), R },
            { Node, update_refs( L, Refs ) };
        { Val, [] } ->
            H = create_arg( Val ),
            { H, update_refs( H, [] ) }
    end.

update_refs( { ref, Ref }, Refs ) -> [ Ref | Refs ];
update_refs( _, Refs ) -> Refs. 

%% create_arg( string() ) -> Ref | integer()
%% Ref = { integer(), integer() }
create_arg( Arg ) ->
    case catch value:integer( Arg ) of
        { error, _ } -> ref:create( Arg );
        Number -> Number
    end.

%% evaluate( Expression, Args ) -> { Value, [] }.
%% Evaluate expression.
evaluate( { A, Op, B }, Args ) ->
    { ResA, Args_1 } = evaluate( A, Args ),
    { ResB, Args_2 } = evaluate( B, Args_1 ),
    { Op( ResA, ResB ), Args_2 };
evaluate( { ref, _ }, [ Arg | Rest ] ) -> { Arg, Rest };
evaluate( Val, Args ) -> { Val, Args }.


А теперь — cell. Обрати внимание, как просто и симпатично.

-module( cell ).
-export( [    create/1, evaluate/2 ] ).

%% create( String ) -> value() | Formula
%% Formula = { expression(), [ ref() ] }
%% create cell from text representation
create( [ $= | Expr ] ) -> expression:create( Expr );
create( Value ) -> value:create( Value ).

%% evaluate( ref(), sheet() ) -> sheet().
evaluate( Ref, Sheet ) ->
    { _, Sheet_1 } = eval_and_get( Ref, Sheet ),
    Sheet_1.

%% eval_and_get( ref(), sheet() ) -> { value(), sheet() }.
eval_and_get( Ref, Sheet ) ->
    case sheet:get_cell( Ref, Sheet ) of
        updating -> { value:error( 'cyclic reference' ), Sheet };
        { Expr, Refs } ->
            Sheet_1 = sheet:set_cell( Ref, updating, Sheet ),
            { Args, Sheet_2 } = lists:mapfoldl( fun eval_and_get/2, Sheet_1, Refs ),
            Value = Expr( Args ),
            { Value, sheet:set_cell( Ref, Value ) };
        Value -> { Value, Sheet }
    end.


Ну, и наконец, наш факен шыт.

-module( sheet ).
-export( [    new/0, set_cell/3, get_cell/2, 
            update_row/3, get_row/3, create_cell/2, cell_as_string/2, evaluate/1 ] ).

%% new() -> sheet()
%% construct new sheet...
new() -> gb_trees:empty().

get_refs() -> gb_trees:keys( Sheet ).

%% set_cell( ref(), cell(), sheet() ) -> sheet().
set_cell( _, empty, Sheet ) -> Sheet; %%% do NOT store empty values...
set_cell( Ref, Value, Sheet ) -> gb_trees:enter( Ref, Value, Sheet ).

%% set_cell( { ref(), cell() }, sheet() ) -> sheet().
set_cell( { Ref, Value }, Sheet ) -> set_cell( Ref, Value, Sheet ).

%% get_cell( ref(), sheet() ) -> Value.
get_cell( Ref, Sheet ) -> 
    case gb_trees:lookup( Ref, Sheet ) of
        { value, Cell } -> Cell;
        _ -> empty
    end.

%% evaluate( sheet() ) -> sheet().
%% evaluate all expressions...
evaluate( Sheet ) -> lists:foldl( fun cell:evaluate/2, Sheet, get_refs() ).

%% update_row( Row, [ string() ], sheet() ) -> sheet()
%% update row 
create_row( Row, TextCells, Sheet ) ->
    Cells = [ cell:create( String ) || String <- TextCells ],
    Refs = ref:row_range( Row, 1, lists:length( Cells ) ),
    lists:foldl( fun set_cell/2, Sheet, lists:zip( Refs, Cells ) ).

%% get_row( Row, Length, sheet() ) -> [ string() ]
row_as_text( Row, Cols, Sheet ) ->
    [ value:as_string( get_cell( Ref, Sheet ) ) || Ref <- ref:row_range( Row, 1, Length ) ].


Предупреждаю — код не отлаживал. Но все в целом правильно.
Re[11]: Код expression, sheet, cell: задачка
От: Трурль  
Дата: 09.11.07 19:39
Оценка:
Здравствуйте, red75, Вы писали:

R>Что-то мне эти зависимости не очень нравятся...

Ну, мне тоже не совсем.

R>А, вот: функция таблицы "=get(Cell)" должна возвращать значение ячейки, указанной в строке/ячейке Cell. Через зависимости не выражается.

А если представить что будет делать функция "=put(Cell;Value)"...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.