[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Perl or Python?



On Sat, 21.03.2009 17:31:06 , Aleksey Cheusov wrote:
>  >>  AD>>  У меня на  этапе изучения  лиспа было  очень яркое  впечатления от
>  >>  AD>> одной очень мелкой задачки, которая была решена на лиспе. Надо было
>  >>  AD>>  транспонировать  матрицу.  Решение  состояло  из вызова  3-х(трёх)
>  >>  AD>>  функций, которые не  имеют никакого  отношения к  матрицам, вообще
>  >>  AD>>  никакого. То есть  ни циклов,  ничего такого,  просто 3  строки, в
>  >>  AD>> каждой вызов  одной функции, вложенный в другую.  В лиспе также нет
>  >>  AD>> НИКАКИХ инструментов для обработки матриц.  Делайте выводы.
>  >> 
>  >> > Вообще-то, можно одной строкой:
>  >> > (apply #'map 'list matrix), 
>  >> > где matrix - список списков
>  >> О! Верх изящества. Вспоминается пример, как дядечка в середине 70-х
>  >> разбирал несколько ЧАСОВ(!) 4(!!!) строки на языке APL.
>  >> 35 лет прошло, и никто ничему так и не научился :-/
> > Это неудачная шутка?.. Какая связь между 4 строками, которые пришлось
> > разбирать несколько часов, и вызовом трёх функций, понятным с первого
> > взгляда?
> 
> Открываем первое, что находится под рукой, Emacs,
> вбиваем туда эти три строки.
>    (setq matrix '((1 2 3) (4 5 6) (7 8 9)))
>    (apply #'map 'list matrix)
> 
> Не работает.
> 
>  Debugger entered--Lisp error: (invalid-function (1 2 3))
>   (1 2 3)(4 7)
>   mapcar*((1 2 3) (4 5 6) (7 8 9))
>   apply(mapcar* (1 2 3) (4 5 6) (7 8 9))
>   map(list (1 2 3) (4 5 6) (7 8 9))
>   apply(map list ((1 2 3) (4 5 6) (7 8 9)))
>   eval((apply (function map) (quote list) matrix))
>   eval-last-sexp-1(nil)
>   eval-last-sexp(nil)
>   call-interactively(eval-last-sexp)
> 
> Ладно, Emacs Lisp - не Common Lisp.
> Это вообще не Лисп...
Вот именно. При чём тут ELisp? Лишний повод поворчать?

> Сходил за книжкой в другую комнату.
> Открываем первый том двух-томника "Мир лиспа", смотрим заглавие.
> Ага, apply - страница 246, читаем, apply - функция двух переменных.
> В примере 4. Все. 5 минут прошло. Мое время и терпение иссякли.
> 
> Искать и ставить настоящий CommonLisp и искать его документацию, чтобы
> вспомнить, что читал несколько лет назад и вроде бы знал мне некогда.
> 
> При этом гораздо больше строк
> 
> function transposition (matrix A [N,M])
>    matrix B = create_matrix (M, N)
>    for i in 1,N
>       for j in 1,M
>          B [j, i] = A [i, j]
>       end
>    end
>    return B
> end
> 
> понимают _абсолютно все_ мгновенно.
> 
Во-первых, не абсолютно все, а те, кто обучен на императивном подходе.
Да, это подавляющее большинство, но подменять понятия всё же не стоит.

Во-вторых, это был _элементарный_ пример. Функции apply и map на
порядки мощнее и эффективнее, чем та часть их возможностей, которая
использована в этом примере. Думаю, в том же "Мире лиспа" можно найти
однострочники, которые при переводе на императивный язык развернутся
не в два цикла с одним оператором, а в несколько сотен строк кода,
который очень мало кто поймёт "мгновенно".

Одним словом, очень уж демагогией запахло, если откровенно.

-- 
С уважением,
Тихон Тарнавский.
http://linuxforum.ru
http://posix.ru


Reply to: