Лисп - семейство языков программирования. Характерные особенности лиспов: динамичность, гомоиконность (код как данные), программируемость.
Основные диалекты — Common Lisp - разрабатывался как промышленный язык, пригодный для широкого спектра применения, из-за чего имеет достаточно объемную спецификацию. Является мультипарадигменным (процедурщина, функциональщина, ооп (CLOS)), с сильной, динамической типизацией. Есть опциональная декларация типов и, в некоторых реализациях (sbcl, например), частичный их вывод. Описание особенностей: http://habrahabr.ru/post/143490 Основные реализации: + свободные: SBCL (нативный код), Clozure CL (нативный код), ECL (через сишку), Clisp (байт-код; небольшой размер образа; похоже, заброшен), Clasp (llvm; ориентирован на интероп с c++), ABCL (байт-код JVM), gcl, cmucl + коммерческие: LispWorks, Allegro CL, Scieneer CL, mocl (для программирования под ведро и ios) — Scheme - это минималистичный лисп, пригодный в основном для обучения, исследований. Тем не менее, Racket вполне практичен. Racket включает в себя много подъязыков (typed racket, lazy racket, frtime racket), включая схему стандартов r5rs и r6rs. — Clojure - Стильный, модный, молодежный лисп с бóльшим уклоном в функциональщину, иммутабельными структурами данных, поддержкой параллельщины с транзакционной памятью, агентами. Ориентированность на JVM сильно отразилась на дизайне языка, что многим не нравится. — Hy - Lisp-синтаксис для Python с анафорическими макросами — Emacs Lisp - его область применения ограничивается емаксом. Является наследником ТОГО САМОГО MacLisp'а. — Tcl - скриптовый язык с немного наркоманскимстранным синтаксисом. Из коробки множество батареек на любой случай жизни, среди которых неповторимый Tk. Язык очень удобен для написания скриптиков, особенно когда к ним требуется приделать графический интерфейс. — 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
— Clojure + Programming Clojure, 2nd edition (для новичков) + The Joy Of Clojure, 2nd edition (есть есть бэкграунд в Лиспе или ФП) + Попрактиковаться можно на Exercism'е http://exercism.io/languages/clojure
Среды разработки Одно из основных преимуществ лиспа в сравнении с языками с циклом разработки "написал → перекомпилировал → запустил в отладчике" - поддержка интерактивно-итеративного метода разработки. Но без инструментария, обеспечивающего полноценное взаимодействие с реплом, оно сводится на нет. Поэтому писать без использования нормальной среды - значит упустить важную особенность языка.
— Common Lisp + Emacs + SLIME - самый лучший вариант. + vim + SLIMV + LispWorks + AllegroCL IDE упаси боже + Eclipse + cusp + <Что-нибудь для сублайма/атома уже запилили, наверное?>
Сап, гайз. Я тут решил окончательно упороться и запилить маленький вебапп на лиспе. Насколько полноценны местные фреймворки? CSRF, JSON-RPC, REST, ORM и другие баззворды поддерживаются?
>>705206 чтобы понять и начать использовать как работают исключения в мейнстрим языках, нужно сломать голову чтобы понять как работают продолжения, сопрограммы в альтернативных языках нужно тоже а соответсвенно чтобы понять работу сигналов в лиспе нужно этот заеб перемножить один на другой..
http://picolisp.com/ https://habrahabr.ru/post/247965/ Лиспаны, что думаете насчёт этого странного, наркоманского язычка, именуемого пиколиспом? Вроде и из коробки всего полно, и ffi не замороченный, и веб-гуй пишется удобненько, и на ведро ставится без всяких танцев. Но какой-то он... ебанутый.
>>706390 Но кложура - не лисп. Это вообще не язык программирования, а такой хипстерский дсл для скриптования жавы. Специально для тех, кому надоело программировать на xml.
>>706909 Возможно, его вытеснили скриптопараши вроде перла, питона и пыха везде, где все возможности лиспа все равно были не нужны. В целом появляется все больше и больше специализированных языков и они утаскивают прогеров из метаязыков. А чтобы вытащить из жабы быдлокодера, ему еще нужно объяснить, зачем ему все эти фичи.
>>706944 Но как так вышло? Ведь было же сообщество. Куда оно проебалось? Впрочем, пых питон и прочая дристня действительно гораздо более дружелюбны к новичкам.
>>710181 Общелисп и есть самый настоящий промышленный язык. Учись пользоваться гуглом. Фреймворки и сообщество есть, но немногочисленгое. Но не количество главное.
>>713883 >Критики нового стандарта указывали на его раздутость и чрезмерное внимание, уделённое практическим требованиям, что привело к нарушению «функциональной чистоты» Лиспа и увеличению объёма поддерживающих его Лисп-систем.
>Более существенно то, что Интерлисп базируется на динамическом связывании, тогда как все новые версии Лиспа — статические.
Кто-нибудь пояснит что за "функциональная чистота" такая нарушилась после стандартизации и что за динамическое связывание было вместо которого запилили статические?
>>713894 Может быть, под статическим связыванием подразумевается лексическая область видимости? А функциональной чистотой, насколько мне известно, ни маклисп, ни интерлисп никогда не отличались.
Антош, где-то видел список основных операторов (что-то около 12) на которых написано все остальное. Подскажи пожалуйста - никак не могу найти. Хочу писать только на них
>>715415 В общем посмотрел я на определения функции cond when and в sbcl. и все они написаны с использованием только if. Получается я могу только на if все писать. Вот же откровение.
Как сделать так, чтобы одна функция обрабатывала данные, поступающие в реальном времени, обрабатываемые параллельно 2(или больше) другими функциями? Я слышал, что Лисп может в подобную параллельную обработку или что-то такое.
>>715878 В том что при интерактивной разработке ты наслаиваешь приложение постепенно, как будто создаешь скульптуру. Ты мгновенно получаешь обратную связь и работаешь с образом своего приложения, а не работаешь по стандартному циклу "Отредактировал, сохранил, перезапустил". Реплы во всем что я пробовал кроме лиспа годятся только для проверки тривильных вещей, а не для полноценной разработки.
>>715885 Говно ваша интерактиваня разработка. На нормальной статике в нормальной можно написать целый модуль без твоих циклов "Отредактировал, сохранил, перезапустил", потом этот модуль собрать, и он будет как положено работать.
>>716566 Это все тот же всем настоебавший lisp-1 vs lisp-2. Лично мне больше нравится явный funcall, потому что я вообще не с первого раза вдуплил в середине другого куска кода что ((XYNTA) .!)))345)) это вызов функции собранной в результате вычисления.
чтяднт? Надо выделить ЦЕЛЬ в ((1(2(3 4 цель)) вот так все работает (car (cdr (cdr (car (cdr (car (cdr (car '((1(2(3 4 цель)))))))))))) Но когда я пытаюсь в сокращение (caddadadar '((1(2(3 4 цель))))) то * (caddadadar '((1(2(3 4 цель)))))
debugger invoked on a UNDEFINED-FUNCTION in thread #<THREAD "main thread" RUNNING {1002A8AEE3}>: The function COMMON-LISP-USER::CADDADADAR is undefined.
Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name): 0: [ABORT] Exit debugger, returning to top level.
>>717847 можно (caddar (cdadar '((1(2(3 4 цель)))))), а можно и самому определить (defun caddadadar (x) (car (cdr (cdr (car (cdr (car (cdr (car x)))))))))
Какой способ именования лучше: "foo?" или "is-foo"? Первый вариант чуть-чуть лаконичней, но я спотыкаюсь на его чтении. Второй вариант длиннее, но в голове его удобно проговаривать — "из фу" он и есть "из фу", пауз при чтении не возникает. Что является стандартом и почему?
Я занимаюсь по http://progbook.ru/lisp/409-hyuvenen-mir-lispa-tom-1-vvedenie-v-yazyk-lisp.html Мир Лиспа. Том 1. Введение в язык Лисп и функциональное программирование В отличии от Practical Common Lisp там практические примеры после каждой главы и подача материала легко усваивается. Что скажите про нее? Щитаю, что она оптимальна для ньюфага.
>>719246 Вроде это для макросов ридера, т.е. переопределение того, как текст преобразуется в s-exp, например, можносделоть инфиксную арифметику и т.д..
>>719246 Для вычисления выражения на стадии чтения s-exp'а. >>719297 Читает строку из файла и подставляет её в выражение, а потом уже раскрывается макрос defsystem
за спиной пара интерпретаторов на scheme, недописанные веб сервер на ней же, ворох других мелких проектов, стоит ли вкатываться в Common Lisp? Если да, с чего лучше стартануть? Интересуют темы метаязыковой абстракции, ии, возможно, анализа евстественного языка
Я посматриваю за тредом иногда. Пиздец, почему такой долбоебизм царит?
Кложа/Clojure охуенна. Причин несколько: - очень развитое комьюнити - иммутабельные структуры данных, что избавляет от рейс кондишенов и позволяет удобно писать асинхронный код - core/async, stm, атомарность, промисы - Clojurescript, где комьюнити тоже совершенно охуенное: есть ом, реагент, куча других либ и биндингов - Отличные макросы (да, есть и в CL) ... Список достоинств можно только продолжать. Короче, реально писать не на Кложе вообще смысла не вижу. Главный недостаток это JVM с невозможностью реализовать tail call elimination, stop the world'ом (для сравнения Ерланг/Эликсир -- в BEAM такого нет, там каждый актор заводит свой хип) и долгим стартом (особенность JIT в JVM).
И да, если вам понадобятся Акторы, то есть вполне рабочие биндинги к Акке.
В общем, программисты выбирают Кложу, а диванные кукаретики продолжают срать под себя. Хуйню тут развели блядь какую-то.
>>720688 Опять набрасываешь, ирод? На кложе никто не пишет, кроме хипсторов-вебпетухов. И то там кложескрипт, а не сама кложа. Все преимущества, что ты перечислил, сводятся на нет одним базовым принципом кложи - плотной интеграцией в хост-язык, которые имеют совершенно иную, нихуя не совместимую с лиспом идиоматику. Поэтому код на кложе, как правило, представляет из себя ту же яву/яваскрипт, но с чуть отличающимся синтаксисом и немного подсахаренный.
>>720688 >>720688 > Главный недостаток это JVM с невозможностью реализовать tail call elimination Используй loop-recur, он компилируется в цикл > stop the world'ом Для больших хипов есть Zing VM от Azul > (для сравнения Ерланг/Эликсир -- в BEAM такого нет, там каждый актор заводит свой хип) Если у тебя есть большой кусок данных, то он всё равно должен хранится в хипе какого-то актора, смекаешь? > И да, если вам понадобятся Акторы, то есть вполне рабочие биндинги к Акке. Нахуй акторы, есть core.async
>>720688 Но то же самое есть и в общелиспе. Только в отличие от кложи он является языком полноценным, а не дырявойыми оберткойами (таки три платформы - три разных языка) вокруг жавы, жс и додиеза.
>>721051 > В ерлаше бинари >64КБ идут в отдельный хитровыебанный бинарный хип. Что такое "бинари"? Большой вектори или мапа это "бинарь"? И какой в этом бинарном хипе GC алгоритм? > Это неудобно. Шта? По-твоему акторы удобнее чем CSP?
>>721133 Вся его развитость заканчивается на лойсах на гитхубе, участии в хипстохакатончиках и, в редких случаях, запиливании недоделанной оберточки над жава/жс-библиотечкой. Вот у хаскела сообщество можно назвать развитым, там действительно наблюдается движение.
>>721132 Что такое "бинари"? Бинарный тип данных. > Большой вектори или мапа это "бинарь"? Нiт, но при желании их обоих можно скастовать в бинари. Ну или получить такие сразу, из сети/файла/мемори. >И какой в этом бинарном хипе GC алгоритм? Висят до тех пор, пока на них не останется ссылок откуда бы ни было. В остальном как обычно.
>Шта? По-твоему акторы удобнее чем CSP? Разумеется. Анониманя связь по каналам говно, работать без примитивов процесс/узел крайне неудобно. Модель акторов - это самый общий конкурентный концепт, средствами которого можно выразить большинство остальных, тот же ССS или CSP, обратное невозможно.
>>721307 > Модель акторов - это самый общий конкурентный концепт, средствами которого можно выразить большинство остальных По твоей логике GOTO - самый удобный концепт управления ходом программы, потому что через него можно выразить все остальные.
Анончики, так уж вышло, что для экзамена мне придётся выучить autoLisp. Посоветуйте годноты. Алсо, сам уже больше года пилю бэкенд на дотнете, специальность обучения интересная, вот и не ливаю из универа
>>721357 Врядли здесь кто-то из анонов хоть раз щупал этот автолисп. Если не найдется нормальной литературы по автолиспу, попробуй поверхностно проштудировать pcl (ссылки в шапке), чтобы раобраться что да как.
Мне надо построить массив, привязанный к пикселям в виде 3дэ сферы, а также чтобы в зависимости от функций, изменяющих числа массива менялся цвет тех пикселей, что привязаны к массиву. Что посоветуете для всей этой графики на лиспе?
Гайс, помогите плиз. Нужно сделать лабу по автолиспу, а в нем я не особо шарю. Достаю из файла строку, например "-1 10 9.87 -4.08". Как мне сделать из нее лист чисел, чтобы потом их можно было отсортировать по знаку, большее/меньшее, целые, дробные и тд.
Просто функции, которые вызываются в динамическом контексте.
Что такое динамический контекст? Это список, хранящийся в динамической переменной, которая перебинживается дополненной cons-ячейкой каждый раз когда ты делаешь handler-bind (или там restart-bind для рестартов).
Ниже про сигналы. Про рестарты +- все то же.
В списке хранятся пары typespec -> функция.
Каждый раз когда ты из скопа соответствующей динамической переменной выходишь, соответственно, список возвращается к предыдущему состоянию.
Что происходит при signal? Она просто берет, проходится по списку, соответственно снизу вверх, получается, и вызывает все функции, для которых (typep <кондишн который ты ей дал> <соответствующий typespec в паре>) возвращает не nil.
Что происходит при warn? То же самое, только если не произошла раскрутка стека, функция еще и пишет message кондишна в stderr.
Что происходит при error? То же самое, только если не произошла раскрутка стека, выполняется функция invoke-debugger, которая зависит от реализации.
Что такое раскрутка стека? Это процесс нелокального выхода из точки в коде. Т.е. это операторы throw, return-from и go. В процессе раскрутки стека снизу вверх вызываются защищенные формы unwind-protect.
handler-case отличается от handler-bind тем что функции-обработчики он за тебя генерирует сам, и в конце каждой помимо твоего кода генерирует оператор return-from, т.е. инициирует раскрутку стека к текущему блоку.
Привет, lisp'аны. В общем, я читал SICP, делал задачки, что-то получалось. В общем, такой вопрос: я уже прочитал 3 главу целиком, перешел к 4 и ничего не понимаю. Точнее, если напрягаюсь, то понимаю, но мне стало неинтересно. Есть ли смысл читать после 3 главы? Отпишитесь, а то я не знаю, как-то жалко бросать начатое, но в главе про интерпретатор столько всякой мути, что аж рили неинтересно.
>>736067 а что ему дальше останется, 5 глава, которая целиком опирается на 4ую?(из интерпретаторов ваяем компиляторы) >>736019 вообще, если с английским хорошо, можешь лекции на ютубе глянуть(MIT, ведут сами Сассман, Абельсон, на рутрекере видел еще 2010 года лекции из Беркли, но не смотрел)
>>736612 Я неточно выразился, я не несгласен, я просто его аргумент убедительным не нахожу. То, что теперь инжинерия поменялась таким образом, как он сказал, вовсе не означает, что тут же студентоту надо учить мануалы читать. Помему, свои костыли и велосипеды ценнее в практическом смысле, чем использование чужих. Именно при обучении, не в работе.
>>736443 Автор потихоньку мержит в апстрим, а пока самое свежее тут: https://github.com/TatriX/kite-mini.el Прикрутил отправку сообщений в консоль. Например, если во время загрузки скрипта все пошло по пизде, мы увидим пикрелейтед.
>>737261 А чо там, полное обговление кода без проблем проходит? Ну т.е. допустим, пишу я код на каком-нибудь йобаскрипте, потом модуль транслирую в жс и отправляю браузеру. Он нормально обновится?
>>738276 На работке пользуемся. Когда я проект начинал про неё еще никто не слышал. >>738278 В данном проекте принципиально. Воообще у всех транспайлеров есть куча проблем, с которыми не очень хочется ебаться. Даже несчастный babel и тот мозг ебет, что уж говорить про остальных.
>>740059 Clojure объективно не дотягивает до CL. Как язык - никакой. Производительность - так себе. Ну про минусы JVM даже лень рассказывать. Там много говна, начиная от recur, и заканчивая невозможностю нормально делать hot code reload и невнятными стектрейсами.
Единственно, что выделяет Clojure, это огромнейший хипстерский хайп вокруг нее, и соответственно, допизды всяких библиотек(95% из них подчиняются известному правилу, но есть и годные). Соответственно, больше людей, в том числе тех у кого что спросить можно.
>>740061 > Как язык - никакой. Гораздо продуманней чем CL. > Производительность - так себе. Лучше чем у CL, если расставить пару тайпхинтов > невозможностю нормально делать hot code reload Что блять? Любой динамический var свапается в любой момент. Ты, видимо, не знаешь как на низком уровне делается code reload и веришь в какую-то магию.
>>740278 >Лучше чем у CL, если расставить пару тайпхинтов Ага, видел я эти "пару тайпхинтов", когда код переписывается в ещё более нечитабельную яву-дрисню со скобками.
>>740278 >Что блять? Насколько мне известно, там обновление кода через жопу сделано, из-за чего на ведроиде приходится сначала генерировать dex, а потом подгружать. другой анон, если чо
>>740309 Нет. Сообщество то же - все кто используют ClojureScript на фронте, используют Clojure на бэке. Библиотеки, не работающие напрямую с платформой, работают и там и там. Например core.async - библиотека CSP и корутин - работает и там и там. Timbre, specter, instaparse, да практически все либы, которые имеет смысл делать кроссплатформенными - сделаны кроссплатформенными (после того как в 1.7 ввели reader conditionals).
>>740380 С Андроидом ситуация такая: Dalvik не позволяет использовать classloader в рантайме. А в Clojure всё на этом построено, т.к. исполнение коде в рантайме делается через класслоадер. Поэтому для Android приходится делать AOT компиляцию и отказываться от исполнения кода в рантайме. На других JVM таких проблем нет.
>>740385 >Сообщество то же - все кто используют ClojureScript на фронте, используют Clojure на бэке. Судя по проектам на гитхабе, пишут только на кложескрипте, видимо на серверную сторону выбирают что-то полегче jvm. >Библиотеки, не работающие напрямую с платформой Таких не бывает. >Например core.async Насколько я помню, там код продублирован отдельно для кложескрипта и отдельно для кложуры. >>740388 Ну ок. А существующие объекты после обновления класса используют новую или старую версию?
>>740398 > Судя по проектам на гитхабе, пишут только на кложескрипте, видимо на серверную сторону выбирают что-то полегче jvm. Из чего ты деалешь такие выводы? Не знаю ни один проект, где так делают. > Таких не бывает. Смотри список выше. > Насколько я помню, там код продублирован отдельно для кложескрипта и отдельно для кложуры. Да, действительно. Но там дело в том, что она вышла во времена 1.6, а переписывать они не стали. Посмотри остальные популярные либы, там всё через *.cljc
(defn read-response [^BufferedReader in] (let [sb (StringBuilder.)] (loop [sb sb c (.read in)] (cond (= c 1) (let [ret (str sb)] (print ret) (recur (StringBuilder.) (.read in))) (= c 0) (str sb) :else (do (.append sb (char c)) (recur sb (.read in))))))) [/code] Разве могут быть в __таком__ языке библиотеки, на работающие с платформой. И ты ещё что-то про бóльшую продуманность говорил.
>>740398 > Ну ок. А существующие объекты после обновления класса используют новую или старую версию? Там не сам класс меняется, а используется фича исполнения кода при загрузке класса. Динамичность достигается через varы, которые можно свапать (с определённой семантикой).
>>740435 Это ты у рича хикки спроси, почему он повсеместно использует подобную дрисню вместо того, чтобы один раз сделать нормальную обертку. >>740427 >Из чего ты деалешь такие выводы? Я как-то искал хоть какие-нибудь проекты на кложуре. И это оказалось не так-то просто, везде один лишь кложескрипт. >>740433 А, понял. Ну а с объектной системой как? Допустим, написал я в кложе класс, создал несколько объектов, а потом класс изменил.
>>740438 > Это ты у рича хикки спроси, почему он повсеместно использует подобную дрисню вместо того, чтобы один раз сделать нормальную обертку. Обёртка есть c версии 1.0, называется slurp: https://clojuredocs.org/clojure.core/slurp Кусок кода с BufferedReader выложен на сайте чтобы проиллюстрировать интероп с JVM.
> Я как-то искал хоть какие-нибудь проекты на кложуре. И это оказалось не так-то просто, везде один лишь кложескрипт. Просто странная привычка выкладывать искходники продакшен кода есть только у фронтендчиков. И то, примеров кроме Circle CI я на знаю.
> Допустим, написал я в кложе класс, создал несколько объектов, а потом класс изменил. Если ты имеешь в виду deftype или defrecord, то их можно менять в рантайме:
"deftype and defrecord dynamically generate compiled bytecode for a named class with a set of given fields, and, optionally, methods for one or more protocols and/or interfaces. They are suitable for dynamic and interactive development, need not be AOT compiled, and can be re-evaluated in the course of a single session." (http://clojure.org/reference/datatypes#deftype_and_defrecord)
>>740481 >Кусок кода с BufferedReader выложен на сайте чтобы проиллюстрировать интероп с JVM. Тот кусок кода взят из реализации кложескрипта с гитхаба.
>>740662 Нашёл. Это используется в чтении ответа от процесса ноды. В обычной жизни такое пишется нечасто. Кстати, в каких языках (кроме Эрланга) читать бинарный поток удобнее?
>>740767 Да там в любой модуль загляни - везде ява-кишки ковыряют. >Кстати, в каких языках (кроме Эрланга) читать бинарный поток удобнее? Ну, как-то на общелиспе pbf разбирал. Вроде не так уж и плохо, хотя эрланговским сопоставлением с образцом было бы удобнее, да.
Хотя я так и не понял, почему все так хвалят его за то что он на JVM, а сами JVM не любят и стараются использовать поменьше.
Ну и да, никаких ридер-макросов, код-релоад через жопу, кривое и тормозное STM, нет нормальных примитивных структур данных, нет нормального ООП, макросы говно, мультиметоды - пародия на коммонлисповые, нет сигналов, РЕПЛ ДЛЯ ЕМАКСА ЗАПУСКАЕТ ДВА ЖАВАПРОЦЕССА ПО 600 МЕГАБАЙТ ОПЕРАТИВКИ БЛЯДЬ(у того же SBCL тихо крутится 50мб от силы, и это на 64бит).
ClojureScript хорош(но разве что по сравнению со скалажс и собсно жс)
А еще вокруг Clojure куча тупых хипстеров и хайп, что дичайше бесит.
>>740845 рекомендую потыкать CL, разница станет очевидна
кодрелоад в JVM это само по себе анал и боль, но в Clojure это вообще смерть как закостылено. Вроде работает, но не как в CL. Макросы слабее. У них не определена семантика, меньше спецформ(macrolet? symbol macros? Не, не слышали. lexenv в макросах? Похуй, сделаем хоть чо то[тут рекомендуется сравнить с SBCL, есличо]). Мультиметоды рядом даже с CL не стояли. В CL дичайшая система обобщенных функций, которая вся выражается через MOP, и компиляцию в рантайме. Еще там классы крутые, но это отдельная история. Короче после CL - Clojure кажется поделкой на коленке.
Ну и да - кто там говорил про продуманность Clojure выше? Не особо она продуманная, это скорее что-то типа Python - типа, сделаем на глазок, быстренько и красивенько, поднимем хайп, а на остальное похуй. CL же - это результат эволюции нескольких передовых лиспов из 80х плюс комитет умнейших чуваков, заседавший 10 лет.
>>740851 Жалко только что они из этих лиспов кучу легаси притащили. А еще напрягает что в стандартной либе нихуя нужного нету. Впрочем, есть квиклисп. Но хочется чтобы хотя бы как в елиспе было: на каждый чих готовая функция.
>>740964 cl21 это в осн. синтаксический сахар. А у меня там задатки на норм стдлиб, на функциональность. Слизываю с CLR потихому, но а откуда еще слизывать? >>740976 работы дохера >>740960 - Неконсистентность семантики("чойта тут воткунто?" пример - print - функция или встроенное чото? Или там, лямбды) - Плохая обратная совместимость, конфликт 2 и 3 - Тормоза. Бля, CPython(99% питона в мире) тормозит как пиздеееееец. Бедная gentoo евпоча. - GIL - Общая, какая-то, ну не знаю, нейстройность языка. Ну вот нахуя можно использовать окружение как dict? Что за ебаный бред? Это же не скомпилировать, и не оптимизировать нормально. Что за self как явный аргумент, хотя у нас классическое классовое ООП, а не JS, и не смоллтолк? Итд. - Куча хипстеров, с говнобиблиотеками, которым дай волю, ядро прыщей на питон перепишут. - Вообще, все это easy(в противоположность simple), типа php, питона итд, оно провоцирует говнокод и непрофессионализм в программировании. А потом мы удивляемся, почему так упали рейты. - Итд. Спать хочу, забыл апрельские тезисы
>>740991 два самые крутых проекта, которые я когда-либо делал для опенсорса на CL, это virgil и doors. На гитхабе есть: https://github.com/Lovesan Первый - FFI с подходом полной сериализации в/из сишной памяти. Типа, абсолютно прозрачная работа с сишкой и вообще foreign кодом как с лисповыми объектами. Doors - интерфейсинг WinAPI, но самая доделанная часть, за которую мне не раз спсб говорили - это интерфейс к COM. Можно в т.ч. и создавать свои COM-сервера(для SBCL и других не умеющих в DLL только out-of-process ессно).
>>741000 >cl21 это в осн. синтаксический сахар. Ну не совсем. Там больше реструктуризация, избавление от устаревешего говна, прикручивание всяких александрий. >Слизываю с CLR потихому, но а откуда еще слизывать? С дотнета шоле или того забытого проекта или он не clr звался, а как-то похоже обновления общелиспа? >Бедная gentoo евпоча. Она бедная из-за libbash, а не только питона.
>>743663 > deleting unreachable code > --> LET IF AND IF AND THE IF PLUSP > А, может быть, там подставляется проверка аргументов на неотрицатльность, а затем удаляется, т.к. из их типов ясно, что они положительны.
>>744283 >Это ж просто интерпретатор, а не образ лисп-системы как у общелиспа А чем ньюлисп хуже/неполноценнее нормального (того же общелиспа)? Нельзя компилировать код в екзешник или что? Я просто сейчас книжку читаю http://www.fuzzylisp.com/book.html там все примеры на ньюлиспе, возможностей там явно не меньше, чем в каком-нибудь пистоне.
Сап аноны. У меня "трагедия", я пишу на ruby за денюжку в одной конторе вот уже почти 5 лет. В последний год раби мне с каждым днем становится противен не знаю пока почему. Решил посмотреть в сторону Си, начать сначала так сказать. но нет. Читаю сейчас SICP, делаю упражнения и вы знаете, для меня будто открывается новый мир совершенно иной настолько яркий. Лисп очень крутой язык. Паралелльно посмотрел на clojure. Прочел статью Пола Грэма http://www.nestor.minsk.by/sr/2003/07/30710.html и тут понеслись у меня мысли. Посоветуйте мне на какой путь встать? Продолжать дальше писать на руби и не рыпаться, пересесть на Лисп? Но какой? Common Lisp? Clojure?
>>750771 Почему "или"? Продолжай писать на руби и перекатывайся на common lisp. Если даже не найдешь ему платного применения, то получишь хотя бы полезный опыт.
>>750771 Однозначно кложура - она сейчас на переднем крае во всех перспективных областях. Достаточно посмотреть на список книжек на любой помойке типа http://it-ebooks.info/tag/clojure/ . Кложуру за несколько лет продвинули в разы дальше, чем коммонлисп за все 160 лет его существования.
Не могу осилить трансдюсеры. Вроде всё понятно, но у меня какое-то постоянное ощущение, что это какое-то неправильное костыльное говно, а Рич Хикка наркоман.
>>752124 >Однозначно кложура - она сейчас на переднем крае во всех перспективных областях. Или, если перефразировать, часть вебжавахипстеров, что не осилила скалу, использует кложу. На этом её применение заканчивается. >Кложуру за несколько лет продвинули в разы дальше, чем коммонлисп за все 160 лет его существования. Кложу никуда не продвигали, она паразитирует на жвм и лиспах. >>750771 В общем, не слушай этих жвм-сектантов. Кложа, если сравнивать с общелиспом, довольно дряной язык: ни сигналов, ни нормального ООП, ни эффективных реализаций, и всё это помножается на многочисленные минусы жвм и жавы, которая там изо всех щелей проглядывает >>740428
Лиспаны, с помощью MOP как-нибудь можно внедриться в процесс генерации сеттеров? Хочу добавлять свой код к телу сеттера, но не хочу занимать after-метод, т.к. он может понадобиться программисту. Что делать?
>>752759 Аноны, когда будете читать тот пост помните о том, что его пищет 27-летняя нищая пидораха, которого выперли (не взяли) со всех адекватных работ и он разразился соплями в одном из соседних тредов.
>>752759 > она паразитирует на жвм и лиспах. Ваще-то это лиспы сейчас паразитируют на кложуре. Народ сначала осваивает ее, а потом в редких случаях интересуется подножием эволюционной лестницы :)
> ни сигналов Зачем они?
> ни нормального ООП Нормальное там ООП.
> ни эффективных реализаций Под JVM и JS - какие тебе еще нужны реализации?
> и всё это помножается на многочисленные минусы жвм и жавы Часть чуда-то как раз в том, что кложура работает на жвм, интероперабельна и хорошо встроена в инфраструктуру.
>>753488 Наоборот, тащемта. >>753182 >> ни сигналов >Зачем они? В каком смысле? Ты не знаешь, что это такое? Или не понимаешь, как их использовать? >Под JVM и JS - какие тебе еще нужны реализации? Эффективные, написал же. >Часть чуда-то как раз в том, что кложура работает на жвм, интероперабельна и хорошо встроена в инфраструктуру. Ага, один большой неидиоматичный "плюс" >>740428 Уж если бы я оказался прикованным к жвм, то предпочел бы скалу, котлин, которые намного более гармонично вписываются в жава-мир и у которых хотя бы эффективный код на выходе, или в крайнем случае саму жаву, но никак не этот сплошной недостаток с именем "кложура" >>753134 Эко ж тебя, успешного кложуриста-первокурсника, порвало.
Всем снова здравствуйте! Спасибо всем за ответы но вы меня еще больше запутали. я сейчас решил почитать The Land of Lisp, а там посмотрю и Common Lisp и Clojure.
Сап, лиспаны. У меня тут какая-то странная проблема нарисовалась. Ставлю sbcl, ставлю на него quicklisp. Выясняется, что встроенный asdf устарел, и надо бы накатить версию посвежее. Качаю дист, запускаю install-asdf.lisp. Пробую поставить какой-нибудь пакет через быстролисп. Работает, радуюсь. Пробую сегодня - некоторые пакеты валятся с ошибкой Unknown &KEY argument :NAMESTRING При вызове uiop/pathname:ensure-pathname путь к uiop :NAMESTRING :NATIVE :ENSURE-DIRECRORY T). Как я понял, в вызов не передается путь к либе. А почему, я так и не понимать.
>>740701 Tcl задрочен на строках, а в остальном схожесть с лиспом не больше, чем у других языков, на которые повлиял последний. Он не больше лисп, чем JavaScript, например. INB4 "Да я овер 100 тисиэлевых килослоков на коленке за вечер пишу, ко-ко-ко…".
>>705167 (OP) Я понял!!! Динамические петушки - контрамоты. Они движутся во времени назад. Как было на самом деле: протоцепепе - ЛИСП 50-80 гг. C++ 80-90 гг. Haskell - новая версия цепепе. 90-00 гг. С точки зрения лиспопетушка сначала был Хаскель, в следующей версии он деградировал до цепепе, а в лиспопетушином будущем цепепе деградирует до лиспа. А я все ломал голову, как человек может так ненавидеть будущее, так привязаться к прошлому, что пишет на лиспе? Но для лиспопетушка-контрамота лисп - это и есть будущее. А дальше ВВ2, индустриальная контрреволюция, религиозные войны, рабовладельческий строй, отрастание хвостов и подъем на деревья. Скай из зе лимит!
Почему для того чтобы нарисовать простенький график(https://goo.gl/tqHAHL) racket`у требуется несколько секунд и ~300 мб памяти. У других лиспов (sbcl) такая же лажа?
>>759118 >И вообще, какие у ракеты слабые места по сравнению с common lisp/clojure? Реализация. Ракетчики так не осилили запилить нормальный компилятор.
>>759133 Вангую, что эти несколько секунд уходят на (require plot). >~300 мб памяти Что-то дохуя. Даже для ракеты и даже для его жирноватой ide. Попробуй сборщик мусора вызвать.
Читаю ansi lisp. Там поясняют за указатели. Как вы вообще отличаете, когда функция работает с указателем, а когда - со значением? Тот же пример копирования списка из книги - каким боком я должен догадаться, где передается указатель, а где создается новая область памяти для значения?
>>759216 А какие слабые стороны реализации? Если говорить о скорости, то на бенчмарках racket вполне на уровне (среди других схем) - http://ecraven.github.io/r7rs-benchmarks/benchmark.html В моих кейсах racket тоже оказался самым быстрым(сравнивал с guile и chicken). Расстраивает только потребление памяти и долгая загрузка библиотек. То есть главный недостаток racket - низкая производительность? >>759222 >(require plot) А почему он так долго его загружает? Он его с нуля компилирует что-ли?
Программач! посоветуй книгу по common lisp. Чаще всего рекомендуют Practical Common Lisp (пролистав ее сложилось впчетление, что она для brain-damaged), а Норвиг советует ANSI Common Lisp + On Lisp. Или лучше вкатываться в кложуру?
>>759811 Мелочь-то незначительная, а столько неудобств от неё. Никогда не понимал этих ]}]))}] >>759814 #d для словарей, например. Да букв-то полно, хуле. На всех хватит.
После непродожительного паралелльного изучения Common Lisp и Clojure мое мнение: Как сферический язык в вакууме cl заруливает. Как инструмент для решения проблем рулит и педалит кложура
>>760478 Поборник лиспа и мелкософта из /c/. Вел охуительный блог http://juick.com/lovesan/ где знатно доставлял, поливая всех и вся говном. Особенно не любит швабодную ос и пиздолизов. Читать в первую очередь теги долбоебы, прыщи, *Haskell (его тоже в основном говном поливает). Не взяли в джетбрейнс. В свободное время пишет биндинги на коммон лиспе. Верит, что метапрограммирование спасет мир.
>>760487 ага, 5 коммитов вчера, из запоя что-ли вышел? Пропил мозги нахуй. Вообще печально что архимаг забросил, тот реально лиспкун, и его вклад в рашнлиспкомьюнити на уровне ксача.
>>760741 А почему через лямбду можно? Если смотреть в топ-левеле, то лямбда вроде возвращает то же. ((lambda (x) ( x x)) 4) <--работает ((symbol-function ') 4 4) <--нет
>>768060 Что там осиливать? Задачи рассчитаны на первокурсников. Уж не с политача ли ты залётный? Не понимаю, что за тенденция такая выставлять себя хуже в сравнении с какой-то другой нацией.
>>768083 >что за тенденция такая выставлять себя хуже в сравнении с какой-то другой нацией А чем мы лучше? По технологиям мы сосем, наши бабы известны на весь мир как отъявленные шлюхи. Нет ничего проще, чем снять Наташку и купить русского быдлокодера для аутсорса.
>>768108 Он не себя ненавидит, а считает что вокруг него одни говноеды, а он сам рыцарь на белом коне, просто ему видите-ли не повезло родится в этом болоте.
>>705167 (OP) Кложурогоспода, как мне запилить структуру с состоянием? Прочитал про type, но вот не пойму как в нем хранить внутреннее состояние. Допустим, мне нужно хранить состояние подключения во внутреннем поле типа Database. Я объявляю тип как (deftype Database [url] (connect [db] ...) (disconnect [db])) Экземпяр Connection мне нужно хранить в приватном поле, и создавать его при вызове метода connect, а если я укажу его в квадратных скобках при объявлении типа, то он будет публичным. Тащемта может дело в том, что я думаю объектно-ориентированно, но вот для этой задачи ооп на мой взгляд луше всехо подходит, ибо экземпляров Database нужно несколько, и у каждого из них будет свое состояние.
>>773346 А зачем тебе изменяемое поле для соединения? (connect {:host host :port port :database db ...}) => {:connection conn :conn-info {:host ...}} И то я сомневаюсь, что эта информация не продублирована в самом объекте соединения.
>>773413 >А зачем тебе изменяемое поле для соединения? Идея в том, чтобы те кто работают с Database не пользовались даже connect. Я хочу при обращении к методу read-data проверять наличие соединения, и если оно есть то реюзать, а если нету то устанавливать новое с помощью connect. Вот, и вопрос в том где хранить это состояние. Database должен сам менеджить свое внутреннее состояние, а те кто обращаются к read-data могут.
Сейчас я вижу только один выход: при образении е методам Database ему еще должен передавать хешмап, в который он будет складывать свое состояние, и так при вызове каждого метода. Если так и нужно поступать в данном случае то ок, но вообще я искал решения похожего на классическое ооп с его инкапсуляциями.
>>773394 потому что само по себе подключение это особенность реализации Database. Database реализует протокол Readable в моем поделии, а кроме него есть еще TextFile, который тоже реализует Readable, но у него нет connection внутри, ему даже и хранить своего состояние не нужно.
Помогите разобраться, как развернуть рекурсивный вызов в последовательность применения функций. Я запутался. И еще: почему-то лямбда, примененная к значения, не печатает число на экран даже если использовать (display).
CompilerException java.lang.IllegalArgumentException: No matching ctor found for class user.PersonName, compiling:(/tmp/form-init3993095858741703866.clj:1:12)
Меня бы устроил этот вариант решения проблемы, я бы хранил внутреннее состояние Database в volatile-mutable, но вот теперь в конструктор нужно передавать все параметры, как-то это напрягает.
Ниже я в репле воспроизвел то, о чем говорил ранее: user=> (defprotocol Readable1 (connect [this state]) (read-data [this state])) Readable1 user=> (deftype Database [url] Readable1 (connect [this state] (assoc state :connection "Fake connection")) (read-data [this state] (if (state :connection) "Lorem ipsum dolor" "ERROR"))) user.Database user=> (deftype TextFile [name] Readable1 (connect [this state] nil) (read-data [this state] "File content")) user.TextFile user=> (def db (Database. "jdbc://blablalba")) #'user/db user=> (read-data db {}) "ERROR"
В этом решении состояние Database мне приходится таскать с собой, а для TextFile мне это состояние как корове пятая нога. Вот два варианта решения я придумал, но что-то мне подсказывает что оба они неправильные, поэтому прошу помощи здесь.
>>773550 >Почему-то вместо значения выводится <procedure... Ну подскажите, блеадь, что я делаю не так, когда разворачиваю рекурсию в последовательность применения функций.
>>773778 Вот: https://ideone.com/GXmoZS Хочу проверить, правильно ли я понимаю, как выполняется repeated, и убедиться в этом, вычислив значения развернутых выражений.
>>773793 Да. Таким образом я хочу смоделировать вызов ((repeated inc 5) 0) на каждом этапе рекурсии. Чтобы убедиться в том, что я делаю это правильно, получившуюся функцию я хочу применить к тому же значению, к которому применяется ((repeated inc 5) 0) - к нулю.
>>781606 Есть ещё третий стул — McCLIM. Но у него только из стабильных бекендов только CLX. >>781765 К тому списку нужно добавить qtools-ui. На данный момент он, пожалуй, самый пригодный для использования, но у него один большой минус — smoke. Автор вроде собирается избавиться от этого говна и запилить нормальные биндинги
Основные диалекты
— Common Lisp - разрабатывался как промышленный язык, пригодный для широкого спектра применения, из-за чего имеет достаточно объемную спецификацию. Является мультипарадигменным (процедурщина, функциональщина, ооп (CLOS)), с сильной, динамической типизацией. Есть опциональная декларация типов и, в некоторых реализациях (sbcl, например), частичный их вывод.
Описание особенностей: http://habrahabr.ru/post/143490
Основные реализации:
+ свободные: SBCL (нативный код), Clozure CL (нативный код), ECL (через сишку), Clisp (байт-код; небольшой размер образа; похоже, заброшен), Clasp (llvm; ориентирован на интероп с c++), ABCL (байт-код JVM), gcl, cmucl
+ коммерческие: LispWorks, Allegro CL, Scieneer CL, mocl (для программирования под ведро и ios)
— Scheme - это минималистичный лисп, пригодный в основном для обучения, исследований. Тем не менее, Racket вполне практичен. Racket включает в себя много подъязыков (typed racket, lazy racket, frtime racket), включая схему стандартов r5rs и r6rs.
— Clojure - Стильный, модный, молодежный лисп с бóльшим уклоном в функциональщину, иммутабельными структурами данных, поддержкой параллельщины с транзакционной памятью, агентами. Ориентированность на JVM сильно отразилась на дизайне языка, что многим не нравится.
— Hy - Lisp-синтаксис для Python с анафорическими макросами
— Emacs Lisp - его область применения ограничивается емаксом. Является наследником ТОГО САМОГО MacLisp'а.
— Tcl - скриптовый язык с немного наркоманскимстранным синтаксисом. Из коробки множество батареек на любой случай жизни, среди которых неповторимый Tk. Язык очень удобен для написания скриптиков, особенно когда к ним требуется приделать графический интерфейс.
— 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
+ Попрактиковаться можно на Exercism'е http://exercism.io/languages/lisp
Алсо, годная статья про проектирование 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 (это скорее вводные лекции по программированию, а не учебник по схеме, но тоже пойдет)
+ Попрактиковаться можно на Exercism'е http://exercism.io/languages/scheme
— Clojure
+ Programming Clojure, 2nd edition (для новичков)
+ The Joy Of Clojure, 2nd edition (есть есть бэкграунд в Лиспе или ФП)
+ Попрактиковаться можно на Exercism'е http://exercism.io/languages/clojure
— Hy
+ Официальный сайт http://hylang.org/
— 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
Среды разработки
Одно из основных преимуществ лиспа в сравнении с языками с циклом разработки "написал → перекомпилировал → запустил в отладчике" - поддержка интерактивно-итеративного метода разработки. Но без инструментария, обеспечивающего полноценное взаимодействие с реплом, оно сводится на нет. Поэтому писать без использования нормальной среды - значит упустить важную особенность языка.
!!Чтобы не пердолиться с емаксом, лучше можно взять уже преднастроенный spacemacs ( https://github.com/syl20bnr/spacemacs ).
— 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 (только подсветка синтаксиса и простенькое взаимодействие с реплом, но жить можно)
Библиотеки
— Common Lisp
+ Quicklisp ( https://www.quicklisp.org/beta/ ) - CPAN из мира CL
+ Quickdocs ( http://quickdocs.org/ ) - документация по всем пакетам из quicklisp
+ Cliki ( http://cliki.net/ )
+ Обзор экосистемы общелиспа на швабре ( http://habrahabr.ru/post/265589/ )
— Scheme
+ Racket: http://pkgs.racket-lang.org/ и http://planet.racket-lang.org/
+ Chicken: http://wiki.call-cc.org/chicken-projects/egg-index-4.html
+ http://snow.iro.umontreal.ca/?tab=Packages
+ http://www.schemespheres.org/spheres
Предыдущие треды: http://arhivach.org/?tags=3055,113
Шапки: https://titanpad.com/x87hR0KJ2w