Решение Problem K на Эрланг: дизайн

Nov 06, 2007 14:46

Итак, как же будет выглядеть дизайн решения задачи Problem K (http://thesz.livejournal.com/280784.html) в случае Эрланга. Для начала разберемся, какие возможности в плане декомпозиции нам дает Эрланг ( Read more... )

дизайн, problem k, эрланг

Leave a comment

Comments 11

potan November 6 2007, 13:08:51 UTC
мы не будем их применять при решении нашей задачи - неспортивно это

Мы спортсмены или инженеры? ;-)
По процессу на каждую ячейку - вот идеальное ерланговское решение!

Reply

gaperton November 6 2007, 13:34:21 UTC
Хм... :)

Не так быстро, Миша. Процессы не отменяют модулей. Тебе все равно потребуется модуль-агрегатор, который будет представлять таблицу целиком, и прятать межпроцессный интероп. Кто-то должен помнить соответствие PID-ов и Ref-ов, так? Вот, это и есть модуль sheet. Код процесса-клетки будет завернут в отдельный модуль - это и будет cell. Абстракция для операций нужна? Нужна. Ну, и так далее :). И получим, с точки зрения модулей, "те же яйца, только вид сбоку". Но - потеряем функциональную чистоту.

Это, однако, прикольная идея. Надо будет попробовать. Закончу эту программу - сделаю прикола ради дизайн на процессах.

Reply

О спортсменах... gaperton November 6 2007, 13:36:11 UTC
Кстати, решая данную задачу, мы отчасти все-таки спортсмены. У них ведь в спорте тоже - есть спорт академический, а есть - прикладной. :)

Reply


kurilka November 6 2007, 13:56:14 UTC
Кстати, если по правде говорить, то есть ещё параметризуемые модули, где таки есть чуток состояния, но фича эксперементальная, так что почти не считается :)

Reply

gaperton November 6 2007, 14:08:25 UTC
Да, знаю про них, это реально прикольная штука. Только в них также нет никакого состояния. Все, что делает такой "модуль" - он выполняет неявную передачу параметров. Вместо

New_Sheet = sheet:evaluate( OldSheet )

будет

New_Sheet = OldSheet:evaluate()

И еще бабка надвое сказала, что лучше.

Скажем, смотри, вот пример кода.

evaluate( Sheet ) -> lists:foldl( fun cell:evaluate/2, Sheet, gb_trees:keys( Sheet ) ).

Будет

evaluate( Sheet ) ->
F = fun( X, Sheet ) -> X:evaluate( Sheet ),
lists:foldl( F, Sheet, gb_trees:keys( Sheet ) ).

И что много ли толку?

Reply

kurilka November 6 2007, 14:17:08 UTC
Ну для этой задачи про толк я и не говорил.
А неявные параметры и есть по сути состояние, т.к. sheet:evaluate/1 и OldSheet:evaluate/1 могут вернуть разные значения.
Иначе методы ООП тоже можно назвать "методами без состояния", если пренебречь неявным параметром this.
Хотя всё это уже буквоедство какое-то...

Reply

gaperton November 6 2007, 14:28:54 UTC
sheet:evaluate( Sheet ) и Sheet:evaluate() вернут нам одно и то же.

"Состояние" - это не неявная передача параметров. Состояние - это == отсутствие прозрачности по ссылкам == наличие у объектов identity == деструктивные модификации данных == наличие понятия "переменная" == наличие понятия "ссылка" или "указатель" == зависимость результата от порядка вычислений == разная реакия на одни и те же наборы входных данных функции.

А здесь не совсем то. Sheet_1:evaluate/0 и Sheet_2:evaluate/0 - это разные функции. Или, думайте о них как об одной функции, но - получающей параметр Sheet. Но состояния тут никакого нет, есть только маленький синтаксический фокус.

Reply


это - известность garrrrr November 7 2007, 09:31:37 UTC
Re: это - известность kurilka November 7 2007, 09:37:02 UTC
Димин сайт уже прям супер-портал? :)

Reply

Re: это - известность garrrrr November 7 2007, 21:09:45 UTC
с чего-то надо начинать ;)
несомненно литературный стиль автора пробьет себе дорогу к славе.

Reply


Leave a comment

Up