Зачем мне изучать Лисп?

Я действительно чувствую, что должен изучить Лисп, и есть много хороших ресурсов, которые помогут мне в этом.

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

Есть ли коммерческое приложение-убийца, написанное на Лиспе?

Трудно оттолкнуть то, чего нет.

Kaz 05.09.2012 21:34

Прочтите Резюме Филипа Гринспана. Он изобилует настоящей работой на Лиспе.

Kaz 18.06.2014 05:16

Также здесь. Гринспан работал над моделированием сетей с коммутацией пакетов, проектированием DSP, проектированием процессоров, компоновкой VLSI, автоматизацией машиностроения, автоматизацией землеройных работ и т.д., все с использованием Lisp или с использованием Lisp. Он помогал разрабатывать архитектуру PA-RISC Hewlett Packard, используя инструменты, разработанные на Lisp-машине.

Kaz 18.06.2014 05:21

Вот несколько приложений, разработанных на Lisp - Emacs, G2, AutoCad, Igor Engraver и Yahoo Store.

Arulx Z 22.11.2015 06:01
Введение в одну из самых важных концепций в React - функциональное программирование
Введение в одну из самых важных концепций в React - функциональное программирование
React разработан с использованием концепции функционального программирования, поэтому понимание функционального программирования важно для изучения...
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Что такое Java 8 Streams API? Java 8 Stream API
126
4
56 445
29
Перейти к ответу Данный вопрос помечен как решенный

Ответы 29

сложный синтаксис ??

Синтаксис Lisp - невероятно просто.

Приложение-убийца, написанное на лиспе: emacs. Lisp позволит вам по желанию расширять emacs, чтобы делать почти все, что вы можете придумать, что может сделать редактор.

Но, вам следует изучать lisp только в том случае, если вы используете хотеть, и вы, возможно, никогда не сможете использовать его на работе, но это все равно круто.

Кроме того, я хочу добавить: даже если вы найдете места, где будет иметь смысл lisp, вы, вероятно, не убедите кого-либо еще в том, что его следует использовать поверх java, C++, C#, python, ruby ​​и т. д.

или, скорее, основной синтаксис обычного lisp прост. defmacro позволяет расширить синтаксис, и некоторые встроенные макросы (например, defmacro) могут быть невероятно сложными; лямбда-списки, вложенные обратные кавычки и т. д.

Aaron 26.03.2009 20:34

@Justin: Вероятно, стоит отметить, что ядро ​​emacs написано на C. Но это просто придирка - все команды написаны на elisp.

Bernard 08.08.2008 03:56

Почти справедливо будет сказать, что C-часть emacs - это клей-код.

Luka Ramishvili 15.11.2011 16:38

Согласно справочному руководству Emacs: «Большинство команд редактирования в Emacs написано на Лиспе; некоторые исключения могли быть написаны на Лиспе, но для повышения эффективности вместо этого использовался Си». gnu.org/software/emacs/manual/html_mono/emacs.html#Intro

dpritch 04.08.2018 18:45

Я не могу ответить из первых рук, но вы должны прочитать, что Пол Грэм написал на Лиспе. Что касается части "приложение-убийца", прочтите Превосходя средние показатели.

+1. В этом ответе следует упомянуть Yahoo Stores, первое веб-приложение, частично написанное на лиспе. Цитата из Википедии: В 1998 году Yahoo! Inc. приобрела Viaweb за 455 000 акций Yahoo! акции стоимостью около 49 миллионов долларов и переименовали ее в Yahoo! Магазин.

Steven Lu 04.04.2013 21:26

Я согласен с тем, что Lisp - один из тех языков, которые нельзя использовать в коммерческих целях. Но даже если вы этого не сделаете, изучение этого языка определенно расширит ваше понимание программирования в целом. Например, я изучал Пролог в колледже, и, хотя я никогда не использовал его после, я дал мне лучшее понимание многих концепций программирования и (временами) большую признательность за языки, которые я использую.

Но если вы собираетесь его изучить ... обязательно прочтите На Лиспе

Небольшое примечание: о Лиспе не подходит для введения в Лисп, сначала прочтите что-нибудь еще. Я рекомендую Практический Common Lisp.

Luís Oliveira 18.09.2008 12:50

Я также рекомендую «Как разрабатывать программы» для тех, кто хочет учиться с нуля. Это отлично подходит для непрограммистов.

Lazerbeak12345 21.08.2020 19:04

Сложный синтаксис? Прелесть lisp в том, что у него смехотворно простой синтаксис. Это просто список, где каждый элемент списка может быть либо другим списком, либо элементарным типом данных.

Его стоит изучить, потому что он расширяет вашу способность кодирования думать о функциях и использовать их как просто еще один тип данных. Это улучшит способ написания кода на императивном и / или объектно-ориентированном языке, потому что это позволит вам быть более гибкими в умственном отношении в том, как структурирован ваш код.

Хорошо, я могу показаться странным, но мне действительно не очень нравятся эссе Пола Грэма, а книга о Лиспе - действительно грубая книга, если вы еще не понимаете Common Lisp. Вместо этого я бы посоветовал использовать Siebel Практический Common Lisp. Что касается "приложений-убийц", Common Lisp, похоже, находит свое место в нишевых магазинах, таких как ITA, поэтому, хотя нет приложения, синонимичного CL, в отличие от Rails для Ruby, в промышленности есть места, которые его используют немного покопался.

Ответ принят как подходящий

Одно из основных применений Lisp - это искусственный интеллект. Мой друг из колледжа прошел дипломный курс по искусственному интеллекту, и для своего основного проекта он написал решатель "Отбой" на Lisp. В нескольких версиях его программы использовались несколько разные подпрограммы ИИ, и тестирование на 40 или около того компьютерах дало неплохие результаты (я бы хотел, чтобы это было где-нибудь в Интернете, на которое я мог бы ссылаться, но я не думаю, что это так).

Два семестра назад я использовал Scheme (язык, основанный на Lisp), чтобы написать интерактивную программу, которая имитировала подпрограмму Эббота и Костелло «Кто первым». Ввод от пользователя сопоставлялся с некоторыми довольно сложными структурами данных (напоминающими карты на других языках, но гораздо более гибкими), чтобы выбрать подходящий ответ. Я также написал процедуру для решения 3x3 слайд головоломка (алгоритм, который можно легко распространить на большие головоломки со слайдами).

Таким образом, изучение Lisp (или Scheme) может не дать многих практических приложений, помимо ИИ, но это чрезвычайно ценный опыт обучения, как утверждали многие другие. Программирование на функциональном языке, таком как Lisp, также поможет вам мыслить рекурсивно (если у вас возникли проблемы с рекурсией на других языках, это может быть большим подспорьем).

Почему вы говорите, что Lisp подходит только для искусственного интеллекта? Кроме того, это мультипарадигмальный язык. Функциональность - это лишь одна из нескольких парадигм, которые она позволяет.

Luís Oliveira 18.09.2008 12:48

Я не сказал, что он используется только для ИИ, я сказал, что одним из основных его применений является ИИ. Вы это читали?

Justin Bennett 18.09.2008 16:11

«Не думайте, что Common Lisp полезен только для баз данных, платформ модульного тестирования, фильтров спама, парсеров ID3, веб-программирования, серверов Shoutcast, интерпретаторов генерации HTML и компиляторов генерации HTML только потому, что это единственное, что было реализовано в книга Практический КЛ »

Mikael Jansson 21.09.2008 01:38

@JustinBennett, да, ты это сказал. Здесь: «Таким образом, изучение Лиспа (или Схемы) может не дать многих практических приложений, кроме ИИ». Ненавижу, когда люди противостоят, хотя ошибаются.

Luka Ramishvili 15.11.2011 16:21

Синтаксис не имеет значения, удобочитаемость - нет!

Любой язык выглядит намного сложнее, если не использовать общепринятые в языке соглашения об отступах. Если следовать за ними в Лиспе, можно увидеть, как он довольно легко выражает структуру синтаксического дерева (обратите внимание, это не совсем правильно, потому что предварительный просмотр немного скрыт; r должны совпадать с fns в аргументе рекурсивной быстрой сортировки):

(defun quicksort (lis) 
  (if (null lis) 
      nil
      (let* ((x (car lis)) 
             (r (cdr lis)) 
             (fn (lambda (a) 
                   (< a x))))
         (append (quicksort (remove-if-not fn 
                                           r)) 
                 (list x)
                 (quicksort (remove-if fn 
                                       r))))))

Я думаю, что в том, что вы говорите, есть справедливая критика. Я только хочу сказать, что «это выглядит намного сложнее, как вы его представили, и выглядит намного яснее, как это представлено здесь». Я думаю, вы должны согласиться с тем, что многие языки выглядят намного более запутанными, если их соглашения об отступах не соблюдаются. Кроме того, если мы сравним отступы, скажем, в Java и Lisp, я бы сказал, что они обычно требуют примерно одинакового уровня знаний основных конструкций каждого языка для правильного отступа. Но будет справедливо, хотя и полностью субъективно, сказать, что это все же выглядит сложно.

John with waffle 22.02.2010 20:27

Я считаю интересным сравнение Lisp и XML (и связанных с ним инструментов). Это не значит, что нельзя также сравнивать его с Ruby, VB.net и т. д., Но это другой ракурс, который, как мне кажется, помогает проиллюстрировать, что нравится в нем людям, которым нравится Lisp.

John with waffle 22.02.2010 22:54

Чтобы сделать это немного проще, вы можете использовать стандарт let и использовать defun в начале функции, чтобы определить fn, поскольку он не изменяется.

Aaron Robson 26.08.2012 01:12

Если вы ничего не знаете о Лиспе, вы все равно можете сделать вывод о структуре приведенного выше кода. Вы знаете, что к чему идет, что чему подчиняется. Вы не можете сказать этого о других языках, в которых нет такого синтаксиса. Если вы ничего о них не знаете, вы совершенно заблудились. Вы не знаете, что к чему, и вас легко обмануть, поверив в визуальную ложь вроде int* x, y;.

Kaz 05.09.2012 21:42

@FerretallicA На каком основании вы определяете, является ли что-то «легко читаемым человеком» или «самоописывающимся»? Сходство с английским? Китайский язык «легко читается человеком»? А как насчет математической записи? Разве это «не легко читается человеком»? Этот вид аргументов является досадной тарабарщиной, потому что их скрытый посыл: «Это не похоже на то, как я сначала научился рассуждать».

user713516 15.06.2013 20:15

Больше похоже на то, что ваше «опровержение» звучит как «Whinge whinge». Попробуйте снифф-тест языка программирования. Возьмите кого-нибудь, кто раньше не программировал, и покажите ему страницу кода VB и страницу кода Lisp. Я с радостью поспорю, что левый орех, из которого случайному наблюдателю будет легче сделать значимые наблюдения.

nathanchere 17.06.2013 18:49

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

user713516 25.12.2013 02:03

Я профессионально программировал на Лиспе около года, и его определенно стоит изучить. У вас будет беспрецедентная возможность удалить избыточность из вашего кода, если вы сможете заменить весь шаблонный код функциями, где это возможно, и макросами, где нет. Вы также сможете получить доступ к беспрецедентной гибкости во время выполнения, свободно переводя между кодом и данными. Таким образом, в ситуациях, когда действия пользователя могут вызвать потребность в динамическом построении сложных структур, действительно лисп хорошо проявляет себя. Популярные планировщики полетов авиакомпаний написаны на Лиспе, и в Лиспе также есть много CAD / CAM.

Я обнаружил, что изучение нового языка всегда влияет на ваш стиль программирования на языках, которые вы уже знаете. Для меня это всегда заставляло меня думать по-разному, чтобы решить проблему на моем основном языке, которым является Java. Я думаю, что в целом это просто расширяет ваш кругозор в программировании.

Потому что ты хороший программист. Плохие программисты вместо того, чтобы влиять на старые навыки новыми знаниями, думают на уже известных языках, а пишут на новых. Но почему вы используете Java после lisp? :) Java труднее всего использовать после Лиспа, имо.

Luka Ramishvili 15.11.2011 16:31

Если вам нужно спросить себя, стоит ли выучить шепелявку, вам, вероятно, не нужно.

Я бы сказал наоборот: если вы уже понимаете шепелявый, потому что у вас есть опыт работы с похожим языком, то, вероятно, в этом нет необходимости. Если вы не понимаете, что может предложить шепелявый, то вы можете извлечь выгоду из разоблачения.

Mr Fooz 26.11.2008 17:46

@MrFooz не существует подобных языков, которые могли бы избавить от необходимости изучать лиспийскую часть лиспа. Основные возможности lisp отсутствуют ни в одном языке. Хотя большинство из них.

Luka Ramishvili 15.11.2011 16:36

В зависимости от ваших целей. Если вы хотите умереть, вам не нужно дышать. Но это не значит, что вам не следует этого делать.

mimoralea 27.05.2014 04:03

Изучение лиспа представит Javascript в совершенно ином свете! Лисп действительно заставляет вас воспринимать как рекурсию, так и все «функции как объекты первого класса» - парадигму. См. Отличную статью Crockfords о Схема против Javascript. Javascript - это, пожалуй, самый важный язык на сегодняшний день, поэтому лучше понять его очень полезно!

Самый важный язык? Думаю, что нет, сэр.

TraumaPony 29.11.2008 07:58

Что ж, он доступен практически на любом устройстве с веб-браузером (и, вероятно, на некоторых, у которых его нет), поэтому, что касается языков для запуска приложений конечных пользователей, он, вероятно, имеет самое высокое проникновение среди всех языков программирования на планете . Очевидно, у вас могло быть совершенно иное мнение о том, что важно. Будет ли он использован для лечения рака? Возможно нет. Но, нравится вам это или нет, это будет одним из краеугольных камней разработки (веб) приложений на долгие годы.

Erlend Halvorsen 15.11.2009 17:33

Я пошел тем же путем! Хотя я уже использовал функциональные возможности Javascript и возможности создания прототипов, после изучения Lisp Javascript, тем не менее, был для меня новым языком.

Luka Ramishvili 15.11.2011 16:34

Я сам долго размышлял над этой темой, но пока еще не решил, как обычно, главная проблема - время ...;)

И поскольку я не могу найти эти ссылки в этом посте, я добавляю их в общественных интересах:

История успеха и неудачи: Лишение в Лаборатории реактивного движения

Действительно впечатляющая история успеха: Lisp используется в корпорации Orbitz

Сравнение и анализ использования Lisp вместо Java: Лисп как альтернатива Java

Если вам нравится программировать, вы должны изучать Lisp для чистого удовольствия. XKCD прекрасно выражает интеллектуальное просвещение, которое следует за этим. Изучение Lisp для программиста - это то же самое, что медитация для буддийского монаха (и я имел в виду это без какого-либо кощунственного подтекста).

Чтобы добавить к другим ответам:

Потому что курс SICP (видео доступны здесь) великолепен: учит вас Lisp и многое другое!

Убийственное приложение? Franz Inc. имеет длинный список Истории успеха, но этот список включает только пользователей AllegroCL ... Вероятно, есть и другие. Мне больше всего нравится рассказ о Naughty Dog, так как я был большим поклонником игр Crash Bandicoot.

Для изучения Common Lisp я бы рекомендовал Практический Common Lisp. В нем есть практический подход, который, по крайней мере, для меня сделал его проще, чем в других книгах, которые я просматривал.

Lisp очень полезен для создания небольших DSL. У меня есть копия Lisp in a Box, работающая на работе, и я написал небольшие DSL для опроса баз данных SQL-сервера и создания слоев данных и т. д. На C#. Весь мой код шаблона теперь написан в макросах lisp, которые выводятся на C#. Я генерирую с его помощью HTML, XML и все такое. Хотя мне хотелось бы использовать Лисп для повседневного кодирования, Лисп может принести практическую пользу.

Я использую для этого dotlisp.sourceforge.net/dotlisp.htm.

Mark Hurd 21.05.2010 09:21

Есть даже шепелявое окружение, racket, предназначенное для создания DSL.

Lazerbeak12345 21.08.2020 18:59

Я ходил в колледж в восьмидесятые на "шепелявый класс". Несмотря на то, что я изучил все концепции, представленные в классе, я остался без признательности любой за то, что делает lisp отличным. Боюсь, что многие люди смотрят на шепелявку как на еще один язык программирования, что и сделал для меня этот курс в колледже много лет назад. Если вы видите, что кто-то жалуется на синтаксис лиспа (или его отсутствие), велика вероятность, что он один из тех людей, которые не смогли понять величие лиспа. Я был одним из таких людей очень долгое время.

Только два десятилетия спустя, когда я возродил свой интерес к шепелявости, я начал «понимать» то, что делает шепелявость интересной - по крайней мере для меня. Если вам удастся выучить шепелявку, не думая о замыканиях и макросах шепелявости, вы, вероятно, упустили суть.

Я поддерживаю это. В настоящее время я совершаю второй набег на Lisp, спустя 5 лет после школы. Один термин Lisp, когда вы все еще зеленый, может не иметь адекватного эффекта - я помню, что сосредоточился только на метапрограммировании, и еще не оценил метапрограммирование и гибкость.

Aaron 30.12.2008 08:20

Лисп - это большой и сложный язык с большой и сложной средой выполнения для его поддержки. По этой причине Lisp лучше всего подходит для больших и сложных задач.

Теперь проблема сложный - это не то же самое, что проблема сложно. Проблема сложный - это проблема с множеством мелких деталей, но это не сложно. Написание системы бронирования авиабилетов - сложное дело, но с достаточным количеством денег и программистов это несложно. Уловить разницу?

Сложная проблема - это запутанная проблема, в которой традиционный принцип «разделяй и властвуй» не работает. Управление роботом или работа с данными, которые не являются табличными (например, языки), или очень динамичными ситуациями.

Lisp действительно хорошо подходит для задач, решение которых должно быть расширяемым; классический пример - текстовый редактор emacs. Он полностью программируется и, следовательно, представляет собой самостоятельную среду программирования.

В своей знаменитой книге PAIP Норвиг говорит, что Lisp идеален для исследовательского программирования. То есть программирование решения проблемы, которая до конца не изучена (в отличие от системы онлайн-бронирования). Другими словами: сложные проблемы.

Более того, изучение Лиспа напомнит вам кое-что фундаментальное, о чем уже забыли: разницу между фон Нейманом и Тьюрингом. Как мы знаем, модель вычислений Тьюринга - интересная теоретическая модель, но бесполезная в качестве модели для проектирования компьютеров. Фон Нейман, с другой стороны, разработал модель того, как компьютеры и вычисления должны выполняться: модель фон Неймана. Центральным элементом модели фон Неймана является то, что у вас есть только одна память, и вы храните в ней свой код и данные. Обратите внимание, что программа на Java (или C#, или как вам нравится) является проявлением модели Тьюринга. Вы конкретизируете свою программу, раз и навсегда. Тогда вы надеетесь, что сможете справиться со всеми данными, которые в него попадают.

Лисп поддерживает модель фон Неймана; нет четкой, заранее определенной границы между кодом и данными. Программирование на Лиспе открывает вам возможности модели фон Неймана. Программирование на Лиспе позволяет по-новому взглянуть на старые концепции.

Наконец, будучи интерактивным, вы научитесь взаимодействовать со своими программами по мере их разработки (в отличие от компиляции и запуска). Это также меняет способ программирования и взгляд на программирование.

Этим вступлением я могу наконец предложить ответ на ваш вопрос: найдете ли вы места, где он затмевает «традиционные» языки?

Если вы продвинутый программист, вам нужны продвинутые инструменты. И нет более продвинутого инструмента, чем Лисп. Или, другими словами: да, если ваши проблемы тяжелые. Нет иначе.

«но с достаточным количеством денег и программистов это несложно» - при этом, при достаточно большом количестве программистов это становится невозможным ;-)

Jonas Kölker 26.02.2009 11:44

Я читал о способности lisps генерировать код на лету, но я также читал, что он может быть скомпилирован ... есть ли реализации, которые могут смешивать интерпретируемое и скомпилированное выполнение? или которые содержат собственный компилятор?

centaurian_slug 05.12.2011 16:35

@centaurian_slug: Да, конечно. Это часть силы. Любая версия, которая не была намеренно повреждена, будет иметь свой компилятор / интерпретатор, доступный во время выполнения. Так, например, разработчик может войти в специальное соединение на своем веб-сервере, выполнить некоторую отладку, обновить некоторые определения классов и функций и, возможно, при необходимости перекомпилировать все, что полагалось на эти определения. Все время, пока сервер работает. Вероятно, это незаконно на предприятии, которое беспокоится о соответствии SOX, но это одна из причин, по которой отрасли используют безумные языки, такие как Java и C#.

James 23.03.2012 18:05

Вы можете использовать Clojure сегодня для написания тестов и сценариев поверх виртуальной машины Java. Хотя в JVM реализованы и другие языки Lisp, я думаю, что Clojure лучше всех интегрируется с Java.

Бывают случаи, когда сам язык Java мешает написанию тестов для кода Java (включая «традиционное коммерческое программирование»). (Я не имею в виду это обвинение в адрес Java - другие языки страдают от той же проблемы - но это факт. Поскольку эта тема, а не Java, я не буду вдаваться в подробности. Пожалуйста, не стесняйтесь начинать новую тему, если кто-то хочет это обсудить.) Clojure устраняет многие из этих препятствий.

В ответ на @lassevk:

alt text

Не причина, но (тривиально) AutoCAD поддерживает среду выполнения LISP и DCL. Это удобный способ написания сложных макросов (включая автоматизацию ActiveX), если вы не хотите использовать VBA или их C++ или .NET SDK или если выражение DIESEL его не сокращает.

Многие функции AutoCAD на самом деле являются подпрограммами LISP.

Скрипт-фу GIMP на губах. Это приложение-убийца фотошопа.

Lisp можно использовать везде, где вы используете традиционное программирование. Это не так уж и отличается, просто он более мощный. Пишете веб-приложение? вы можете сделать это на Лиспе, написав настольное приложение? вы можете сделать это на Лиспе, где угодно, вы, вероятно, можете сделать это на Лиспе, или на Python, или на любом другом универсальном программировании (есть несколько языков, которые подходят только для одной задачи).

Самым большим препятствием, вероятно, будет признание вашего начальника, коллег или клиентов. Вам придется с ними поработать. Вам может помочь выбор прагматичного решения, такого как Clojure, которое может использовать текущую базу установки инфраструктуры Java, от JVM до библиотек. Кроме того, если у вас есть программа на Java, вы можете создать архитектуру подключаемых модулей и написать для нее подключаемые модули Clojure, в результате чего половина кода будет написана на Clojure.

Изучение LISP / Scheme может не дать вам увеличенного пространства приложения, но поможет вам лучше понять функциональное программирование, его правила и исключения.

Стоит потратить время, чтобы просто изучить разницу в красоте шести вложенных чистых функций и кошмар шести вложенных функций с побочными эффектами.

Не говорю, что это убийственное приложение, но похоже, что это могло бы быть круто http://code.google.com/p/plop/

Убийственное приложение? Система поиска авиабилетов ITA Software - одна из них.

Что касается «почему», это, скорее всего, сделает вас лучшим разработчиком и вряд ли сделает вас хуже. Однако это может заставить вас предпочесть шепелявые диалекты другим языкам.

От http://www.gigamonkeys.com/book/introduction-why-lisp.html

One of the most commonly repeated myths about Lisp is that it's "dead." While it's true that Common Lisp isn't as widely used as, say, Visual Basic or Java, it seems strange to describe a language that continues to be used for new development and that continues to attract new users as "dead." Some recent Lisp success stories include Paul Graham's Viaweb, which became Yahoo Store when Yahoo bought his company; ITA Software's airfare pricing and shopping system, QPX, used by the online ticket seller Orbitz and others; Naughty Dog's game for the PlayStation 2, Jak and Daxter, which is largely written in a domain-specific Lisp dialect Naughty Dog invented called GOAL, whose compiler is itself written in Common Lisp; and the Roomba, the autonomous robotic vacuum cleaner, whose software is written in L, a downwardly compatible subset of Common Lisp. Perhaps even more telling is the growth of the Common-Lisp.net Web site, which hosts open-source Common Lisp projects, and the number of local Lisp user groups that have sprung up in the past couple of years.

«Lisp стоит изучить для того глубокого просветления, которое вы получите, когда, наконец, получите его; этот опыт сделает вас лучшим программистом на всю оставшуюся жизнь, даже если вы на самом деле никогда не используете Lisp много раз».

- Эрик С. Реймонд, «Как стать хакером»

http://www.paulgraham.com/avg.html

Другие вопросы по теме