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 -- To UNSUBSCRIBE, email to [email protected] with a subject of "unsubscribe". Trouble? Contact [email protected]

