вопрос тем кто на нем програмирует
в чем особая прелесть - желательно для чайника пояснить мне спасибо
в особенности всвязи с лингвистическими задачами и програмированием ИИ
в том числе всвязи с веб програмированием (на сервере)
Смотря какой лисп. У 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 позволяет объединять конечный список из коротких списков-результатов. Это намного удобнее, чем делать те же действия при помощи явно описанного цикла с кучей дополнительных переменных.
ЦитироватьОдна из основных концепций, объединяющая все лиспы и отличающая их от остальных языков — концепция «код как данные, данные как код». Идея в том, что программа на лиспе может программно «генерировать себя», при этом работая не со строками текста, а со списком элементов программы.
вот это понятно спасибо (я же чайник пока) но хочу примеры возможного использования этого особого свойства в вышеуказанных целях?
привлекательна идея Clojure - ведь там можно реализовать серверное и клиентское приложение
как я понимаю JAVA есть везде
как например в браузере через JVM запустить веб приложение с интерфейсом графическим? бывает такое и сложно ли?
Серверное и клиентское приложение, приложение в браузере с графическим интерфейсом — что именно имеется в виду? Просто под «графическим интерфейсом» обычно понимают GUI, который в веб-программировании не особо нужен (хотя, безусловно, можно сделать сервер с GUI или клиент с GUI, работающий вместо браузера). На что должен быть похож конечный результат?
Существует несколько веб-фреймворков для Clojure (например, compojure или moustache). GUI можно реализовать, используя swing. Впрочем, в этом направлении я особо не углублялся, и дельных советов дать не могу.
сервер же можно организовать на лиспе?
полноценное веб приложение
и я переспросил про "Идея в том, что программа на лиспе может программно «генерировать себя»"
поясните мне пожалуйста как чайнику как это особое свойство может помочь в программах лингвистических и ИИ
Цитироватьсервер же можно организовать на лиспе?
полноценное веб приложение
Да, можно. Существует несколько веб фреймворков для Clojure (compojure, moustache и др.). Вебсерверы для CL тоже существуют в природе (впрочем, реализации CL для JVM, кторые мне попадались, мне не особо понравились). Также можно делать серверные приложения и сервлеты на Kawa Scheme — в простейшем случае, kawa, запущенная с определенными параметрами, может работать как самостоятельный вебсервер.
Аж заинтересовался, есть ли Lawa. Не нашёл...
Цитироватьи я переспросил про "Идея в том, что программа на лиспе может программно «генерировать себя»"
поясните мне пожалуйста как чайнику как это особое свойство может помочь в программах лингвистических и ИИ
Про ИИ мне мало что известно. Частный случай «генерирования себя» — уже упомянутые макросы, но я их использую главным образом для задач прикладного характера. Хотя, теоретически, можно представить, как работает программа, которая генерирует код, запускает его, он генерирует следующее поколение и т.д. Впрочем, мне эта идея кажется немного утопичной. ІМНО, для такого рода задач основное преимущество лиспа — средства для работы со списками, с помощью которых можно реализовать, например, что-то типа генетического алгоритма, а «самогенерирование» полезно лишь как дополнительное удобство (впрочем, макросы полезны и в обычных прикладных задачах без ИИ).
Вообще, есть два способа использования данных как кода: вызов макросов и eval. Второе легче понять: это просто функция, которая выполяет список, переданный ей в качестве параметра. Список, который нужно выполнить, может генерироваться программно. Например, это может быть математическая формула, которую программа случайным образом изменяет, отбирая более удачные варианты, пока не добьется некого желаемого результата (полученная формула может быть любой сложности, а условием может быть, например, прохождение полученной функции через заданные точки).
Что же касается макросов, они представляют собой функции, которые получают в виде данных фрагменты кода, заданные им в качестве параметров, обрабатывают их, а полученный результат встраивается в код программы.
Цитата: Bhudh от января 26, 2012, 22:03
Аж заинтересовался, есть ли Lawa. Не нашёл...
А що це?
Цитата: Bhudh от января 26, 2012, 23:06
Похоже, там просто кофейные ассоциации, что вообще характерно для названий java-программ.
(wiki/pl) Kawa (http://pl.wikipedia.org/wiki/Kawa) (wiki/uk) Кава (http://uk.wikipedia.org/wiki/%D0%9A%D0%B0%D0%B2%D0%B0) (wiki/sl) Kava (http://sl.wikipedia.org/wiki/Kava)
Цитата: Python от что вообще характерно для названий java-программ
Не понял. Что именно характерно? Ассоциации или кофе? На Яве вроде вообще чай выращивают...
Цитата: Bhudh от января 27, 2012, 11:52
Цитата: Python от что вообще характерно для названий java-программ
Не понял. Что именно характерно? Ассоциации или кофе? На Яве вроде вообще чай выращивают...
Ассоциации с кофе. Название 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) (http://en.wikipedia.org/wiki/Java_(programming))
О блин. А у нас яванська кава и незнама вовсе...