Главное меню
Мы солидарны с Украиной. Узнайте здесь, как можно поддержать Украину.

чем хорош лисп ?

Автор rafa, января 26, 2012, 12:11

0 Пользователи и 1 гость просматривают эту тему.

rafa

вопрос тем кто на нем програмирует
в чем особая прелесть - желательно для чайника пояснить мне спасибо

в особенности всвязи с лингвистическими задачами и програмированием ИИ
в том числе всвязи с веб програмированием (на сервере)

Python

Смотря какой лисп. У Common Lisp, Scheme и Clojure есть свои плюсы и свои минусы. Одна из основных концепций, объединяющая все лиспы и отличающая их от остальных языков — концепция «код как данные, данные как код». Идея в том, что программа на лиспе может программно «генерировать себя», при этом работая не со строками текста, а со списком элементов программы. Кроме того, встроенные средства для работы со списками (и некоторыми другими структурами данных) тоже достаточно удобны. Список здесь — последовательная структура данных, каждый элемент которой может иметь произвольный тип, в т.ч. и списковый.

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

Вот, например, макрос ->>, входящий в стандартную библиотеку Clojure (CL и Scheme такого не имеют, но написать его аналог несложно). Все, что он делает — берет первый параметр, подставляет его последним аргументом второго выражения, затем полученное выражение подставляет в третий и т.д. На практике, это довльно удобно, например, при сложной обработке последовательностей. Например, такой фрагмент кода (поиск в файлах, лежащих в нескольких директориях, строк, оканчивающихся многоточием, и выбор случайной последовательности из них):

(->> (.listFiles (java.io.File.(conf :root)))
(concat (mapcat #(.listFiles (java.io.File. %)) (conf :roots)))
(filter #(.isDirectory %))
(concat (map #(java.io.File. %) (conf :projects)))
(filter #(not ((set(.list %)) ".frozen")))
(mapcat #(.listFiles %))
src-expand
(filter #(.isFile %))
(filter #((conf :ext) (ext %)))
(sort #(compare (sortkey %1)(sortkey %2)))
(mapcat (fn [f]
(->>(read-line-seq f :encoding "cp1251") ;
(mapcat #(if (.endsWith %2 "...")
[[(.getCanonicalPath f) %1 %2 (.lastModified f)]])
(drop 1 (range))))))
(mapcat #(if (< %1 (conf :possibility))[%2]) (repeatedly #(Math/random)))))

без ->> выглядел бы несколько ужасновато.

Далее, средства для работы со списками. В приведенном выше фрагменте присутствуют функции filter, sort, mapcat, map — все они получают список в качестве последнего параметра (который в данном примере благодаря ->> везде пропущен), обрабатывают его элементы с помощью заданной функции и возвращают список-результат. Функцию для обработки можно описать прямо в коде, например, в фрагменте (filter #(<= 2 % 5) [1 2 3 4 5 6 7 8 9]) функция проверки, выбирающая из заданного списка только числа от 2 до 5, описывается как #(<= 2 % 5)  (или как (fn[ x ] (<= 2 x 5)), что то же самое) — ее нет необходимости отдельно объявлять, задавать ей имя и т.п.. Функция filter последовательно проверяет список с помощью заданной функции и оставляет лишь элементы, соответствующие условию.  map последовательно заменяет элементы изначального списка результатами их обработки заданной функцией, mapcat позволяет объединять конечный список из коротких списков-результатов. Это намного удобнее, чем делать те же действия при помощи явно описанного цикла с кучей дополнительных переменных.
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

rafa

ЦитироватьОдна из основных концепций, объединяющая все лиспы и отличающая их от   остальных языков — концепция «код как данные, данные как код». Идея в   том, что программа на лиспе может программно «генерировать себя», при   этом работая не со строками текста, а со списком элементов программы.


вот это понятно спасибо (я же чайник пока) но хочу примеры возможного использования этого особого свойства в вышеуказанных целях?

привлекательна идея Clojure - ведь там можно реализовать серверное и клиентское приложение
как я понимаю JAVA есть везде
как например в браузере через JVM запустить веб приложение с интерфейсом графическим? бывает такое и сложно ли?

Python

Серверное и клиентское приложение, приложение в браузере с графическим интерфейсом — что именно имеется в виду? Просто под «графическим интерфейсом» обычно понимают GUI, который в веб-программировании не особо нужен (хотя, безусловно, можно сделать сервер с GUI или клиент с GUI, работающий вместо браузера). На что должен быть похож конечный результат?

Существует несколько веб-фреймворков для Clojure (например, compojure или moustache). GUI можно реализовать, используя swing. Впрочем, в этом направлении я особо не углублялся, и дельных советов дать не могу.
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

rafa

сервер же можно организовать на лиспе?
полноценное веб приложение


и я переспросил про "Идея в   том, что программа на лиспе может программно «генерировать себя»"
поясните мне пожалуйста как чайнику как это особое свойство может помочь в программах лингвистических и ИИ

Python

Цитироватьсервер же можно организовать на лиспе?
полноценное веб приложение
Да, можно. Существует несколько веб фреймворков для Clojure (compojure, moustache и др.). Вебсерверы для CL тоже существуют в природе (впрочем, реализации CL для JVM, кторые мне попадались, мне не особо понравились). Также можно делать серверные приложения и сервлеты на Kawa Scheme — в простейшем случае, kawa, запущенная с определенными параметрами, может работать как самостоятельный вебсервер.
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

Bhudh

Offtop
Аж заинтересовался, есть ли Lawa. Не нашёл...
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Python

Цитироватьи я переспросил про "Идея в   том, что программа на лиспе может программно «генерировать себя»"
поясните мне пожалуйста как чайнику как это особое свойство может помочь в программах лингвистических и ИИ
Про ИИ мне мало что известно. Частный случай «генерирования себя» — уже упомянутые макросы, но я их использую главным образом для задач прикладного характера. Хотя, теоретически, можно представить, как работает программа, которая генерирует код, запускает его, он генерирует следующее поколение и т.д. Впрочем, мне эта идея кажется немного утопичной. ІМНО, для такого рода задач основное преимущество лиспа — средства для работы со списками, с помощью которых можно реализовать, например, что-то типа генетического алгоритма, а «самогенерирование» полезно лишь как дополнительное удобство (впрочем, макросы полезны и в обычных прикладных задачах без ИИ).

Вообще, есть два способа использования данных как кода: вызов макросов и eval. Второе легче понять: это просто функция, которая выполяет список, переданный ей в качестве параметра. Список, который нужно выполнить, может генерироваться программно. Например, это может быть математическая формула, которую программа случайным образом изменяет, отбирая более удачные варианты, пока не добьется некого желаемого результата (полученная формула может быть любой сложности, а условием может быть, например, прохождение полученной функции через заданные точки).

Что же касается макросов, они представляют собой функции, которые получают в виде данных фрагменты кода, заданные им в качестве параметров, обрабатывают их, а полученный результат встраивается в код программы.
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

Python

Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

Bhudh

Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Python

Цитата: Bhudh от января 26, 2012, 23:06
Offtop
Цитата: Python от А що це?
Продолжение Jawʼы и Kawʼы...
Offtop
Похоже, там просто кофейные ассоциации, что вообще характерно для названий java-программ.
(wiki/pl) Kawa (wiki/uk) Кава (wiki/sl) Kava
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

Bhudh

Offtop
Цитата: Python от что вообще характерно для названий java-программ
Не понял. Что именно характерно? Ассоциации или кофе? На Яве вроде вообще чай выращивают...
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Python

Цитата: Bhudh от января 27, 2012, 11:52
Offtop
Цитата: Python от что вообще характерно для названий java-программ
Не понял. Что именно характерно? Ассоциации или кофе? На Яве вроде вообще чай выращивают...
Offtop
Ассоциации с кофе. Название Java тоже относится именно к кофе:

The language was initially called Oak after an oak tree that stood outside Gosling's office; it went by the name Green later, and was later renamed Java, from Java coffee, said to be consumed in large quantities by the language's creators.
(wiki/en) Java_(programming)
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

Bhudh

Offtop
О блин. А у нас яванська кава и незнама вовсе...
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Быстрый ответ

Обратите внимание: данное сообщение не будет отображаться, пока модератор не одобрит его.

Имя:
Имейл:
Проверка:
Оставьте это поле пустым:
Наберите символы, которые изображены на картинке
Прослушать / Запросить другое изображение

Наберите символы, которые изображены на картинке:

√36:
ALT+S — отправить
ALT+P — предварительный просмотр