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: