Лисп - семейство языков программирования. Характерные особенности лиспов: динамичность, гомоиконность (код как данные), программируемость.
Основные диалекты — Common Lisp - разрабатывался как промышленный язык, пригодный для широкого спектра применения, из-за чего имеет достаточно объемную спецификацию. Является мультипарадигменным (процедурщина, функциональщина, ооп (CLOS)), с сильной, динамической типизацией. Есть опциональная декларация типов и, в некоторых реализациях (sbcl, например), частичный их вывод. Описание особенностей: http://habrahabr.ru/post/143490 Основные реализации: + свободные: SBCL (нативный код), Clozure CL (нативный код), ECL (через сишку), Clisp (байт-код; небольшой размер образа; похоже, заброшен), ABCL (байт-код JVM), gcl, cmucl + коммерческие: LispWorks, Allegro CL, Scieneer CL, mocl (для программирования под ведро и ios) — Scheme - это минималистичный лисп, пригодный в основном для обучения, исследований, DSL'ей. Тем не менее Racket, который основывается на схеме, вполне практичен. Racket включает в себя много подъязыков (typed racket, lazy racket, frtime racket), включая схему стандартов r5rs и r6rs. — Clojure - Стильный, модный, молодежный лисп с бóльшим уклоном в функциональщину, иммутабельными структурами данных, поддержкой параллельщины с транзакционной памятью, агентами. Ориентированность главным образом на JVM сказалась на дизайне языка, что многим не нравится. — Emacs Lisp - его область применения ограничивается емаксом. Является наследником ТОГО САМОГО MacLisp'а. — Tcl - скриптовый язык, оче удобен для написания скриптиков с окошками или edsl — Rebol — PicoLisp - Наркоманская хуита — newLISP - Скриптовый лисп с компактным и быстрым интерпретатором и батарейками на любой случай жизни. В первую очередь предназначен для скриптоты, которую обычно пишут на perl, python, tcl, sh: обработка текстов, работа с сетью, базами данных, взаимодействие с ОС, построение графиков и т.п. Список возможностей: http://www.newlisp.org/index.cgi?Features Отличия от других диалектов: http://www.newlisp.org/index.cgi?page=Differences_to_Other_LISPs
Среды разработки Одно из основных преимуществ лиспа в сравнении с языками с циклом разработки "написал → перекомпилировал → запустил в отладчике" - поддержка интерактивно-итеративного метода разработки. Но без инструментария, обеспечивающего полноценное взаимодействие с реплом, оно сводится на нет. Поэтому писать без использования нормальной среды - значит упустить важную особенность языка.
— Common Lisp + Emacs + SLIME - самый лучший вариант. + vim + SLIMV + LispWorks + AllegroCL IDE упаси боже + Eclipse + cusp + <Что-нибудь для сублайма/атома уже запилили, наверное>
>>517520 Норм вариант, я именно так и делал. Ещё один момент, если не знаешь джаву, то нужно будет познакомится с базовыми типами и некоторыми частям стандартной библиотеки: I/O, работой со строками, регекспам, частично математикой, если нужен высокий перформанс то ещё с массивами (с коллекциями не нужно, они в clojure свои).
>>517571 Ещё использовал его, когда игрался с опенгл. Оче удобно, когда без остановки программы просто перекомпилировал какую-то функцию и сразу же увидел результат.
>>517609 > А зачем она нужна в лиспе? Работает быстрее и отлавливает ошибки неверного типа данных на этапе компиляции. > но ещё и лишит его основных преимуществ Основное преимущество Лиспа в его синтаксисе и представлении программы в виде списков. Каким образом типизация атомов сделает его хуже? Ну многословнее может быть, но не более того. (def fact((n Number)) (cond ((eq n 0) 1) (T (fact (- n 1))))) - типа так
>>517613 >Работает быстрее Хуита. SBCL и без неё хорошо справляется. >отлавливает ошибки неверного типа данных на этапе компиляции Во-первых, в нормальных лиспах нет этапа компиляции, т.к. компилятор - часть рантайма. Во-вторых, модель разработки и предупреждения компилятора (sbcl умеет в частичный вывод типов) помогают выявить большинство таких ошибок практически сразу. >Основное преимущество Лиспа в его синтаксисе и представлении программы в виде списков. Не только. Лисп - динамическая, программируемая система. А статическая типизация в таковой была бы лютым костылем. >(def fact((n Number)) (cond ((eq n 0) 1) (T (fact (- n 1))))) - типа так Этак ты и сейчас, и 20 лет назад писать можешь. http://clhs.lisp.se/Body/d_type.htm
>>517479 Хочу для обучения написать игорь на SDL на каком-нибудь лиспе, умеющем в параллельщину и с хорошим к нему (SDLю) биндингом. Что кроме clojure посоветуете?
>>518207 > Что кроме clojure посоветуете? Очевидный common lisp >умеющем в параллельщину Не так хорошо, конечно, как у кложуры, но тоже пойдет. Для работы с потоками есть bordeaux-threads >с хорошим к нему (SDLю) биндингом. lispbuilder-sdl
Блин, лиспаны, я немного на лиспе писал и вынес оттужа много полезного. Но я никак не могу вернуться назад. Пытался недавно делать софт для проверки нескольких алгоритмов, которые верртятся в голове пару месяцев, но в иитоге соснул даже с тривиальной задачей как проекция n-мерного массива на пространство размерности < 1 (простыми словами получить из 3d 2d матрицу-срез). aref, сука, хочет полный вектор. А для меня это вообще очевидным было сразу. В итоге решил делать на NumPy. Какие задачи прикладные программы пописать посоветуете, чтобы проникнуться еще раз?
>>519148 Ты тикиля в глаза не видел что ли? Очевидный пример работы с кодом - bind Ему передается код, в котором потом обычными строковыми (любой код в тикиле - строка из слов) операциями производится замена %W, %x, %y и прочих в соответствии с документацией http://www.tcl.tk/man/tcl8.6/TkCmd/bind.htm#M24
>>519304 >Ну, просвети, чтоже такое гомоиконность. Т.е. ты полез спорить без всякого представления о предмете спора? Предлагаю тебе самому просветиться и тогда уже вернуться с аргументами или осознанием своей неправоты, иначе диалог обещает проходить в том же режиме. >Такое же гомоиконное Как ты пришёл к такому выводу, если не знаешь, что такое гомоиконность? >твой тикаль Наш. Он общий.
>>519316 > если не знаешь, что такое гомоиконность? у меня есть представление о гомоиконности, гомоиконен лисп со скобочками, потому что все (почти все) данные и код представляются одинаково. В тикле такого нет, как нет и в руби
Okay, wiki: > If a language is homoiconic, it means that the language text has the same structure as its abstract syntax tree (i.e. the AST and the syntax are isomorphic). Не вижу в примерах с тиклем этого
>>519317 В тикиле код и его ast имеют одинаковый вид. В примере выше это хорошо видно. Bind, если что, - самая обычная функция, а код, ей передаваемый, - просто строка
>>519328 Чтоб тебе было понятнее, в примере записано что-то вроде: (bind .с #<l> '(setq x %x)) Т.е. передается не функция/блок кода, а, грубо говоря, аст.
>>520041 Алсо после пяти лет прыщей, на виндовые шрифты вообще смотреть не могу. Особенно мне нравятся патчи космонавта. Сколько не пердолился об инфинатили, мыльной маковской говно получается.
>>520215 Хоткеи вима для редактирования текста. Для управления редактором свои собственный наборы сочетаний клавиш, начинающихся с модификатора.
> Spacemacs organizes key bindings into mnemonic groups. For example, commands to operate on the buffer are prefixed by <SPC> b, and commands to operate on the project are under <SPC> p
>>520248 Я джва года юзал вим. Потом перекатился на имакс, и уже наверное года 3 или 4 на нем сижу. Тестил все мыслимые и немыслимые вим-моды, но чет как-т приуныл. Дефолтные хоткеи меня вполне устраивают.
Алсо да, я ебанько который перехуярисл себе раскладку клавы: ктрл на альт, алт на капс. Зависимость есть, брат жив.
>>520255 Мизинцем, но при этом я его не подгибаю, а ты большой палец подгибаешь, чтобы отвести его от пробела к альту. В фурифоксе не надо хоткеить, выделил текст мышкой… всё, он скопировался. Хотя это я настроил, чтобы у меня один буфер был, так-то их в линуксе обычно двое. Ну и чтобы даже мышкой не возить, у меня там пентадактиль с режимами. Все, завязываю оффтопить.
>>520263 На капсе у меня мизинец уставал не намного меньше чем на альте. Алсо купил себе механику без цифрового блока — охуенно просто. Все вим-моды для фурифокса отвратно работают с переключенной раскладкой. Я так и не распробовал ни одного из них.
Товарищи, расскажите нынешние реалии ТСЛя. Я на нем лет 10 назад отжигал себе в удовольствие, потом жизнь закрутила.
Суть вот в чем. Я был молодой и не разбирался - лисп там или не очень. Просто перло от того, что все, что угодно пихаешь куда ни попадя, а оно и работает. И к тому же - хуяк и в продакшн. шелл даже написал на нем же для него же
Только потом узнал, что ЛИСП это типа труъ, для бородатых гошпод, а вот только сейчас узнал, что ТСЛ имеет какое-то отношение к лиспу.
Короче. Что сейчас как? Пользуются ли им? Стоит ли допиливать вещи?
>>520902 >Что сейчас как? Развивается потихоньку. Не так давно вот сопрограммы добавили, теперь писать асинхронщину стало ещё удобнее. Количество и качество батареек возросло. JIT запилили. Tk на линуксе до сих пор выглядит как говноmotif, хотя какие-то попытки исправить ситуацию были. >Стоит ли допиливать вещи? Конечно.
>>521907 >программа на js - это просто json'ы [code lang=js] var array = [1, 2, 3, 4, 5], sum = 0, prod = 1; for (i = 0; i < array.length; i += 1) { sum += array; prod *= array; } [/code] Где ты тут json видишь?
Доброго времени суток, господа скобкари! Начал аутировать в лисп недавно, поэтому топор, сразу извиняюсь за глупые вопросы, коих я к вам принес целых джва. Первый: defstruct'ом определена дата (в целях тренировки леплю велосипед для работы с датами), определена функция печати для вывода в формате "2015-07-28". если пробовать задать джве даты (2015-07-28 и 2015-08-05) и объединить их в список, то repl выдает дичь:"2015-07-282015-08-05( )". Это только в repl так? Или так и должно быть? Если функцию печати не определять, то repl пишет:"(#S(LD-DATE :YEAR 2015 :MONTH 7 :DAY 28) #S(LD-DATE :YEAR 2015 :MONTH 8 :DAY 5))", то есть нормально списком. Второй, теоретический: если в качестве аргумента функции передается атом, который мы хотим использовать как ключ, как это сделать? пример: (defun foo (&key (x 10) (y 15)) (/ x y))
(defun bar (m n) (foo :m n))
то есть в функции bar мы как m передаем символ x или y. Как для ключа его использовать?
>>522497 >если пробовать задать джве даты (2015-07-28 и 2015-08-05) и объединить их в список, то repl выдает дичь:"2015-07-282015-08-05( )" Это ты там где-то накосячил. http://ideone.com/6aubWp >то есть в функции bar мы как m передаем символ x или y. Как для ключа его использовать? Так и пишешь (foo m n) Ключевые слова, чтобы ты понимал, — это просто символы, принадлежащие пакету keyword, а :m — это синтаксический сахар к 'keyword:m. Там же на ideone я попытался это тебе продемонстрировать.
Листаны, решил вернуться к своей второй главе сикп. Охуел от того как я обимперативел за два месяца питона, не могу написать нихуя. Получается очень уродливо, голова как деревянная. Например, есть список, надо применить функцию к каждому элементу, и если функция возвращает #f, тогда весь результат будет #f. Пока сделал короч let res = (map fn lst), а потом (if (not (member #f res)) ...) Но как-то всё равно хуёво. Есть andmap, но он возвращает только последний элемент в случае успеха, а мне надо весь список.
>>522976 Алсо, использую Racket которого толком не знаю, но местами есть удобное дерьмо типа let* или letrec. Насколько это зашквир с точки зрения обучения и вообще?
>>522976 Для таких случаев удобно использовать продолжения. [code lang=scheme](define (test f xs) (let/cc cont (map (lambda (x) (or (f x) (cont #f))) xs)))
>>527961 Там наконец-то завезли lexical scope (начиная с emacs 24) и портировали многую годноту из Clojure (dash.el). Так что сейчас на нём вполне можно писать.
>>529218 Есть варианты. В том же схеме можно делать внутренние функции (по сути замыкания), которые будут общие переменные использовать из окружения.
Обычно рекурсивные алгоритмы имеют небольшую асимптотическую сложность (тот же поиск по дереву за log(n), поэтому не так все страшно. Хотя, конечно, поймать stackoverflow вполне реально.
>>529210 >Если я правильно понимаю, каждый вызов рекурсивной процедуры занимает место в памяти. Это значит, в данном случае, что все 4 операнда будут занимать новую память каждый вызов процедуры. Нет. Все вызовы в схеме являются хвостовыми, т.к. код преобразовывается к CPS.
>>529505 Мне удобны способ переключения между мониторами и воркспейсами, гибкая настройка тайлинга, в том числе возможность жесткого задания положения окон на воркспейсах, огромное число хоткеев, нескучные обои. I3 не использовал, ничего про отличия сказать не могу.
>>530083 На рэкете с #lang racket и с #lang r5rs работает. У тебя, наверное, режим Advanced Student установлен, в нем тело функции не может иметь больше одного выражения.
Число способов разменять сумму a с помощью n типов монет равняется - числу способов разменять сумму a с помощью всех типов монет, кроме первого, плюс - число способов разменять сумму a − d с использованием всех n типов монет, где d — достоинство монет первого типа.
это потому, что из комбинаторики в общем случае - см. пикрил.
Комбинаторику в институте я проебал мудак, порекомендуй книгу для начинающих мамкиных программистов. Желательно на английском.
Вот эту рекомендуют, годная ли? Mathematics with Combinatorics, James A. Anderson
Ебля с монеткамиАноним19/08/15 Срд 16:49:27#138№532535
Число способов разменять сумму a с помощью n типов монет равняется - числу способов разменять сумму a с помощью всех типов монет, кроме первого, плюс - число способов разменять сумму a − d с использованием всех n типов монет, где d — достоинство монет первого типа.
это потому, что из комбинаторики в общем случае - см. пикрил.
Комбинаторику в институте я проебал мудак, порекомендуй книгу для начинающих мамкиных программистов. Желательно на английском.
Вот эту рекомендуют, годная ли? Mathematics with Combinatorics, James A. Anderson
>>532535 Но ведь неправильно, лол, разве нет? Число способов разменять сумму a с помощью n типов монет равняется -числу способов разменять сумму a − d1 с использованием всех n типов монет, где d1 — достоинство монет первого типа плюс -числу способов разменять сумму a − d2 с использованием всех n типов монет, где d2 — достоинство монет второго типа... и т.д.
>>532707 + -числу способов разменять сумму a − dn с использованием всех n типов монет, где dn — достоинство монет n-го типа + 1 (пустое подмножество. Тоже считается за способ).
>>532768 Спасибо! И еще. Простите за нубский вопрос, но: как отслеживать этапы вычисления в DrRacket? Например, мне надо узнать сколько вызовов sqrt-iter в примере из SICP.
>>532924 Вовсе нет. Отними 1 от всех коэффициентов. Получится: (n k) = (n-1 k) + (n-1 k-1) А точнее, (n k) - Число способов разменять сумму n с помощью k типов монет равняется (n-1 k-1) - числу способов разменять сумму n с помощью всех типов монет, кроме первого, плюс (n-1 k) - число способов разменять сумму n − k с использованием всех n типов монет, где d — достоинство монет первого типа.
>>533021 Затрудняюсь понять с чего ты это взял... > k типов монет > k номиналов Например: Дана сумма S, и два номинала a и b, причем a < b.
Давай посчитаем все варианты размена, но без повторений. Итак: 1. Размен S только с помощью a, обозначим это как S(a). 2. Размен S только с помощью b, обозначим это как S(b). 3. Размен S с помощью a и b вместе, обозначим это как S(a,b).
Обрати внимание, что все эти множества не пересекаются.
Но в множестве 3. есть интересный нюанс: Если b кратен a, то в это множество входят и те варианты, в которых b разменен с помощью a. Но! Если мы разменяем все b помощью a, то это будет повторять множество 1.! Как этого избежать? А вот так - потребуем, чтобы в тех подмножествах (вариантах), где b разменен с помощью a, был использован как минимум один b!
Что получается? Множество 3. можно разделить на два подмножества: 3.1 Размен S с помощью максимального количества b, а остаток - с помощью a. Это будет максимум один вариант. 3.2 Размен S с помощью поэтапного уменьшения (максимального количества b), а остаток - с помощью a. Это значит, что каждый b мы поэтапно размениваем с помощью a. Пока не останется один b, а остальное - a.
Обрати внимание, что если чуть-чуть попердолиться, то можно объявить множества таким образом, что 3.1 == 2., а 3.2 == 1.
>>533154 Продолжаю. Итак, 3.2. Это очень хитрое подмножество. Обрати внимание, чтобы множества 1., 2. и 3. не пересекались, там должен быть минимум один b. Что это значит? Это значит, что если b есть во всех вариантах 3.2, то можно его не учитывать. И далее, расчитывать варианты для (S-b) вместо S! Дада, рекурсия уже близко! Но для этого нужно > объявить множества таким образом, что 3.1 == 2., а 3.2 == 1.
>>532768 Анон, счастья тебе и здоровья за подсказку книги. Неплохая?! Да она охуенна! В списке литературы есть ссылка на такое охуенное решение задачи про монетки, что я сорвал нофапафон! Мне дико доставило, что я был на правильном пути! Добра тебе.
Расскажите мне про использование лиспа в качестве встраиваемого языка. Скажем, я хочу сделать для игрового сервера возможность писать логику для предметов/мобов на какой-нибудь схеме. Норм затея или не выебываться и смотреть в сторону луа?
Привет, коданы. Я изучаю SICP.Пишу на Racket. Что прочесть по Схеме чтобы я перестал путаться в этих скобках? Какие-нибудь трюки с IDE? Есть кнопочка "обернуть выражение в скобки?"
>>535484 > Какие-нибудь трюки с IDE? В емаксе всякие rainbow-delimiters, highlight-parentheses >Есть кнопочка "обернуть выражение в скобки?" В том же емаксе smartparens.
Рекомендую использовать spacemacs, в котором всё это уже настроено. Добавишь только racket, scheme, auto-completion и т.д. в dotspacemacs-configuration-layers в ~/.spacemacs и готово.
>>535506 Блджад, я понимаю что писать на лиспе в лиспе это весело, но я под виндой живу, сменить OS не могу, хоть и хочу. Ты предлагаешь мне неделю еще и с имаксом ебаться под виндой.
>>535537 spacemacs и под виндой нормально работает. Просто следуй инструкции https://github.com/syl20bnr/spacemacs#windows Ну и тебе скорее всего потом придется задать полный путь к racket.exe через M-x customize-group geiser-racket как на изображении.
Ну или используй drRacket. Он хоть и не такой удобный, как емакс, но пользоваться можно.
Глубокое знание js предполагает глубокое знание предметной области, т.е. знание HTML и CSS, знание стандартов и понимание направления их развития, умения оптимизировать производительность сайтов и многое другое.
Глубокое знание java предполагает толерантность к монструозным фреймворкам, умение сидеть на жопе ровно в кубике и принимать на себя вину за ошибки менеджеров.
Есть один код.Аноним10/09/15 Чтв 09:53:12#187№541125
[code lang="lisp"] (setq sel (ssget)) (setq i 0) (while (< i (sslength sel)) (progn (setq content (entget (ssname sel i) )) (if (= (cdr(assoc 0 content)) "MTEXT") (progn (setq str (cdr(assoc 1 content)) ) ( setq index (1- (strlen str)) ) (while (and (> index 0) (/= (substr str index 1) ";") ) (setq index (1- index)) ) (setq str (substr str index (- (strlen str) index) )) (subst (list 1 . str) content sel) (entmod sel) )) (setq i (1+ i )) )) [/code] Пытаюсь написать маленький скрипт для автокада, но эта тварь не с того не с сего перестала входить в главный цикл while, то есть вообще, ошибок не выдаёт, проверку условия не делает, просто заканчивает работу скрипта после второй строчки, пёс. В чём вообще может быть дело?
>>542480 Нехера не возвращает он, я же писал что он даже условия не проверяет когда пошагово отлаживаю, до этого всё норм было потом я внутри цикла сделал изменения и он перестал его запускать. Ставлю брекпоинт на самое начало жму следующая инструкция дохожу до цикла и выполнение заканчивается.
>>517479 (OP) Как то в школе от нечего делать нашёл в библиотеке древние книжки по лиспу и прологу. Пролог тогда показался интереснее своей концепцией и про лисп я забыл. Вскоре осознал, что одно уже мертво, а второе мне никогда не понадобится.
>>542914 Нашел проблему, помимо программных ошибок была синтаксическая: (list 1 . str) не создаёт валидный элемент словаря, а является синтаксической ошибкой, но ошибок при этом никаких не выдавалось, АвтоКАД молча игнорил тело цикла с ошибкой. Такие дела.
Просто захотел зафорсить мелкоборду и запостить ссылку в более-менее адекватном треде /зк. Еще там админ прикрутил кодкапчу в зк, на заходите аллчан.су
>>543644 Юзает много американских стартапов. В Европе в основном всякая хипстота. Изучать стоит, в двух случаях: 1. Хочешь делать хобби-проекты в одно рыло и иметь охуительную продуктивность. 2. Уже знаешь какой-то веб-стек и хочешь расширить горизонты и заглянуть в будущее.
>>542890 Пролог мёртв, но дело его живёт. Есть такая охуительная вещь - miniKanren. Это чистый логический язык программирования (более чистый чем Prolog), который изначально разрабатывался как встраиваемый в другие языки. Реализаций для разных языков овердохуя: http://minikanren.org/
Кто-нибудь уже использовал Woo https://github.com/fukamachi/woo ? Производительность впечатляет, но насколько он готов для полноценного использования? Алсо, не знал, что нодажс - такой тормоз, что даже golang дает ей на клыка.
>>544481 Очень много чего. 1. Не написано как и что меряли. 2. Нет ссылки на исходный код. 3. Какой-то рандомный выбор фреймворков, среди которых явно нет самых производительных по версиям других бенчмарков. Вот самый вменяемый бенчмарк веб-фреймворков: https://www.techempower.com/benchmarks/#section=data-r10&hw=peak&test=json (и даже он мало о чём говорит, на самом деле)
>>544548 Ты посмотрел на бенчмарк от techempower? Там тоже много веб-серверов, всё что обозначено как "Plt" (platftorm) - это по сути веб сервера. И на главный вопрос ты не ответил, почему этот Woo сравнивается с какими-то бомжами, вместо нормальных веб-серверов/фреймворков, например топ-5 бенчмарка techempower?
>>545089 >Ты посмотрел на бенчмарк от techempower? Нет, зачем он нужен, если там нет интересующих меня платформ? >И на главный вопрос ты не ответил Потому что обратился ты с ним не по адресу. >вместо нормальных веб-серверов nginx и ко явно из другой весовой категории
>>545099 Вот это и есть бенчмаркетинг: Наш веб-сервер самый быстрый (сноска маленьким шрифтом: среди бомжей). Если авторы прибегают к таким приёмам, то доверие к ним сразу как-то пропадает.
>>545165 Не понял про какую "семейку" ты говоришь. Попробую по-другому сказать: Если бы у авторов была цель показать, какое место их веб-фреймворк/платформа занимает среди других, то они бы взяли самый известный бенчмарк который есть на данный момент (тот на который я давал ссылку выше), и отправили бы туда пулл-реквест. А если у авторов цель любыми способами убедить кого-то пользоваться своим поделием, то оно возьму случайную выборку низкопроизводительных фреймворков и скажут "смотрите, на этом фоне мы не так плохо смотримся". Очевидно, что авторы woo выбрали именно второй вариант. Пользоваться платформой от таких авторов мне как-то не хочется.
>>545193 Основная цель была сравнить с ханчентутом, вуки и ещё парочкой аналогов из экосистем других языков. Нгинксы-хуинксы из того сравнения в данном случае не только не интересны, но ещё и не к месту.
>>545201 > и ещё парочкой аналогов из экосистем других языков. И эта парочка была подобранна именно так, чтобы woo смотрелся выгодно. Если бы они добавили в бенчмарк, например, netty (отнюдь не топ-1, но встречается довольно часто даже в энтерпрайзе), то было бы видно, что сравниваются сорта говна.
>>543771 Ну дык и в эрланге кусочек пролога есть. А вообще, пролог своим примером и так покащал практическую несостоятельность такого рода языков. Это всё забавно, но ненужно для 95% задач, а для ИИ есть нейронные сети.
>>543771 Не знаю, по-моему ничего живее, чем Mercury нет, но это такой Prolog + Haskell.
>>547748 В эрланге от пролога только синтаксис, не больше.
>А вообще, пролог своим примером и так покащал практическую несостоятельность такого рода языков. Просто у них весьма специфическая область действия - экспертные системы и решение логических задач. Понятно, что в мире, где 95% программирования это формочки и круды он не прижился. Хотя в своё время под управлением одного из диалектов пролога некоторые хуёвины даже летали в космос.
>а для ИИ есть нейронные сети. Там другой род задач совсем. ИИ это всё таки комплексная область. Например, для распознавания внешнего мира Пролог вряд ли бы подошёл, но вот построить на нём дедуктивную систему ИИ - хорошая идея.
Я не >>552866, но решил обмазаться PCL. Буду тут писать что к чему и как идет прогресс. Прочитал первые две главы, воткнул slime, слегка подкрутил его напильником, вполне юзабельная штука. Прочитал/переписал главу номер три, про бд для сидюков. Пока не оче понимаю про макросы, впрочем там многого и не объяснялось.
>>555186 >macro is a function that takes s-expressions as arguments and returns a Lisp form that's then evaluated in place of the macro form Макрос есть функция принимающая S-выражения в качестве аргументов и возвращающая лисповую форму, которая затем выполняется в месте вызова макроса.
Объясните мне тупому на пальцах разницу между dynamic и lexical scoped variables. Кроме того что dynamic это обычная глобальная переменная доступная отовсюду где она не перебита lexical переменной.
>>555360 http://ideone.com/gwhJDL >де она не перебита lexical переменной. После "перебивания" лексической она не становится, а так и остается динамической, но с новым значением внутри контекста. >>555196 Есть же перевод на русский. >macroexpand-1 Палю годноту: slime-macroexpand в емаксе забинжен на C-c RET. Ещё оче удобен slime-inspect по C-c I и slime-disassemble по C-c M-d
>>555392 Про самые нужные забыл: slime-compile-defun на C-c C-c и slime-eval-region на C-c C-r. Странно, что в PCL про них не рассказывается. Алсо, советую ознакомиться и с остальными возможностями и хоткеями.
>>556997 Конечно, лисповы макросы отличаются от сишного препроцессора тем, что работают с лисповыми формами, а не с текстовыми подстановками, но проблемы всплывают те же: не вычисляй значение параметров дважды, не проебывай порядок аргументов, не обосрись с совпадающими именами внутренних переменных. Пока не очень понимаю чем они настолько лучше сишных.
>>557114 >что работают с лисповыми формами, а не с текстовыми подстановками Со списками, а не лисповыми формами. >не обосрись с совпадающими именами внутренних переменных В CL макросы негигиеничные, используй with-gensyms. >не проебывай порядок аргументов Чочо? >Пока не очень понимаю чем они настолько лучше сишных. Произвольные вычисления в compile-time (по сути, в cl нет compile-time как отдельной стадии - компиляция происходит в рантайме), неограниченная вложенность макросов, ast - просто список, поэтому его легко обрабатывать. Вот тебе пример произвольных вычислений http://ideone.com/V2uHfY Идиотский, но суть понятна.
>>557171 >Твой пример подозрительно похож на eval. Это потому, что я не модифицировал код, а читал его с stdin в готовом виде. Я хотел показать, что макрос - обычная если не считать некоторых особенностей функция, возвращающая список. И что макроподстановка выполняется до тех пор, пока все не раскроются. В примере макрос yoba раскрывается дважды: (yoba) -> (progn (format ...) (yoba)) -> (progn (format ...) (progn (format ...) (print ...))) >Для какой задачи, при выборе инструмента, CL будет очевидно лучшим вариантом? Очевидно лучшим, пожалуй, будет для задач, которые ещё не имеют готовых решений, т.к. с его помощью намного проще и удобнее экспериментировать, прощупывая предметную область. А так, CL - поистине практичный язык общего назначения, и может быть использован для чего угодно: от ОС, до всяких сайтиков и йоба-игорей, но всё упирается в библиотеки. Хотя с появлением quicklisp их количество и качество возросло.
>>557181 Вот возьмем к примеру йоба-игори. Как быть со сборщиком мусора. Есть приличный профайлер, чтобы можно было найти источник генерации мусора, например?
>>557183 >Как быть со сборщиком мусора. Ну, в sbcl gc неплохой, но не лишен проблем, свойственных JVM: при сборке мусора лочится весь процесс. В коммерческих реализациях gc намного лучше. В последней версии allegrocl, например, запилили параллельный гц, теперь вообще заебись. >Есть приличный профайлер, чтобы можно было найти источник генерации мусора, например? Есть, но у каждой реализации свой. В sbcl - sb-prof
>>557225 Алсо, вот что нашёл http://habrahabr.ru/post/126543/: >Традиционно, существует Scheme, который полезен разве что для преподавания в вузах из-за скудности поддерживаемых библиотек, есть также Common Lisp, который представляет из себя ужасную, страшную неразбериху (представьте C++, но с целым морем скобок).
>Clojure, несомненно, самый популярный диалект на сегодняшний день. Некоторые люди даже поспорили бы, что это единственный Lisp, который имеет практическую ценность в настоящее время. В нем появился синтаксический сахар для большого количества типов данных, удачная интеграция с JVM, исчезли все неуклюжие части, характерные для традиционных Lisp-языков.
>>557246 Ну, ИИ - понятие довольно обширное. Да, LISP делали как язык для исседований, но CL уже как язык промышленного программирования, который должен был заменить существовавший на тот момент зоопарк диалектов.
>>557235 Кложурист. Что с него взять-то? В комментариях его совершенно справедливо обвинили в однобокости и необъективности. >удачная интеграция с JVM, исчезли все неуклюжие части, характерные для традиционных Lisp-языков Лол. Удачность аж из всех щелей прет: мало того, что java-way и lisp-way плохо совместимы, так они ещё в угоду интеграции сделали язык скриптования JVM вместо полноценного.
>>557260 Какие-то хейтеры у кложи скучные. Наверное потому что язык не сильно популярен и хейтеры про него знают в-основном по-наслышке. > мало того, что java-way и lisp-way плохо совместимы, Никто и не пытается их совмещать. Вообще, по стилю написания кода кложа ближе к ML и Haskell чем к Common Lisp и Scheme - всё иммтутабельно, вместо объектов листы/мапы/сеты и рекорды. > язык скриптования JVM вместо полноценного. В сегменте general-purpose языков программирования виртуальные машины давно победили компиляцию в нативный код. Тем кто следит за языками программирования это довольно очевидно.
>>557235 > Алсо, вот что нашёл http://habrahabr.ru/post/126543/: > 2011 Лол, тогда даже core.async и ClojureScript не было. Кстати, полезно сравнить прогресс за 4 года в Clojure и аналогичный прогресс (вернее его отсутствие) в CL/Scheme.
>>557266 >Никто и не пытается их совмещать. Т.е. интероп просто так запилили? А когда всякие AbstractFactorySingletonBean из кложурного кода пердолят - это не считается, да? >Вообще, по стилю написания кода кложа ближе к ML и Haskell чем к Common Lisp и Scheme Ближе к схеме, скорей. Вообще, если бы не ориентированность на jvm и полученные в следствие этого родовые травмы, кложура была бы неплохим языком, но увы. >В сегменте general-purpose языков программирования виртуальные машины давно победили компиляцию в нативный код. Во-первых, я говорил про то, что кложура не является полноценным, независимым языком, а всего лишь очередной скриптотой для JVM, упрощающей программирование на жаве. Во-вторых, ЩИТО? Где виртуальные машины победили? Кого? Жава-фанатик штоле?
>>557286 > А когда всякие AbstractFactorySingletonBean из кложурного кода пердолят Где ты такое видел? В Кложе спринг никогда не используют, там вместо DI легковесная библиотека для компонентов https://github.com/stuartsierra/component > Ближе к схеме, Ой не надо, в схеме постоянно set! используют. > очередной скриптотой для JVM, упрощающей программирование на жаве Кложа точно такая же "скриптота для JVM" как и сама Java - компилируется в jvm-байткод. Только Кложа компилируется по маленьким кусочкам и имеет свой небольшой рантайм. Компилятор довольно умный, делает вывод типов чтобы избежать рефлексии. В рантайме никаких dynamic call site'ов нет - вызов метода напрямую компилируется в вызов метода (в отличиии от Groovy, JRuby и прочих). > Где виртуальные машины победили? В сегменте general-purpose языков программирования. Какие в последнее время появялись языки общего назначения без виртуальных машин (подчёркиваю - общего назначения, а не языки для переписывания фаерфоксов)
>>557286 Вот поэтому в своё время и забил на этот ваш лисп, из-за столь безграмотных и безапеляционных выкриков хотя сам язык-то годен. Всюду виртуальные машины, куда ни плюнь: в питоне, в джаве, в руби, на джаваскрипте (или только в node.js?). C/C++ и подобное сейчас, походу, только там, где нужна производительность и эффективность - embedded, числодробление. Но нет, далёкие от индустрии, будем нести свой манямирок в массы.
>>557621 >Где ты такое видел? В любом более-менее практичном коде. Алсо, даже где-то в примерах с официального сайта без пердолинга говна из жавы не обходилось (то BufferedStream, то ещё какая-то параша). >Ой не надо, в схеме постоянно set! используют. Значит, ты видел неидиоматичный код на схеме. В ocaml'е, кстати, <- и := используются намного чаще. >Кложа точно такая же "скриптота для JVM" как и сама Java - компилируется в jvm-байткод. Ты меня опять не понял. Повторяю, >кложура не является полноценным, независимым языком Скриптота не в том смысле, что интерпретируемая, а в том, что она предназначена для упрощения программирования на джаве. У кложуры нет ни своих примитивов, ни исключений, никак не скрывается то, что любой объект в кложе имеет жавовскую природу происхождения. В общем, хостед язык - что с него возьмешь? >Какие в последнее время появялись языки общего назначения без виртуальных машин (подчёркиваю - общего назначения, а не языки для переписывания фаерфоксов) А какие в последнее время появились языки общего назначения с виртуальными машинами (подчерчиваю - общего назначения, а не скриптота для околоадминских задач и не ынтырпрайзщинаява)
>>557772 >в питоне, в джаве, в руби, на джаваскрипте И что из перечисленного является языком общего назначения? Ладно ещё питон можно со скрипом признать таковым, но остальное... Особенно js порадовал. >C/C++ и подобное сейчас, походу, только там, где нужна производительность и эффективность - embedded, числодробление Молодой человек, у вас манямирок протек. >Но нет, далёкие от индустрии, будем нести свой манямирок в массы. Это ты точно подметил.
>>558346 Вот тебе эрланг: "Hui bintui " ++ AnonName = foo(Bar). %- Достаем из списка смиволов, начинающихся на указанные в квачках foo({blabla, X}) -> ok; foo({plapla, X}) -> ok. %- выбираем клоз функции на основе первого элемента пришедшего кортежа
>>557698 Я бы спросил почему все используют уебищный with-gensym, когда можно написать божественную макру типа defhmacro, где сразу можно указать гигиеничные аргументы.
>>558346 [code lang=haskell] match :: Pattern -> String -> Bool match [] xs = null xs match _ [] = False match ('*':xs) str = any (match xs) $ tails str match ('?':xs) str = match xs $ tail str match ('\\':x:xs) (y:ys) = x == y && match xs ys match (x:xs) (y:ys) = x == y && match xs ys [/code] http://ideone.com/cypFd5
Сап зк. Решал subset sum problem на досуге не прибегая к учебнику. Путём проб и ошибок вывел очень простой алгоритм, но при попытке переписать его на нормальный язык, сильно пригорел. Проблема возникла в функции перебора, т.к. она сама по себе рекурсивная + надо заменить циклы через рекурсию. В общем вот работающая функция: https://ideone.com/2QybSy А вот попытка её воспроизведения на scheme: https://ideone.com/b4G21M
Что делать? Есть подозрение, что fold может спасти ситуацию, в противном случае придётся использовать continuations, а это слишком люто.
>>558578 >при попытке переписать его на нормальный язык На нормальном языке у тебя получилось бы что-то вроде: [code lang=common-lisp] (defun recombine (left right) (format t "~{~a~^ ~}~%" left) (loop :for (value . tail) :on right :do (recombine (cons value left) tail)))[/code]
>>558944 Ой все. Очевидно, без any $ tails не обойтись. Осилил твоё решение, концептуально все тоже самое что на хачкеле, только через цикл со start:end вместо рекурсии, да?
>>558968 >концептуально все тоже самое что на хачкеле Да. >только через цикл со start:end вместо рекурсии, Нет. Функция рекурсивная же. Вместо хвоста последовательности передается новый start, да.
>>558987 Конечно, практически декларативное решение этой задачи на хачкеле выглядит намного лучше, хотя о нем и сложнее размышлять, по крайней мере мне.
Интересно было-бы посмотреть на >>558928 на хаскеле. Потому что чистая функция чистой функцией, но жить без мутабельности как-то сложновато вне синтетических примеров.
>>559003 >CL оптимизирует хвостовую рекурсию? По стандарту не должен, но все основные реализации оптимизируют, кроме, может быть, ABCL, который компилирует в байт-код JVM. http://pastebin.com/ZncggVKq - всего один рекурсивный call #xC504793
>>559701 Первая очевидно хуже, т.к. ведёт себя на некоторых входных данных совсем не так, как ожидается. Алсо, зачем использовать рекурсию там, где она не нужна? [code lang=common-lisp](defun reverse (xs &aux zs) (dolist (x xs zs) (push x zs))) [/code]
>>559733 >>559733 >Хвостовая рекурсия же Которая может не заоптимизироваться на каком-нибудь ABCL >dolist и пуш разворачиваются в какой-то адовый пиздец с GO и TAGBODY Никакого пиздеца. Если закрыть глаза на пару let'ов типа (LET ((#:N-LIST893 xs)) ...), то получится вполне приличный код: [code lang=common-lisp] (tagbody loop-start (unless (endp xs) (let ((x (car xs))) (setq xs (cdr xs)) (setq zs (cons x zs))) (go loop-start))) [/code]
Зачем анону связываться с сложуропарашей, если есть sbcl? Нет, на работе ты не сможешь на этом писать, потому что тебя за это выебут никто не может в скобки кроме тебя Никаких профитов в виде гуя оно не дает, на жабе писать гуй -- ебанизм. Зачем?
>>562273 > на работе ты не сможешь на этом писать Американские стартапы с тобой не согласны > Никаких профитов в виде гуя оно не дает Свинг вполне можно использовать. Даже удобнее чем из самой Жабы получается.
>>562340 Ну она при каждом старте компилирует и загружает всю свою стандартную библиотеку. Если интересует время выполнения самой операции, то вот: http://ideone.com/c8zvZq (заодно пару ошибок исправил)
>>562357 Ну да, ну да. Циферки отображаемые на ideone это, безусловно, самое важное в языке. Ради них определённо стоит пожертвовать возможностью подключаться к работающей программе и менять её кода на лету. Ведь для олимпиадных задачек это не нужно, а вот циферками перед Васькой похвастаться - это святое.
Не за горами перекат, в связи с чем напоминаю о пока ещё существующей возможности внесения поправок, касающихся как содержимого шапки, так и её внешнего вида.
Для sicp какую схему использовать? Пробовал рэкет, но пишут, что последние версии не поддерживают язык, который используется в сикпе. "IDE" рекетовское -- кривое убогое говно, лучше уж имакс. Брать mit-scheme?
>>563008 Разве в sicp'е не обычный r5rs? Скорее всего, подойдет любая реализация более-менее живай реализация. >"IDE" рекетовское -- кривое убогое говно Тогда emacs + geiser - твой выбор. Можешь взять уже преднастроенный spacemacs.
Вот с одной стороны код на чистом cl, учитывая что мои познания о нем ограничиваются десятком глав PCL получается чуть более многословным и сложночитаемом, нежели на другой скриптопараше. С другой стороны, некоторые выбешивающие вещи няшно сворачиваются в макросы.
В связи с эти у меня вопрос: каждый лиспер юзает свой юникальны набор макросов, а ля utils.php или все-таки есть некие библиотеки или нечто подобное общее для большинства cl обезьян?
>>563081 Если каждый хаскелятор должен написать свой туториал по монадам, то каждый коммонлиспер - свою библиотеку утилит. Но вообще де-факто стандарт батареек - alexandria. Помимо александрии есть ещё с десяток библиотек: rutils, fare, metatilities, arnesi и т.д. К тому же, советую обратить внимание на iterate - более крутой и расширяемый аналог макроса loop. >получается чуть более многословным и сложночитаемом, нежели на другой скриптопараше Да, лиспу без батареек со скриптопарашей трудно тягаться.
>>563201 Один японец пытается вот реструктуризировать стандартную библиотеку и интегрировать в неё всякие александрии https://github.com/cl21/cl21 В целом выглядит неплохо, но не слишком эффективно из-за повсеместного использования CLOS. Проблема, конечно, решаема, но было бы кому.
>без этого уже стремненько Не так уж и стремненько, учитывая что софт на лиспе распространяется либо в виде образа, либо в виде исходников с описанными в *.asd зависимостями, которые сами подтягиваются quicklisp'ом.
>>562433 Ящитаю вопрос неуместен для лиспера. Всё, что есть можно использовать, а если какие-то траблы, то они выправляются своими руками и на радость сообществу.
>>564626 Я придерживаюсь диаметрально противоположного мнения. Единственный вменяемый лисп - общелисп. Со схемой и так всё понятно. Кложа - хисптерский суррогат, вундер-ява, но никак не лисп.
>>564766 M-m f e d ну или C-x C-f ~/.spacemacs , добавляешь в dotspacemacs-configuration-layers нужные слои, дальше оно само установит нужные пакеты. M-m f e h -- описание слоёв.
>>564785 Угу, уже посмотрел. Таки создает. > добавляешь в dotspacemacs-configuration-layers нужные слои, дальше оно само установит нужные пакеты Кажись понял, спасибо. При старте оно лезет в сеть и что-то качает. Где это можно выключить?
>>564793 В репы лезет вроде melpa, orgmode. И что-то при каждом запуске устанавливает, а потом что-то одно удаляет. Почему никак не удалит я хз. Уже начинаю паниковать.
Общелисп вообще не нужен, у него просто нет ниши. У всех языков есть ниша: хаскель/окамл — компиляторы, статические анализаторы, парсеры всякие, анализ данных и т д, схема/питон — скрипты и обучение, скала/кложура/жаба — бэкенд, ц — системное программированиц, ц++ — матан и всякие игры/графика и т д, всякие ады для военщины и т д.
А общелисп? Для ниши окамла он не годится из-за типизации, как замена цпп — тем более, для бэкенда инфраструктуры нет и деплоить куда сложнее, чем какой-нибудь кложур, для прикладного по или матана слишком медленный, его используют, конечно, но только фанаты, ибо для всех ниш существуют более подходящие языки.
>>564810 У спэйспмакса нет автообновления. Ты наткнулся на баг, который уже исправили в ветке develop. Делай git checkout develop и будет тебе счастье.
На каждом шагу вообще. Даже схема популярнее в продакшне по-моему, по крайне мере я знал две фирмы, использующие чикенсхем (чувак из одной из них даже писал статью в «Прктика функционального программирования»), ну и нотидоги еще используют схем в своих играх, при этом он еще для скриптов дохуя где используется, см guile.
А общелисп? Покажи вакансии, где продакшн на общелиспе? Нет его, даже по сравнению с эралнгами/окамлами это пустое место, а уж про скалу какую-нибудь я молчу.
>>564841 Вакансий мало, да. Там, где он используется, всё уже на своих местах. Речи вообще о трудоустройстве изначально не было. Если тебя этот вопрос интересует, переместись в более подходящее для подобного рода обсуждений место.
>>564847 >где в продакшне применяют общелисп Недавно натыкался на Grammarly, например. >покажи истории успеха Сам и ищи, меня этот вопрос мало волнует.
>>564851 Кокой боевой толстяк. Я не собираюсь тратить время на поиски пруфов ради удовлетворения твоего праздного интереса. Что сходу вспомнил - то назвал.
>>564811 >Чем кложур — не лисп? Тем, что это вундер-ява. >У всех языков есть ниша Не неси хуиту, у языков нет ниш. >окамл — компиляторы, статические анализаторы, парсеры всякие, анализ данных Удивительно, что ни для одной из своих ниш окамл так и не подошел. Зато стал относительно популярным на бекендах и юникернелах (mirageos). Это к слову о нишах. >Для ниши окамла он не годится из-за типизации Как не годится? А как же mezzano? >как замена цпп — тем более Да, цпп-программистов просто так на лисп не пересадить. Хотя можно попробовать им рассказать про лисповое можнозделоть, которое немного круче крестового. >для бэкенда инфраструктуры нет и деплоить куда сложнее >для прикладного по или матана слишком медленный Молодой человек, ты где эти мифы откопал?
>>564865 >Кложур не лисп!!! >Почему? >Потому что не лисп, мам, ну скажи ему
Ахуенная аргументация.
>у общелиспа нет ниш.
Поправил, не благодари.
>Удивительно, что ни для одной из своих ниш окамл так и не подошел.
Ахуеть. Обе системы доказательства теорем на нем написаны, дохуя компиляторов, например раст, синтаксических анализаторов, например от пейсбука, не подошел, что несет этот борщехлеб.
>mezzano
При чем тут это поделие?
> цпп-программистов просто так на лисп не пересадить.
Разумеется, как ты их пересадишь на язык, у которого рантайм хелловорлда тяжелее ядра ос на си?
>>564908 Можно, я давно как-то делал с помощью elscreen или чего-то такого. Но только зачем, когда есть helm-buffer-list, например. Если тебе нужны воркспейсы, то есть eyebrowse.
>>564916 Не ругайся, няша, там по англицки, я через слово понимаю. Лучше скажи почему когда заускаю емакс из консольки emacs -nw file.lisp он не открывает сразу файл, а предлагает историю редакторивания.
>>564909 >Ахуенная аргументация. С тебя пример беру. >Обе системы доказательства теорем на нем написаны Конечно, на чем ещё писать разработчикам окамля. Другие обе системы доказательства теорем написаны на лиспе по тем же причинам. >например раст >помесь c++ и ocaml Ну ты понел. >дохуя компиляторов Дохуя компиляторов написано и на сишке, и на куче других язычков. У них, наверное, тоже НИША? А может просто БИЗОН? А на лиспе-то сколько компиляторов написано... как минимум 6 полноценных. В общем, я к тому, что у языков нет ниш, есть я владею этим языком/наемные программисты владеют и существуют подходящие инструменты или затраты на их создание целесообразны. И критерии эти непосредственно от языка мало зависят. Был мало кому нужный руби с НИШЕЙ "скриптота", запили рельсы - сразу появилась другая НИША. >Разумеется, как ты их пересадишь на язык, у которого рантайм хелловорлда тяжелее ядра ос на си? Эт в эпоху-то, когда IDE кое-как умещается в 4гб памяти, а игорям и 16 мало? На самом деле, дополнительные 25 константных мб к рантайму - не так уж и много. Особенно если учесть, какие возможности это дает.
>>564926 Эт они сломали, раньше буфер с открытым файлом на переднем плане был. Могу лишь посоветовать emacsclient'ом. Тем более, что сервер в пейсмаксе запускается сам по-умолчанию. Можешь ещё флажок persistent в конфиге поставить.
А для дополнительных пакетов, как tabbar, есть dotspacemacs-additional-packages
>>564933 > Могу лишь посоветовать emacsclient'ом. Тем более, что сервер в пейсмаксе запускается сам по-умолчанию. Можешь ещё флажок persistent в конфиге поставить. Это как демон его запускать или как клиент-сервер? > А для дополнительных пакетов, как tabbar, есть dotspacemacs-additional-packages С этим я кое-как разобрался. Если коротко, то он считает сиротами все пакеты, которые ставились не через dotspacemacs-cofiguration-kayers. Верно?
>>564946 >Если коротко, то он считает сиротами все пакеты, которые ставились не через dotspacemacs-cofiguration-kayers. Верно? Что-то типа того. Те, что не прописаны как зависимости в активных слоях или просто как дополнительные пакеты, - мусор.
Именно, писались бы игры на коммон лисп, играл бы ты в змейку на топовом железе.
>Другие обе системы доказательства теорем написаны на лиспе по тем же причинам.
Лол, их всего две успешных, какие еще две, имена в студию?
>Дохуя компиляторов написано и на сишке, и на куче других язычков.
>минимум 6 полноценных.
Ну называй 6 полноценных компиляторов на коммон лисп.
>непосредственно от языка мало зависят.
Зависят, конечно, на динамическом языке ты не напишешь стабильную систему в несколько миллионов строк. А так да, согласно тезису черча-тьюринга писать можно на чем угодно, хоть на брейнфаке, только трудозатраты разные совсем.
Собсна это и есть причина, по которой никто не пользуется общелиспом: слишком жирный и убогий для скриптов, писать на нем скрипты, что писать скрипты на цпп, но при этом для прикладного софта тоже не годится, ибо медленно и динамическая типизация.
>>564966 Я имел ввиду пакеты для имакса. Для окамла кучу всего надо ставить через опам, хоть тот же кор для начала, да, только ты ему опам советуешь, а он же вроде виндузятник, там нет опама вроде.
>>564968 А, ну да, туарег. А зачем ютом в имаксе, там есть какая-то крутая интеграция с реплом? Что дает? Ну компани и прочее у него и так должно стоять, а бекенды для компани в туареге есть.
>>564971 Подтянулся емаксовский пакет, который дергает бинарник ocp-indent. Читай ман по слою, короче. >Но подсветка всё равно не работает. Быть не может. >>564972 Всё и должно было подтянуться. Для этого пейсмакс и нужен. >>564974 >бекенды для компани в туареге есть. В мерлине вообще-то. Туарег - тупо подсветка. >А зачем ютом в имаксе, там есть какая-то крутая интеграция с реплом? Что дает? Уже не помню, но себе зачем-то ставил.
>>564956 >Именно, писались бы игры на коммон лисп, играл бы ты в змейку на топовом железе. Боже! Не знал, что +25мб - настолько серьёзный оверхед. Бедные гейдевелоперы, наверное трудно постоянно балансировать около такой критической отметки. >Ну называй 6 полноценных компиляторов на коммон лисп. Только после того, как ты покажешь на окамле. Хотя бы шесть из дохуя существующих. Алсо, уверен, что тебе и без меня известно не меньше 2х на лиспе. >Зависят, конечно, на динамическом языке ты не напишешь стабильную систему в несколько миллионов строк STATIKOSEKTANT, ETO TY? Свои лживые проповеди оставь при себе. У меня сейчас емакс запущен, в котором лиспа в сумме на ~500к строк, sbcl с примерно таким же объемом. Не несколько мульёнов, но и не маленький проект. >слишком жирный и убогий для скриптов Но питон жирнее. А "убогость" ремонтируется библиотеками так же, как и в окамл, например. >писать на нем скрипты, что писать скрипты на цпп На scsh в свое время нормально писались. А из общелиспа можнозделоть и поудобнее. >прикладного софта тоже не годится, ибо медленно Ты путаешь либо с кложей, либо со схемой, которые не имеют эффективных реализаций. SBCL/CCL/LispWorks/ACL генерируют по эффективности сравнимый с сишкой код. >динамическая типизация Сектант, плиз. Алсо, sbcl частично выводит типы для оптимизаций
>>564997 >по эффективности сравнимый с сишкой код. >много всего написано >и компиляторов много, но я их не назову, это секрет >динамическая типизация эффективнее >оверхеда нет >в продакшне дохуя где используется, но пруфов не будет, сам ищи
>>565011 Что-то у тебя всё никак по существу говорить не получается. Всё тебе назови, покажи, докажи, а сам швыряешься голословщиной да передергиваешь. >по эффективности сравнимый с сишкой код. Иные сведения - огласи. >и компиляторов много, но я их не назову, это секрет Да и ты свои дохуя озвучить не торопишься.
>>564811 >Общелисп вообще не нужен, у него просто нет ниши. Общелисп - программируемый язык программирования с гомоиконностью и эффективным рантаймом и конпелятором в некоторых реализациях. Его ниша - инкрементальная разработка эффективных eDSL, начиная от форта и заканчивая этими вашими новомодными хаскелями.
>Покажи вакансии, где продакшн на общелиспе? Вакансии в основном есть для мейнстримовых ЯП. На лиспах обычно пишут прототипы во всяких стартапах, или занимаются исследованиями в CS.
Шапка - http://collabedit.com/tyt9a, текущая версия - http://pastebin.com/0tBCv2Bi
Лисп - семейство языков программирования. Характерные особенности лиспов: динамичность, гомоиконность (код как данные), программируемость.
Основные диалекты
— Common Lisp - разрабатывался как промышленный язык, пригодный для широкого спектра применения, из-за чего имеет достаточно объемную спецификацию. Является мультипарадигменным (процедурщина, функциональщина, ооп (CLOS)), с сильной, динамической типизацией. Есть опциональная декларация типов и, в некоторых реализациях (sbcl, например), частичный их вывод.
Описание особенностей: http://habrahabr.ru/post/143490
Основные реализации:
+ свободные: SBCL (нативный код), Clozure CL (нативный код), ECL (через сишку), Clisp (байт-код; небольшой размер образа; похоже, заброшен), ABCL (байт-код JVM), gcl, cmucl
+ коммерческие: LispWorks, Allegro CL, Scieneer CL, mocl (для программирования под ведро и ios)
— Scheme - это минималистичный лисп, пригодный в основном для обучения, исследований, DSL'ей. Тем не менее Racket, который основывается на схеме, вполне практичен. Racket включает в себя много подъязыков (typed racket, lazy racket, frtime racket), включая схему стандартов r5rs и r6rs.
— Clojure - Стильный, модный, молодежный лисп с бóльшим уклоном в функциональщину, иммутабельными структурами данных, поддержкой параллельщины с транзакционной памятью, агентами. Ориентированность главным образом на JVM сказалась на дизайне языка, что многим не нравится.
— Emacs Lisp - его область применения ограничивается емаксом. Является наследником ТОГО САМОГО MacLisp'а.
— Tcl - скриптовый язык, оче удобен для написания скриптиков с окошками или edsl
— Rebol
— PicoLisp - Наркоманская хуита
— newLISP - Скриптовый лисп с компактным и быстрым интерпретатором и батарейками на любой случай жизни. В первую очередь предназначен для скриптоты, которую обычно пишут на perl, python, tcl, sh: обработка текстов, работа с сетью, базами данных, взаимодействие с ОС, построение графиков и т.п.
Список возможностей: http://www.newlisp.org/index.cgi?Features
Отличия от других диалектов: http://www.newlisp.org/index.cgi?page=Differences_to_Other_LISPs
Что читать?
— Common Lisp
+ Practical Common Lisp http://www.gigamonkeys.com/book/ или русский перевод — http://lisper.ru/pcl/
+ On Lisp http://www.paulgraham.com/onlisp.html
+ Common Lisp HyperSpec http://www.lispworks.com/documentation/HyperSpec/Front/ — стандарт языка
+ Art of Metaobject Protocol — подробное описание MOP и CLOS
Алсо, годная статья про проектирование eDSL'ей на CL http://swizard.info/articles/solitaire/article.html
— Scheme
+ http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme.html
+ Racket Guide
+ SICP (это скорее вводные лекции по программированию, а не учебник по схеме, но тоже пойдет)
— Clojure
+ Programming Clojure, 2nd edition (для новичков)
+ The Joy Of Clojure, 2nd edition (есть есть бэкграунд в Лиспе или ФП)
— Tcl/Tk
+ Официальный учебник http://www.tcl.tk/man/tcl8.5/tutorial/tcltutorial.html
+ Документация по tcl http://www.tcl.tk/man/tcl8.6/TclCmd/contents.htm и tk http://www.tcl.tk/man/tcl8.6/TkCmd/contents.htm
+ Статьи про Tcl и Tk на wikibooks с примерчиками https://en.wikibooks.org/wiki/Category:Tcl_Programming
+ TkDocs с примерами на tcl, perl, ruby http://www.tkdocs.com/tutorial/index.html
Среды разработки
Одно из основных преимуществ лиспа в сравнении с языками с циклом разработки "написал → перекомпилировал → запустил в отладчике" - поддержка интерактивно-итеративного метода разработки. Но без инструментария, обеспечивающего полноценное взаимодействие с реплом, оно сводится на нет. Поэтому писать без использования нормальной среды - значит упустить важную особенность языка.
— Common Lisp
+ Emacs + SLIME - самый лучший вариант.
+ vim + SLIMV
+ LispWorks
+ AllegroCL IDE упаси боже
+ Eclipse + cusp
+ <Что-нибудь для сублайма/атома уже запилили, наверное>
— Scheme
+ Emacs + geiser
+ drracket
— Clojure
+ Emacs + CIDER
+ LightTable
+ Vim-fireplace
+ Cursive Clojure (IntelliJ plugin)
+ Counterclockwise (Eclipse plugin)
— Tcl
+ Emacs + tcl-mode (только подсветка синтаксиса и простенькое взаимодействие с реплом, но жить можно)
Чтобы не пердолиться с емаксом, можно взять уже преднастроенный spacemacs ( https://github.com/syl20bnr/spacemacs ) или prelude ( https://github.com/bbatsov/prelude ).