Лисп - семейство языков программирования. Характерные особенности лиспов: динамичность, гомоиконность (код как данные), программируемость.
Основные диалекты — 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 - это минималистичный лисп, пригодный в основном для обучения, исследований. Наиболее практичными реализациями являются GNU Guile ( https://www.gnu.org/software/guile/ ) и Chicken Scheme ( http://call-cc.org/ ). — Racket - Развитие PLT Scheme. Racket включает в себя много подъязыков (typed racket, lazy racket, frtime racket, Scheme стандартов r5rs и r6rs). — Clojure - Стильный, модный, молодежный лисп с бóльшим уклоном в функциональщину, иммутабельными структурами данных, поддержкой параллельщины с транзакционной памятью, агентами. Ориентированность на JVM сильно отразилась на дизайне языка, что многим не нравится. — Emacs Lisp - его область применения ограничивается емаксом. Является наследником ТОГО САМОГО MacLisp'а. — Lisp Flavored Erlang (LFE) - Реализация Lisp поверх виртуальной машины Erlang (BEAM), в итоге мы имеем всё лучшее из обоих миров: привычный синтаксис s-выражений, макросы, функциональщина, иммутабельность, многопоточность из коробки + набор либ для построения отказоустойчивых распределённых приложений OTP. http://lfe.io/ — 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 (для новичков) + Clojure for Brave and True http://www.braveclojure.com/foreword/ — В отличие от предыдущего сухого изложения, более приятный для восприятия материал, да и бесплатный, если читать онлайн. + The Joy Of Clojure, 2nd edition (есть есть бэкграунд в Лиспе или ФП) + Попрактиковаться можно на Exercism'е http://exercism.io/languages/clojure
Среды разработки Одно из основных преимуществ лиспа в сравнении с языками с циклом разработки "написал → перекомпилировал → запустил в отладчике" - поддержка интерактивно-итеративного метода разработки. Но без инструментария, обеспечивающего полноценное взаимодействие с реплом, оно сводится на нет. Поэтому писать без использования нормальной среды - значит упустить важную особенность языка.
— Common Lisp + Emacs + SLIME - самый лучший вариант. + vim + SLIMV + LispWorks + AllegroCL IDE упаси боже + Eclipse + cusp + <Что-нибудь для сублайма/атома уже запилили, наверное?>
— Scheme/Racket + Emacs + Geiser (поддерживает GNU Guile и Chicken Scheme) + DrRacket
>>875839 Смотря для чего. С моей точки зрения, общелисп практичнее хотя бы потому, что нет разрозненности между реализациями, отчего и библиотек больше, и качества они лучше.
Если под "перекатом лиспотреда" имелось что-то помимо обновления информации в каталоге языкотредов, опиши, пожалуйста, в жалобе более конкретно, чего ты хочешь, буду рад помочь.
>>876528 Все проекты - фронтендные, то есть clojurescript. На бэкенде используются golang (первый проект) или ruby (второй). 1 - сервис для проведения опросов (буду переписывать, re-frame с тех пор нехило обновился). Просто множество (до 300) динамически подгружающихся masonry-карточек, несколько кнопок, поиск, ничего сложного. 2 - интернет магазин. Сервер на ruby, клиент снова на clojure+re-frame. В самом начале клиент просто выкачивает списки продуктов (только ту информацию, которая нужна для списка продкуторв, их там до сотни) и категорий, кэширует в localstrorage (пережимает через lz-string), из-за чего вторая загрузка почти мгновенная (при втором входе данные все равно выкачиваются с сервера, но пользователь уже видит продукты из localstorage). Корзина хранится только на клиенте в localstorage (между двумя вкладками все синхронизируется). Запросы на сервер идут только при а) открытии страниц конкретных продуктов (выкачивается дополнительная информация типа отзывов и характеристик, не кэшируется) б) преобразование корзины в заказ, оформление и оплата заказов Из-за того, что все данные на клиенте, переход между страницами, поиск, добавление в корзину происходят очень быстро. В принципе, тут тоже все довольно просто, пара тысяч строк от силы, все это можно было писать и на js + redux, что я раньше и делал, но js мне в принципе не очень нравится, а в последнее время там вообще какой-то пиздец происходит (писать селекторы на reselect намного сложнее, чем сабскриберы на re-frame, но при этом сабскриберы намного мощнее из-за того, что они реализовывают полноценное frp, это к примеру), поэтому я свалил с него
>>876032 Не, ничего более не имелось в виду, просто проследовал просьбе из шапки прикрепленного треда. Хотя, конечно, можно было бы запилить оформление шапки как в крестотреде, но позже, т.к. пока времени на переоформление не имею.
>>876619 Мы тут проект в прод начали делать на кложурскрипте. Взяли реагент, гарден, секретаря и еще какой-то залупы. Стоит ли брать ре-фрейм или проще накостылять? Надо чтобы обязательно был сервер-сайд рендер. Сейчас это сделано через эксресс+кложурскрипт на "сервере", чтобы компоненты были общими.
>>877061 Ом мне не нравится. Когда гарден должен начать тормозить? Сейчас я сделал так: 1) lein garden once конпелит стили и кладет их в статик файл (для прода) 2) В реагенте я делаю (garden/css style-map) В результате фигвил это дело вместе с разметкой накатывает и результат приходит через 0.1 секунду в браузер. Зависимость есть, брат жив. Правда стилей пока не много: ~150 строк структура.
>>877097 http://www.parens-of-the-dead.com/ Вот тут магнарс на кложуре делает сервер сайд. ПРосто сейчас такое время, когда нужно чтобы код на сервере и клиенте был общим. Поэтому кложурскрипт и тянут на сервер (с нодой)
>>877193 Началось все с книжки "Coders at work". Прочитав её, я решил посмотреть что еще написал этот автор. И оказалось, что он же написал "Practical Common Lisp". А т.к. я имаксер, я подумал, а почему бы и нет и решил упоротся. Прочитал книжку, поковырял упражнения http://exercism.io/languages/lisp/about И тут как раз подкрался конкурс TWG в /gd/. Для него я сделал игрушку на cl-sdl2: https://github.com/TatriX/lispstone,https://www.youtube.com/watch?v=xaR_Hqo68TU И это была адская боль. С одной стороны лайв-релоад-фап-фап. С другой стороны оно постоянно глючило и хуево работало. Ну ок, я криворукий, библиоте кривая. Затем по условию конкурса мне нужно было собрать билд под винду. SDL же! Три дня проебавшись, конпеляя руками библиотеки, конпеляторы и паралельно отсылая патчи в саму cl-sdl2 я так нихуя и не сделал. Добрый анон из лиспотреда помог и каким-то чудом оно таки завелось. Итого: в двухнедельном конкурсе примерно 5 дней было проебано на то, чтобы просто сконпелить код под винду. Ну ладно, может быть просто не повезло с библиотекой.
Зачем я сделал тестовое задание (никто не просил его делать на лиспе, правда): https://github.com/TatriX/blue-water Это парсер рейтингов и кинопоиска и небольшой фронтэнд для него. В целом все было норм, не считая того, что дохуя либ например для жсона. Половина кривая, другая половина пиздец неудобная. В общем с одной стороны репл-хуепл, с другой стороны постоянно какие-то проблемы из-за того что очень маленькое и подыхающее комьюнити, а поэтому качество либ так себе. Например достучаться до известного в узких кругах Фукамачи, чтобы тот принял пулл-реквест довольно сложно.
Сделал один небольшой одноразовый проект (опять про парсеры) по работе. Для своей игры (http://rogalia.ru) я сделал пару инструментов: тулзы для обновления бд, парочку микросервисов для раздачи всякой статистики и прочего.
По итогу, язык увы для меня остался в 90ых. Да он неплох, он шустрый, на нем в целом приятно писать, но сейчас совершенно другие требования, а CL к ним так и не приспособился.
Ну и вишенка на торте: плюнув на свою ядерную нелюбовь к тормозной жвм, мы начинаем пилить серьезный фронтэнд проект (по работе) на кложурскрипте (>>876928). Да оно просто пиздец как медленно поднимается, но когда поднимется, равных по удобству инструментов я пока не видел.
>>877184 > garden ну, у меня garden висел на auto, оперативы мало, из-за этого и тормозил похоже. У меня рядом с boot (вместо lein) висит вебпак, так как нужно компилить зависимости для React, вот он у меня сейчас и занимается стилями, писать на stylus намного удобнее, чем на garden.
> hoplon нет, но сейчас посмотрел, выглядит круто, нужно попробовать поиспользовать. Там полноценное FRP, можно делать global state, от него зависимости, от него еще зависимости.... и получается re-frame, только без удобного регистра субскриберов и без хэндлеров/интерцептеров, цикла событий. Но если есть сервер-сайд рендер, то можно поверх него сделать свой re-frame.
>>877206 golang я знаю давно. Пометка про первый проект - это не то, что он первый мой проект, а первый проект из списка кложуровских проектов. Писать на golang мне нравится, лол. Кложа и го - два из четверых моих любимейших языков (на других двух (хачкель и erlang/elixir) я просто ничего реального не писал)
>>877097 Ну на кложе много серьёзных проектов, другое дело, что мне серьёзный бэк писать особо не приходилось, простая rest api прослойка между db и клиентом + немножечко логики, это мне проще написать на golang/ruby+sinatra/express. А если нужно что-то крупнее, то я возьму рельсы. Смысла писать бэк на кложе я для себя не вижу. Разве что есть профит передавать между клиентом и сервером edn вместо json (а то на клиенте функции для преобразования "is_active" <-> :active? для каждого запроса туда и обратно).
>>877337 На го я пишу, когда мне нужно написать что-то очень быстро, за короткий промежуток времени, и что бы это работало. Причем это получается не говнокод, как на пыхе, а что-то нормальное (статическая типизация и простота в разбитии кода на кучу модулей) Я почти не использую горутины сам (хттп-либа сама запускает все хэндлеры в своих горутинах), я просто пишу код, как на питоне. Ничего крупного и серьёзного я писать на го не стану.
Когда же я пишу на хачкеле, я пишу это уже медленнее, постоянно пытаюсь что-то отрефакторить, сделать код еще чище и проще и в итоге много времени сам охуеваю, как же круто все это на фп. (Собственно, мне сложно охуеть от какого-то императивного кода, а вот от функциональных решений я до сих пор охуеваю, как от qsort на хаскеле много лет назад).
>>877571 горутины вещь крутая, я не сомневаюсь, только они не нужны в коде, где идет запрос базу, преобразование в json и отправка ответа core.async действительно сильно напоминает горутины (хотя бы "go")
>>877626 Горутины нужны если у тебя не один запрос в базу, а запрос в базу и три запроса к сторонним сервисам. Тут они с каналами становятся просто незаменимыми.
>>877634 Вот кстати кто-то сверху спрашивал про CL. Просто сравните овертон с той поделкой что для CL сделана. И сразу все вопросы про дохлое комьюнити отпадут. как же блядская жвм бесит своей тормознутостью на подъеме
>>878115 Вася, неужели ты не понимаешь, что проблема не в количества памяти, а в том, что это херота течет как второй фурифокс? Почему я могу открыть 300 буферов с жс и го, и емакс даже 2х гигов не отожрет, а немножко жабы убивает машину?
>>878124 Не знаю, у меня не убивает. И имакс с 300 буферами у меня отжирает мегабайт сто памяти максимум, кстати. Может у тебя какие-то волшебные мегабайты?
Как я понял, бут используют те, у кого какие-то сложные деплойные скрипты, и они их хотят писать на кложе, а не на баше, и им нужен доступ к энвайроненту жвм во время сборки, так что нельзя взять кложурно-одный шелл. Но сам я хз, что там за деплой у них такой, что это нужно.
>>879882 Незнаю как остальные, а я вынужденный кложурист. Потому что цл умер, а других живых и готовых для прода альтернатив нет. Хоть свою пиши. пополни ряды прочих мертвых лиспов
>>879954 >>879937 да че там объяснять, огромные сложночитаемые (и сложноредактируемые без паринфера) конфиги профилей заменяются на простой читабельный код https://gist.github.com/anonymous/c26bfe1dc7e37d20c246d6f975f993f5 Конфиги таки есть, но это не такая ебанина, как на моем прошлом проекте на лейне (пикрелейтед), многое норм по дефолту
Про шаблоны не знаю, бутом пользуюсь только первый проект, писал все с нуля.
>>879974 там используется reload, который вроде как заменяет фигвел (такие же панели с ошибками, такой же хотрелоад, только репла нет).
Кроме того, если бы я вставил в бут garden, он бы все равно вышел короче из-за возможности использовать а) дефы, функции б) определять параметры по умолчанию. В лейне, как видишь, некоторые параметры дублировались для разных "профилей". Может, это можно было как-то сделать в лейне, но мне лень разбираться с форматом этих конфигов. в) как я уже писал выше, многие параметры в boot указаны по дефолту в удобных значениях.
Я тот человек, который между кодом и конфигом выберет код, не переношу огромные json/xml/yaml конфиги, где можно настроить все на свете.
>>879953 Не просто медленновато, оно просто в конвульсиях. Да и сам язык, увы, пригоден конкурировать только с сишкой до 89 года. А если начать к нему прикручивать батарейки уровня CL21, то начнется адовая фрагментация. В общем увы и ах.
>>880099 Смысл в компилируемости расширений в машинный код, очевидно. >А емакс без тонны код на елиспе никому не нужен. Поэтому я и говорю >>880087 >Если они ставят себе целью совместимость с емаксом Благо, елисп не так сильно отличается от общелиспа, и запилить слой совместимости вполне реально (я даже видел где-то в сети). Тем более, что елисп в последнее время мимикрирует под цл.
>>880109 Думаю, им лучше знать, что им лучше делать. >А на счет "не так сильно отличается", ты походу елисп последний раз видел лет 10 назад. Последние 10 лет он только и делал, что потихоньку превращался в цл.
>>879978 Ну в лейне тоже можно объявлять биндинги и расшаривать куски конфига в разные места. Но вообще я тебя понял, это скорее вопрос личного предпочтения. Мне вот наоборот приятнее работать пусть с многословным, но представленным в виде данных билд-конфигом.
>>880402 >Хотели же (уже лет ндцать как) чхему впилить в имакс. Впиливали же guile вроде. >А эти ребята взяли и запилил то же, но с кл? Нет, они переписали с нуля.
>>881685 Говорю же, ноут. Нет там больше места под плашки. Теперь памяти хватает, но емакс все равно рандомно крашится от злоеубучего кложурсрипта. Плюс когда нрепл активен smex начинает тормозить. Какие-то буферы кложи при сохранении на 2 секунды виснут. Короче не так хуево как ванильный жс, но все равно плохо.
>>881712 Бро, почини имакс. Ты мамой клянешься, что он у тебя крашится? Я буквально пару раз в жизни видел, как крашится имакс, причем один раз это был какой-то баг, который пофиксили в следующей же версии. У тебя точно весь имакс крашится? Это пиздец же.
Алсо, у тебя стабильные версии всего тулинга стоят, да?
>>883166 Почему как только кложура поселилась в емаксе, он начал крашится? Крашится от слова закрываться нахуй мгновенно, проебывая все на свете. Крашится и тормозить.
>>883213 Я не знаю, не видел кроме тебя никого, у кого крашится имакс. Версии-то у тебя стабильные и одни и те же у всех пакетов имакса и плугинов лейна?
Делаю простенькую задачку на лиспе с использованием вижуал лиспа. Сам интерфейс получился легко, а вот запрограммировать кнопки начинаются проблемы. Сейчас не могу вывести значения набор чисел из тхт файла в эдитбокс, пишет неверный тип аргумента file nil. Вот сейчас упёрся рогом и дальше не могу, помогите разобраться как это сделать. В программировании мало чего понимаю, разбираюсь почти с нуля, но инфы по лиспу очень мало в интернетах
>>883416 Немного разобрался, read-line теперь выводит мои числа из файла в консоли верно. Теперь как их перекинуть в edit_box, чтобы они там отображались?
Перед закрытием файла, надо его содержимое вывести в edit_box. В консоли у меня отображает нужный мне ряд чисел, я просто не знаю как его вывести в нужном мне боксе.
>>883590 Ну в кложуре проблема быть никак не может, лол, - кложура крашит имакс? Что-то из разряда марсианских жидомасонов, срущих в подъездах. А вот в сидере - вполне, хотя все равно странновато, что весь имакс крашится. А что разрабы сказали?
>>883721 Крашится оно только когда подцеплен фигвил. Чтобы говорить с разрабами надо им что-то показать. А показывать нечего, потому что даже стек трейс не поймать без танцев с бубном.
Автоматизация - это будущее. Я почитал, какие именно сферы производства можно улучшить про грамотном подходе и поразился, если честно! Вплоть до контроля транспорта: www.konsom.ru/solutions, так что вещь стоящая.
Если nil заменить на какое-нибудь существующее, то цикл правильно работает и останавливается на указанном элементе. Походу цикл повторяется второй раз и в конце всегда выдаёт ошибку "неверный тип аргумента: stringp nil". Пробовал заменять на null и на length 0, один хер та же самая ошибка.
>>883547 Ну, за этим в документацию, мне, как и, наверное, всем остальным ИТТ, на автолиспе писать не приходилось, поэтому таких мелочей не знаю. Должен быть какой-то метод у edit_box вроде setvalue.
>>883903 Спасибо, уже разобрался. Я пишу наверное чуточку быстрее полторы строки в день чем тут читают. Вот сейчас с циклом затык, даже нашёл пример аналогичный, но у меня всё равно не хочет работать.
>>883906 Структура нарушается. Вот смотри, если я напишу (while (/= elem 1)) То у меня будет считывать строку за строкой из файла, пока не наткнётся на 1, тогда цикл завершится. В моём случае мне нужно считывать строки до конца файла, т.е. пока элемент не будет равен пустом месту. В теории всё хорошо, я даже нашёл пример http://aco.ifmo.ru/~nadinet/html/lectures/lsp_2.html#_size где делают абсолютно также. Но тем не менее где то ошибка в цикле, и он запускается второй раз после прогона всего файла и выбивает ошибку.
>>883911 Ты таки попробуй, потому что в общелиспе /= предназначен только для сравнения чисел. >/= elem 1 Строка сравнивается с числом? Хм, автолисп слаботипизированный что ли?
>>883912 Уже и в этом разобрался, подстрокой считывал дальше после окончания и цикл накрывался. Короче проблема внутри самого цикла была, а не в самом while.
>>883933 В моём учебнике допускается >Проверяет неравенство аргументов (рекомендуется использовать для чисел или строк). >(/= <аргумент1> [<аргумент2> ... [<apryMeHTN>]...]) >Типы аргументов: любые.
>>883780 >>883827 Ну что, нашел, в чем проблема? Если у тебя действительно последние стабильные версии имакса и всего сидер-релейтеда, то пиши им и без стектрейса. На чем крашится-то, на каком-то конкретном вводе в репл? Или вообще рандомно? На пустом проекте или только на рабочем? На обоих машинах енвайронмент один и тот же? Любопытно же :3
>>884095 Вообще рандомно, перед этим начиная заметно визуально подтормаживать на сохранении/эвале кложурскриптовых файлов. Только на рабочем коннекте через фигвил. Энвайронмент ясен хуй не может быть 100% одинаковым, но дистр одинаковый, значит версии софта плюс минус одни и те же.
А хуле толку писать о сегфолте вообще без данных для выяснения причин. Без стека нет смысла.
Да не, напиши все равно, чтобы был репорт. А то я вот сейчас посмотрел их иссуи, вроде ничего похожего нет, и если у кого-то еще что-то похожее, то он тоже ничего не найдет и подумает, что ну его нахуй, и в итоге никто так и не пофиксит проблему, если она все-таки есть.
Алсо, я бы попробовал на другой версии имакса воспроизвести, если не лень. Ну и без загрузки конфига. И на пустом проекте.
Пытаюсь тут подсадить человека на кложурскрипт. Но бля, поставить его на винде это какое-то мучение. Есть годные мануалы, которые можно дать человеку, который не умеет конпелить исходники линукса?
>>885087 Винда - это вообще сплошное мучение как бы. Вроде же расписано все на сайте у них. Загугли "lein windows", профит. Из редакторов попробуй курсив или лайттейбл, например. Хотя раз только кложурскрипт, то пусть хоть в нотепад.ехе пишет, фигвил же.
Поясните кто за emacs на windows. Установил geiser с помощью melpa, как я понял достаточно вызвать install-package и все установится, лишних действий типо качать что-то еще делать не надо. Вызываю run-guile, пишет apply: Searching for program: No such file or directory, guile.exe. Guile Load Path пустой в настройках. Что я делаю не так?
>>885295 Потому что для того, чтобы был гейзер, достаточно установить гейзер. Гейзер - это не гуайл. Гейзер - плугин для редактора, а гуайл - конпелятор\интерпретатор схемы.
Я почитал, какие именно сферы производства можно улучшить про грамотном подходе и поразился, если честно! Вплоть до контроля транспорта: www.konsom.ru/solutions, так что вещь стоящая.
>>886567 У меня сложилось впечатление будто ты утверждаешь, что такая бессмысленная хуйня как "отлов чего-то там в компайл-тайме" не только не является бессмысленной хуйней, но ещё и существует в самом лиспе. Я ведь не ошибаюсь?
>>886572 >Я ведь не ошибаюсь? Частично. 1) не бессмысленная 2) отчетливый "компайлтайм" есть не во всех лиспах. Ну а вообще удивительно, что кто-то в лиспотреде об этом не знает. Может, ты ещё и про вывод типов в общелиспе не слышал?
>>886609 Какие еще мои взгляды, ты о чем? Или ты думаешь, что тут кто-то кроме тебя не знает, что "Compilation failed" пишется, когда при компиляции были варнинги, кроме стайл-варнингов? Что код этот прекрасно скомпилировался и прекрасно работает точно так как написан? Что он "корректен" в любом смысле этого бессмысленного слова? Давай показывай нормальный аналог той хуйни. (Подсказка: его нет и не может быть)
>>886610 >и прекрасно работает точно так как написан Вообще-то нет. Дизассемблируй функцию и увидишь, что ничего, кроме кода выброса ошибки, там нет. >Давай показывай нормальный аналог той хуйни. Ну покопай гитхаб, там полно неработающего говна. Проверка типов - вполне себе "нормальный аналог", единственное, что в компилятор вшито и апи не предоставляет
>>886620 > Вообще-то нет. Вообще-то да. Но если хочеть еще позора, можешь обосновать свое замечательное мнение, не такое как у других. > Дизассемблируй функцию и увидишь, что ничего, кроме кода выброса ошибки, там нет. Что ты несешь? Там check-type должен быть еще. > Проверка типов Где, какая "проверка типов"? Рассказывай, показывай. > единственное, что в компилятор вшито и апи не предоставляет Ну еще бы, какое может быть апи у того чего нет и быть не может.
>>886622 >Там check-type должен быть еще. Я имел в виду, что форма, не прошедшая проверку типов, заменена кодом выброса ошибки. > какая "проверка типов"? Которая не дает складывать попугаев с питонами, очевидно.
>>886633 > Я имел в виду, что форма, не прошедшая проверку типов, заменена кодом выброса ошибки. Во-первых, никакой "проверки типов" там нет. А во-вторых, это самое банальное удаление мертвого кода. Функция "умножить", если какие-нибудь из аргументов не являются числами, сигналит ошибку. В данном случае заведомо известно, что второй аргумент не число, поэтому этот вызов и заменили на сигнал ошибки. Это общая оптимизация, никакого отношения к типам она не имеет. > Которая не дает складывать попугаев с питонами, очевидно. Чего блядь?
>>877202 Не хочешь пообсуждать 3,4,5,...,11D-рендеринг и его практическую реализацию на CL? У меня есть интересная, как мне кажется, идея, но одному мотивации нехватает.
>>887123 А чего не CEPL? Мне уже начинает казаться, что ты специально выбираешь неотлаженные и вообще недописанные библиотеки, лишь бы оклеветать общелисп и перетянуть потенциальных лисперов на кложу
>>887150 Если ты читал ридми, то там написано, что это адаптация кода из книжки. Нужно было, вот и пердолил. Вообще конечно, боль и страдание. Не рекомендую.
>>887155 >Вообще конечно, боль и страдание. Не рекомендую. Но ты сам же себе эти страдания и обеспечил. Есть же в том же cl-opengl нормальные обертки, нет, буду голые биндинги дёргать.
>>887173 Это говорит лишь о том, что обертка хуевая, но благодоря тому, что CL позволяет положить хуй на инкапсуляцию, я смог дернуть приватные методы и сделать что мне нужно было.
>>887174 Пакет %gl предоставляет низкоуровневые биндиги, на что какбэ имя пакета и намекает, зачем ты в него полез - для меня вопрос. >Это говорит лишь о том, что обертка хуевая Это говорит лишь о том, что ты ССЗБ, который не читает документацию и лезет без повода в низкоуровневые интерфейсы. И инкапсуляция тут совершенно не при чем. Даже удивительно, что ты не догадался до прямого cffi:foreign-funcall.
>>887182 Лол. Документация. Не смеши мои тапочки. Почти у всего чем я пытался пользоватся на CL либо вообще нет документации, либо она настолько хуевая, что лучше бы не было. Начиная с гиперспека.
>>887285 В каком именно лиспе? Берешь и осиливаешь, точно так же, как в любом другом языке. В чем конкретно вопрос?
Насчет гуи - есть гтк\свт\свингпростихоспати\хтмл+цсс\реакт\реакт нейтив для андройда и айфона\биндинги к андройд сдк\хуйзнаетчтоеще, короче - все есть, конкретизируй вопрос.
>>887501 Если ты поставил ванильный емакс, а до этого пользовался только блокнотом, то конечно неудобно. Емакс как музыкальный инструмент, сначала ты его осваиваешь, а только потом можешь издавать прекрасные звуки.
Вообще, судя по твоим постам ты, мм, новичок в программировании. В таком случае начинать с коммон лиспа - это очень странный и неудачный выбор. Есть plt racket, он специально сделандля изучающих кодинг, там сразу и редактор с ide, и гуй-библиотека, короче - абсолютно все в одном месте и из коробки, скачиваешь один исполняемый файл и все.
Common Lisp очень нравится, если я не ошибаюсь, хотя не ручаюсь, эти ребята его используют: www.konsom.ru/solutions, так что вещь стоящая. Scheme пользовался, действительно хорош разве что только для изучения, дальше пока не заходил. Подборка годная.
Анон, подскажи пожалуйста: нужно написать функцию которая на вход принимает список пар [(Int, Int)], а возвращает список пар сгруппированных по первому значению [(Int, [Int])].
Tо есть если на входе [(0,1), (0,2), (1,3), (1,4)] вернуть она должна [(0,[1,2]), (1,[3,4])]
haskell треда не нашел, но мне главное принцип, а код сам напишу
>>889415 ты про abs? Все таки не ide, подсветка не такая умная, чтобы различать builtin функции и переменные. Я обычно просто не использую такие идентификаторы, но сейчас было лень придумывать
>>889415 а если ты про то, что закрывающие скобки серые, то это из-за parinfer. Сервые скобки почти не видны и чисто психологически проще использовать паринфер https://shaunlebron.github.io/parinfer/
>>889536 а я где-нибудь сравнивал с smartparens? Есть еще несколько аналогов, че ты их не перечислил? Разница в том, что smartparens для emacs, а parinfer для практически всех современных редакторов. Фичв с затемненными скобками сугубо опциональна - кому не нравится, может отключить. Но она все таки помогает психологически не лезть удалять лишние скобки, а просто уменьшить отступ.
>>889545 ну по гитхабу смартпаренс мне больше нравится. Паринфер исключительно для лиспов, смартпаренс судя по всему работает с любыми вложенностями. Сравнить иначе не могу, имаксом не пользовался ни разу.
>>889598 Смартпаренс нужно как следует допиливать, потому что из коробки оно нормально работает только с лиспом. Но все крутилки там есть. А в чем ты там лисп то пишешь?
>>889599 атом это чистый + паринфер. Хочется перейти на имакс из-за сидра, но боюсь мой комп с 4-мя гигами оперативы, постоянно работающими рельсами, хромом и бутом/лейном, не потянет интерактивную разработку
>>889765 Если честно - я не юзал смартпаренс, это какая-то новая штука, а паредит был всегда. Он умеет делать структурные переносы на уровень вверх и вниз? Я даже хз, как это словами объяснить, погугли демку на ютубе если что.
>>889768 Я как раз наоборот, юзал только смартпаренс. Потому что когда нужно было выбирать, я сравнил их, и получилось так, что смартпаренс умеет все что умеет паредит и еще сверху всякого. У него даже есть готовый сетап, типа включи-ка мне биндинги ка у паредита.
>>890851 А что тут еще кроме мнений есть-то? Ради знаний есть книжки, ютубы и всякие стек оверфлоу. А тут просто говном покидаться, да личное мнение посмотреть.
Пацаны, raynes умер. Пиздец какой-то, ничего не понимаю. Он же на год младше меня был. Не сказать, что мы с ним прям особо общались, но блин. Помню, как он меня в ирц троллил, лол. И как он после того, как кложурное комьюнити собрало ему бабла на билет до конференции, писал в блоге о том, что мол йееееей, меня настоящая живая женщина обняла, лол. Он тогда еще пиздец каким жирдяем был. И еще как я чуть не проебал на его пастебине все свои пасты, когда юристы из-за спамеров заставили его вырубить, хех. Странное ощущение - вроде я его и не знал даже, но как-то мне хуево.
что я не так делаю? for - проход по списку с выполнение кода и проброс аргументов - вроде работает, но если проход в проходе делаю - шлёт нахуй. и да, наверно это как дерьмо выглядит, но мне хочется так, чисто из академического интереса. вкатываться начал позавчера и да, это emacs lisp.
да всё. на глобальную переписал - заработало. cl-labels перекрываются может, или чё - впадлу читать, я тут говна навернул из 70 пол книги - хватило, до сих пор кал из зубов выковыриваю.
>>891757 Есть опенсорсный ecl, который компилится через сишку, но он не умеет в кросскомпиляцию. Автор говорит, что его код для этого нужно прилично перелопатить. Также существует clasp, но он пока только пилится и совсем сырой.
Ну что, хипстеры, все ретроградствуете? Поясните, пожалуйста, почему нельзя считать руби развитием идей общелиспа, и вообще, назовите хоть одно фундаментальное различие между ними, не считая синтаксиса и махрового легаси вроде cons-ячеек, очевидно.
>>892464 Забей на SICP/TAPL/HtDP парашу. Сразу читай Lambda The Ultimate, затем OnLisp, наконец плавно переходи к Introduction to MIPS Architecture - идеальная архитектура для реализации своего первого Lisp-компилятора на основе CPS. Если интересуют структуры данных, то только MIT-овский 6.851 Advanced Data Structures. Виртом и Ахо-Копрофтом можешь сраку подтереть. Кнута не читай, ему есть адекватная замена - книга Hacker"s Delight.
>>892464 Забей на Lambda The Ultimate/OnLisp/Introduction to MIPS Architecture парашу. Сразу читай SICP, затем TaPL и наконец плавно переходи к HtDP - идеальное руководство для реализации своего первого первого полноценного проекта. Если интересуют структуры данных, то только Аховский Data Structures and Algorithms. Маккарти и Тернером можешь сраку подтереть. Уоррена не читай, ему есть классическая замена - книга The Art of Computer Programming.
>>893260 До тех пор, пока парсер не сделает свою работу, никакого AST в принципе нет, ты редактируешь все те же строчки, не говоря уже о макросах, которые могут экспандиться хуй знает во что, reader-macros, на которых можно сделать хоть транслятор PHP в s-expressions. >>893258 Я о том, что метапрограммирование уровня CL -- это костыль, возникающий от недостатков в дизайне языка. У пишущего на раби или любом другом современном языке потребности в определении новых синтаксических конструкций, как правило, не появляется. Это такой же атавизм, как и cons-ячейки.
>>893932 То же, что утверждать, что функции >-- это костыль, возникающий от недостатков в дизайне языка. У пишущего на рабивасике или любом другом современном языке потребности в определении новых функций, как правило, не появляется. Толстовато.
>>893941 >Толстовато. Если ты это о своём посте, то да. Синтаксис -- средство, а не цель, поэтому, во имя консистентности, целесообразнее выделить из множества синтаксических конструкций подмножество тех, которые позволяли бы описать любую из возможных функций, чем заставлять программиста заниматься этим самому. Как пример -- стандартная в лиспе практика использования макросов вроде with-something. На рубях подобное пишут, не прибегая к "метапрограммированию".
>>893976 Макросы суть те же функции с тем лишь исключением, что они могут принимать код в качестве аргумента. Собственно и "консистентность" они нарушают не более, чем самописные функции. >целесообразнее выделить из множества функций подмножество тех, которые позволяли бы описать любую из возможных предметных областей, чем заставлять программиста заниматься этим самому Вот как-то так это звучит. Ты же понимаешь, что не просто так люди на XML программируют.
>>893932 Вот только в лиспах почему-то поддержку cps, контрактов, типов, erlang-style обработки исключений и паттерн-матчинга запиливают с помощью библиотек, а в других языках приходится ждать новой версии языка. Ну и да, толстовато. Ни в руби, ни в лиспах не шаришь, сразу ведь понятно.
https://www.gnu.org/software/guix/ - новый нескучный дистрибутив, основанный на NixOS. NixOS/Nix Package Manager используют для сценариев сборки пакетов и конфигов системы DSL похожий на Haskell, здесь же для этих задач используется Guile Scheme.
Почему после каждого вызова (rand) [2]> (rand) 20739838 ; здесь я понял, 123416807 [3]> (rand) 682106452 ; а тут с хуя такое [4]> (rand) 895431078 ; ??????????????
>>903508 у crossover была пара вакансий на удаленку поддерживать легаси на крестах и общелиспе еще есть AutoCAD где AutoLISP встроенный язык, на hh иногда встречаются вакансии
>>905703 На кложу обычно с явы/жс переходят, а там народ, как мы знаем, беспринципный, непривередливый, им что бэйсик, что хаскель, что вилкой, что лопатой - всё одно. Про такие мелочи как tco или call/cc и говорить не приходится, тем более, что они в CPS и руками писать не гнушаются.
>>905712 Тсо не нужно. Хвостовые вызовы должны быть явными. Когда у тебя итеративный процесс и рекурсивный процесс выглядят одинаково, это плохонько и мислидинг.
>>905787 О, а вот и оправдания "это не баг, а фича" подъехали. Такие как ты и бэйсик оправдывали, что де код должен быть явным и без черных ящиков, и полиморфизм у вас был вредным. >Когда у тебя итеративный процесс и рекурсивный процесс выглядят одинаково Щито?
>>899353 >https://www.gnu.org/software/guix/ - новый нескучный дистрибутив, основанный на NixOS. >NixOS/Nix Package Manager используют для сценариев сборки пакетов и конфигов системы DSL похожий на Haskell, здесь же для этих задач используется Guile Scheme. Анон, если смог установить GuixSD на жёсткий диск, отпишись, как ты это сделал,
Я записал на флэху через dd и запустил на 2 своих компах, ни на одном не взлетела графика, тупо логинится в root. Иксы (startx) не стартуют, mc в наборе нет, доустановить не могу из-за проблем сети.
Пеняю на швабодное ядро, linux-libre не воспринимает мои графические карты, на ЛОРе camel отписался что у него есть нормальное ядро с блобами, но как его впилить в образ "gnu-disk-image" - фиг знает.
Нужна помощь, небольшое количество Яндекс.Денег в качестве благодарности гарантирую.
>>906480 >ни на одном не взлетела графика А ты уверен, что там есть чему взлетать? Образ-то хоть и сжатый, но всего на 140мб, если иксы туда и впихнули, то без какой-либо оболочки.
>>906534 >А ты уверен, что там есть чему взлетать? Образ-то хоть и сжатый, но всего на 140мб, если иксы туда и впихнули, то без какой-либо оболочки. После xz -d guixsd-usb-install-0.12.0.x86_64-linux получилось 900 Мб.
Не думаю, что guixоделатели ожидают, что их пользователи будут настолько кульхацкерами, что начнут сами ставить иксы. Хотя кто их знает... Попробую в мане https://www.gnu.org/software/guix/manual/ про иксы почитать.
Но даже если допустить, что они не положили в исходную поставку иксы (хрен их знает, на самом деле), надо понимать, как их установить и прикрутить сверху кеды с КДМ-ом (или что там сейчас за него).
Common Lisp очень нравится, если я не ошибаюсь, хотя не ручаюсь, эти ребята его используют: www.konsom.ru/solutions, так что вещь стоящая. Scheme пользовался, действительно хорош разве что только для изучения, дальше пока не заходил. Подборка годная.
>>915634 Common lisp - это друглй язык. Ракетка - одна из реализаций\диалектов схемки. Но на самом деле это больше, чем схемка - это еще и исследовательский проект, и многоязыковая среда для обучения програмированию. По поводу удобства - ну так возьми да скачай, попробуй. Ты чего аутируешь-то?
>>915617 Схемка с кучей йоба-батареек, средой разработки из коробки, что снижает порог входа. Батарейки крутые, интересные, но кроме них больше ничего нет, и работает это счастье слишком медленно.
>>915634 >какие отличия от просто Scheme Про схему тебя пояснили >и всяких Common LISP а про всякие другие в шапке более-менее расписано. >Еще интересует о среде Dr.Racket и ее удобстве. Удобство - это не про неё, вот что мне кажется. Емакс с гейзером лучше, хоть и чуть сложнее в освоении. Но до slime всё равно ни то, ни другое не дотягивает.
О! Тут есть кто живой, или лисперы вымерли, так же, как и паскальщики? Короч, надо накактать нешарящему ну вот ни разу человеку рабочцю программу для коммонлиспа, которая делает ничего, кроме переименовывания внутри выражения sin на cos, sqrt же -- на abs. Буду очень благодарен за быстрый ответ.
>>921165 Я из тех, кто покупает и так сдает. В понедельник сдавать, будь это Паскаль или С++, то уже бы нашел, а это... Нашел одного человека, жду когда ответит. Если не ответит, то жопа.
>>931618 >Почто призываешь нас? Поясните, как установить систему, вернее, как поменять на ней очищенное от блобов линукс-ядро на обычное "блобосодержащее" https://github.com/8p8c/my-guix/blob/master/packages/linux-nonfree.scm (у меня свободное ядро ругается на отсутствие драйвера под модем, соответственно не поднимается сеть)
Также, как в системе могут одновременно содержатся >и гном, и крыса >>907186 и отсутствовать иксы?
Как поставить последние кеды, буду разбираться после того как осилю установку.
>>935278 Слишком маргинальное и малочисленное сообщество, на нормальные порты не хватает. Ставь виртуалку и пердолься, много времени и нервов сбережёшь.
>>935195 А ты его не видел? >>935278 А в чем проблема? Насколько я знаю, ccl и sbcl уже давным-давно нормально работают под виндой. >Существуют ли годные библиотеки для современного OpenGL? cepl, varjo, cl-opengl
Почему Guile не выводит результат только когда я ему интерактивно всё ввожу? Когда скармливаю файл с тем, что я ввожу он просто его компилирует, запускает и не выводит результат. Gambit делает тоже самое, разве что не компилирует. ЧЯДНТ?
debugger invoked on a SB-INT:SIMPLE-STREAM-ERROR in thread #<THREAD "main thread" RUNNING {10039CE5B3}>: couldn't read from #<SB-SYS:FD-STREAM for "socket 10.0.2.15:34237, peer: 52.222.157.198:80" {10062CEA63}>: Connection reset by peer
Есть ли вообще смысл использовать CLIM вместо биндингов ко всяким Qt?
>>945042 Я не копался в причинах, просто поставил вручную trivial-gray-streams и проигнорировал ошибку при установке swank. Наверное это какой-то баг в Quicklisp.
Читаю sicp. Смутило упражнение 1.7: The good-enough? test used in computing square roots will not be very effective for finding the square roots of very small numbers. Also, in real computers, arithmetic operations are almost always performed with limited precision. This makes our test inadequate for very large numbers. Explain these statements, with examples showing how the test fails for small and large numbers. An alternative strategy for implementing good-enough? is to watch how guess changes from one iteration to the next and to stop when the change is a very small fraction of the guess. Design a square-root procedure that uses this kind of end test. Does this work better for small and large numbers? Вот процедура: (define (sqrt x) (sqrt-iter 1.0 x)) (define (sqrt-iter guess x) (if (goodenough? guess x) guess (sqrt-iter (improve guess x) x))) (define (average x y) (/ (+ x y) 2)) (define (goodenough? guess x) (< (abs (- (square guess) x)) 0.001)) (define (improve guess x) (average guess (/ x guess))) (Define (abs x) (Cond ((< x 0) (- x)) (else x))) (Define (square x) (* x x))
Почему тест фейлит на маленьких числах мне понятно, но почему "inadequate for very large numbers" я не понимаю. В распоряжении лишь онлайн интерпретатор, так как двачую с яблока. https://scheme.cs61a.org/editor.html и этот интерпретатор выдает "FormatException: Invalid integer" при попытке выполнить процедуру sqrt с оче большим числом, типа: 9999999999999999999999999999999999 Вроде с сильно большим числом должно зацикливаться? Я переписал goodenought? как: (define (goodenough? guess x) (And (< (Abs (- guess (improve guess x))) (/ guess 100000)) (< (abs (- (square guess) x)) 0.001))) Тут иначе http://sicp.sergeykhenkin.com/2007/08/15/sicp-exercise-solution-1-7/ , приемлем ли мой вариант?
Анон, есть один вопрос: Если бы тебе ресетнули все проффесиональные знания, и оставили лишь знания об источниках знаний, учебниках, курсах и подобном, какие учебники годнота, какие мусор. Какой список учебников по математике ты составил бы для средней школы? Просто я подозреваю, что я мыслю о математических процессах очень неэффективно и неправильно. Хочу поправить фундамент, так сказать. Особенно интересует есть ли годные англоязычные учебники по математике переведенные на русский?
>>957282 СССРовские учебники (ну или программы по обучению, или... не знаю как правильно выразиться) по математике всем миром признаны самыми лучшими. Сравниться может с совком в этом только Корея. Так что подумай, не лучше ли на русском изучать?
>>957879 >всем миром признаны самыми лучшими Не имеющий аналогов, суетливый, сверхманевренный, блохастный учебник по математике под редакцией Садовничего.
>>958154 Ну тут нужно говорить не что ты не знаешь английский на уровне родного. А что у тебя боли при чтении информации на английском. Исправляется это только одним способом.
Common Lisp очень нравится, если я не ошибаюсь, хотя не ручаюсь, эти ребята его используют: www.konsom.ru/solutions, так что вещь стоящая. Scheme пользовался, действительно хорош разве что только для изучения, дальше пока не заходил. Подборка годная.
Что-то без продвинутой системы типизации (в том числе и с зависимыми типами) и без монад да чистоты функций как-то смотрится на лисп, как на Си-- какой-то мира функциональных языков.
>>960523 Ну, я не нашел другого способа изменять отдельные пиксели в поверхности. Документации нормальной, кстати, я тоже не нашел, при этом у более старого lispbuilder-sdl она есть.
>>963558 >Кложа норм вариант для нюфани для вката в лисп? Да, вполне, хоть и кложа немного особняком стоит в лисп-мире. Но если же ты хочешь попробовать именно функциональщины, то лучше взять что-нибудь из ML-семейства, потому что лиспы больше про метапрограммирование, чем ФП
Как и анон выше, вкатываюсь в кложур, и сука я горю от lein. Как эту хуйню поставить под винду? Это пиздец, то он его вообще не видит, то видит только из папки с jar-ом, то блять сново не видит. Примерный ход действий: скачал батник, который ставит 2.7 версию, прописываю в системыне переменныу путь C:\clojure-1.8.0\lein, так же пробовал тот путь, в который он ставится с помощью self-install, резуьтат один, видит его только если сижу в папке с jar архивом. Ну что за пиздец, как его юзать то ?
>>966556 Как только на линуксе появится нормальный стек CAD/CAM систем, так сразу на него и перейду. А сейчас никому кроме кодеров ан фулл ставку и серферам интернетов он нахуй не нужен.
(define (accumulate op initial sequence) (if (null? sequence) initial (op (car sequence) (accumulate op initial (cdr sequence))))) (accumulate + 0 (list 1 2 3 4 5)) В четвертой строчке op подчеркивается в Racket и пишет function call: expected a function after the open parenthesis, but found a variable.op является в данном процедуре +.Пример взят с SICP страница 122,процедура накопления.Почему не воспринимает op как + помогите,плиз.
Бля, кто пояснит за repl в cgtqcvfrct (clojure). Это пиздец какой то, spc m e e(f), выдает ошибки, нихуя не вычисляется, вроде минуту назад все работало, написал еще пару функций - перестало. САм код: (defn print-and-say-hello [name] (print "Saying hello to " name) (str "Hello " name)) (print-and-say-hello "Jeff")
(def person {:my-name "Dmitriy" :las-name "Son-of-dog" :age "23"})
(:my-name person)
(defn average [numbers] (\ (apply + numbers) (count numbers)))
(average [10 20 30 40 50 60 70])
Халп, ткните носом, как последовательно получить результат работы всех этих функций
Есть живые? https://pastebin.com/qdXuq5kq Есть такой пример из годной книжки clojure for brave. Но не могу понять, почему после recur remaining в if (empty? remaining-asym-parts) меняется содержимое хэша? ПОлучается что remaining заменяет remaining-asym-parts ? Почему?
Заодно, объясните, как работает recur в данном случае, у нас получается есть функция recur и два (чего?) параметра (ну вы поняли) remaining и final-body-parts. Каую роль играет каждый из параметров? По сути recur вроде как должен возвращать значение, но тут их два. Нипонятно.
Я, каталог-кун, заявляю что я повелся на бессмысленую пропаганду лиспоблядей и изучил етит их лисп знание лиспа никак не помогло мне расширить кругозор или улутшить свой стиль программирования лучше уж хорший учебник Prolog-а почитать с разбором задач чем тратить свое время на бесполезное функциональное програаирование краткий словарь: лямбда-функция как параметр функция высшего порядка- функция в которую передается функция или которая возврвщаяет функцию замыкание-то же что и лямбда мондада-массив
>>985277 Доблбоеб спалился. Если ты прочел на вики что такое функция высшего порядка то ты еще не выучил фп, да ты и прочесть то не смог -> >замыкание-то же что и лямбда Я бы попросил тебя написать простейшую программку, что бы доказать, что ты не строчки на лиспе не написал, но я и так это знаю. Уебывай.
> лучше уж хорший учебник Prolog-а почитать с разбором задач > чем тратить свое время на бесполезное функциональное програаирование
Поэтому во все мейнстримные языки со всей силы тащат ФП-концепции, начиная с лямбд и ФВП и заканчивая трансдьюсерами, монадами и прочими сложными словами.
Кложуране и не только, есть два вектора, если к ним применить (map list vec1 vec2), то он вернет сгруппированные по индексам значения из двух векторов, но что если вместо второго вектора дан вектор векторов, а нужно сгруппировать первый вектор с каждым из вложенных векторов (map list vec1 vec2.1) (map list vec1 vec2.2) (map list vec1 vec2.3) Как реализовать без циклов? Если хуево объяснил, то вот код https://pastebin.com/HLARTkNQ Нужно реализовать data-table, в Hint перечислены функции, которые нужно использовать.
>>990425 [code] (let ((keys (table-keys tbl))) (map (fn (%) (data-record keys %)) (rest tbl))) [/code] Кложи не знаю, но видимо как-то так. А вообще, кложурастов тут практически не обитает, потому что кложа - не лисп.
>>991129 Работает, спасибо. >потому что кложа - не лисп Зато у нас есть [] и {}, признайся, ты тоже хочешь. А что считается топовым лиспом? Где то тут видел, но сейчас не нашел, кто то писал, мол, как там вы без фича-нейм в cl и кложур, но вроде кроме рокета больше ничего и нет.
>>991456 >Работает, спасибо. >>потому что кложа - не лисп >Зато у нас есть [] и {}, признайся, ты тоже хочешь. В общелиспе они реализуются в несколько строк, но это не нужно, ибо солянка из разномастных скобок плохочитаема. Кстати, в кложе так сделать уже не получится. >А что считается топовым лиспом? Общелисп, конечно. >Где то тут видел, но сейчас не нашел, кто то писал, мол, как там вы без фича-нейм в cl и кложур Догадываюсь, схемер продолжениями хвалился. Но у них больше-то ничего и нет, в то числе и сообщества.
Я вот хипстер с подворотами неофит от пограмирования и только недавно вкатился на первую работу, и вот решил на волне хайпа посмотреть все таки что такое функциональное программирование. Услышал про SICP, пищу первые хеллоувроды на SCHEME и вот мои первые вопросы: 1. Собственно, а зачем лиспы нужны? Ну т.е. какова сфера применения? Академические исследования? Софт? 2. Часто ФП еще называют декларативным программированием, но я так и не понял что оно такое. Т.е. вот например ф-я квадрат на пхп, или императивный стиль: function square($x) { return $x $x; } На лиспе оно как-то так: (define (sqaure x) ( x x)) Но в чем глобальное отличие? Типа в первом - я говорю интерпритатору что и как сделать, а во втором - в общих чертах набрасываю? Нихуя не понимаю в общем. 3. Почему под такие вещи не пишут удобных ide? 4. На лиспах есть вообще удобные фреймворки, или сорт оф? Ну типа как ларавель на пхп. Допустим если я захочу на лиспе написать блог - что мне для этого требуется?
>>994268 ФП это не декларативное. Декларативное это что-то типа пролога (с натяжкой). Его суть в том тчо ты не описывешь порядок действий, а просто вкидываешь системе начальные данные и говоришь "зделай заебись", а она дальше ебется.
>>994341 Я кстати охуеваю от синтаксиса, у того же scheme его за час можно выучить. Алсо еще вопрос, я так понял у ФП языков как таковых нет веще навроде переменных, типов данных? Т.е. в (define (sqaure x) ( x x)) - sqaure это просто ссылка на память?
>>994358 скалу знаешь? у скалы есть скаласкрипт, который по сути является джаваскриптом с синтаксисом скалы и не совместим с самой скалой. у кложура есть подобное. кложур, как и скала, работает на жвм со всеми вытекающими (экосистема етц).
на бекенде обычно ты будешь кроме кложы ходить в либы и легаси на джаве (реже на скале), на фронте я не видел чтоб часто юзали кложускрипт (или скаласкрипт).
кложа не очень похожа на обычные лиспы, у нее синтаксис посложнее и еще куча мелких отличий от "обычных" лиспов, а еще в ней очень хорошо видно то, что она ориентирована на jvm.
>>994360 Ну я сейчас пишу на жсе, и ищу еще какой нибудь интересный фп язык, на котором в будущем возможно будет найти работу и дополнить мой стэк. Как думаешь кложа под эти задачи подойдет?
>>994343 Так, короче. Во-первых, лишпы по сути не более ФП, чем какой-нибудь JS. Кроме кложи, она чуть ближе к функциональщине за счёт иммутабельности по умолчанию. Но все равно, в принципе в этих хипсторских экмаскриптах есть всё функциональное что есть в лиспах (по крайней мере из коробки, ходят слухи что с помощью макросов из лиспа можно сделать хоть C++, хоть Haskell, но на практике я такого колдунства не встречал). Дальше, труЪ-ФП язык, из того что хоть как-то близко к мейнстриму - это Haskell. Переменные в функциональщине конечно есть, как и типы данных. Просто переменные эти неизменяемы (и объекты, на которые они ссылаются, тоже, короче, чистое ФП вообще не подразумевает никакого изменяемого состояния). А на счёт типов - труЪ-функциональный Haskell как раз известен своей охуенно мощной системой типов, которая даёт на ротан всяким там джавкам и шарпам и концепции из которой нет-нет да перекатываются в вроде как даже императивщину, отличный пример - Rust (всё жду когда в него HKT завезут, вот тогда заживём!). Вообще, если попытаться максимально коротко описать основные принципы функционального стиля, это:
1. Иммутабельность. Почему? Да потому что часто оно получается, во-первых, более предсказуемо, во-вторых, безопаснее при работе с многопоточностью, асинхронностью, вот этим вот всем. Если интересно как те же хаскеллисты избегают во многих случаев постоянного копирования данных при каждой операции, почитай про персистентные структуры данных.
2. Отсутствие сайд-эффектов. В принципе изменение состояния тоже можно считать сайд-эффектом. Суть в том, что в чистом ФП функции формально не пишут ничего в консоль, не меняют файлы, не выводят графику. В общем, не производят никаких эффектов - просто вычисляют значение. Понятно, что программа должна производить сайд-эффекты, поэтому суть ФП в том чтобы их инкапсулировать (т. е. отделить "мухи от котлет", сайд-эффекты от основной логики вычислений). В Haskell это (и не только это на самом деле) делают с помощью тех самых монад. В не таких труЪ ФП языках как Haskell такого жёсткого разделения нет, просто большую часть функций стараются логически отделять функции, работающие с внешним миром, от функций, реализующих какую-то логику вычислений.
3. Функции как объекты первого класса (т. е. ссылку на функцию можно передавать как любое другое значение), функции высшего порядка (это когда функции принимают другие функции в качестве аргументов и/или возвращают функции) и их активное использование. То есть например чтобы обработать список в функциональных языках используют не циклы (потому что циклы используют изменяемое состояние и вообще императивны), а функции высшего порядка. Функция map принимает функцию, применяет её к каждому элементу списка и возвращает список результатов. То есть map(f, [1, 2, 3]) это то же самое, что [f(1), f(2), f(3)]. В этом и проявляется "декларативность" - мы не говорим, "взять первый элемент, применить к нему функцию, добавить его в возвращаемый список, увеличить счётчик на 1", мы как бы говорим "в нашем новом списке каждый элемент - результат применения функции к соответствующему элементу в старом списке". И теоретически компилятор того же Haskell вправе применять их не по порядку (от первого к последнему), а в каком-то другом порядке или вообще параллельно. Короче говоря, мы описываем что хотим получить, а способ получения этого результата может в какой-то мере отдаваться на откуп компилятору. В императивных языках компилятор порядок вычислений не меняет, поэтому в императивных языках под декларативностью функционального стиля понимается не то что технически конкретный способ получения результата неизвестен, а то, что детали реализации инкапсулированы и код всё-таки выглядит более декларативно, чем при использовании императивных циклов. Хотя бы чисто визуально.
Потом, есть ряд абстракций, которые все так или иначе связаны с предыдущими пунктами и которые прижились в ФП-сообществе. Ну типа там всякие функторы, монады, трансдьюсеры, вот это вот всё. На самом деле всё это довольно простые вещи, это как ООП-шные паттерны проектирования, только из мира ФП.
А в коде "(define (twice x) (+ x x)" x - никакая не ссылка на память, конечно же (ФП стремится максимально асбтрагироваться от таких низкоуровневых понятий, как "ссылка на память"). Это обычная переменная с динамическим типом, как и в любом другом динамически типизированном языке, вроде JS, Python, PHP, Ruby и т. д. и т. п. То есть аналог на JS будет "function twice(x) { return x + x; }" или "const twice = x => x + x;". (я заменил square на twice и звёздочку на + потому что звёздочку здешняя разметка съедает).
>>994268 >1. Собственно, а зачем лиспы нужны? Ну т.е. какова сфера применения? >Академические исследования? Софт? Нет, блядь, балет. Какая ещё может быть сфера применения у языка программирования общего назначения? >2. Часто ФП еще называют декларативным программированием, но я так и не понял что оно такое. Декларативным называют описание проблемы в терминах некой абстракции, отличающейся от абстракции машины (т.е. память и последовательность команд) >3. Почему под такие вещи не пишут удобных ide? SLIME. Было бы хорошим вопросом: почему для других языков ничего подобного рода не написали >4. На лиспах есть вообще удобные фреймворки, или сорт оф? Ну типа как ларавель на пхп. Допустим если я захочу на лиспе написать блог - что мне для этого требуется? Есть и не один.
>>994414 Спасибо. У меня вообще сложилось впечатление, буд-то лисп это как глина из которой разработчик лепят что нужно для своих задач, не? Пост, есть что-то как slime под схем? Я просто по сикп хочу заниматься. Или это мне надо гуглить все эти плагины для емакс?
>>994385 >Кроме кложи Кложефанат незаметен. Ладно бы схему в пример привел, но не этот же недоязычок для скриптования явы, в котором даже tco нет. >ходят слухи что с помощью макросов из лиспа можно сделать хоть C++, хоть Haskell, но на практике я такого колдунства не встречал Плохо смотрел. Вот сишка, например https://github.com/y2q-actionman/with-c-syntax/blob/master/README.org
>>994421 >У меня вообще сложилось впечатление, буд-то лисп это как глина из которой разработчик лепят что нужно для своих задач, не? Да, эта одна из его характерных фишек. >Пост, есть что-то как slime под схем? Slime только для общелиспа, у схемы geiser. Рекомендую просто взять спейсмакс, там уже всё настроено.
>>994431 Спасибо, анончик. А на той же кложе может писать программы общего назначения, которые обычно пишутся на питоне, или пока маловатое библиотек для этого? Или может он просто не подходит для этого?
>>994449 >которые обычно пишутся на питоне Нет, конечно. Ты бы согласился заменить весь используемый питонософт жавой? Сомневаюсь. >или пока маловатое библиотек для этого? Да библиотек-то достаточно, но есть у кложи один фатальный недостаток, из которого следует куча недостатков и в дизайне самого языка, и в его реализации, и сообществе, и, собственно, в библиотеках. И называется он JVM.
https://repl.it/languages/scheme кому интересно, нашел удобный онлиан интерпритатор лиспа. Есть даже возможность зарегаться и сохранять свои хеллоуворды. Мне пока для подделий из первой главы сикпа хватает. все то же неофит без подворотов
>>994889 Интересно, а кто-то умудрился запустить ту же схемку на винде в нормальной среде разработки? Или никсы + емакс наше все? Я пробовал в эклипсе, но плагины так и не заработали.
>>997529 >Интересно, а кто-то умудрился запустить ту же схемку на винде в нормальной среде разработки? Да, емакс работает. Алсо, для задачек их сикпа и дррэкет сойдет >Я пробовал в эклипсе, но плагины так и не заработали. Они давно протухли, ибо какой лиспер захочет поддерживать плагин на яве для неюзабельного монстра
>>997536 >для задачек их сикпа и дррэкет сойдет Да все равно пиздец как неудобно после няшных иде от жетбрейнс. >Да, емакс работает. А есть какая-то инструкция как запустить емакс + спейсмакс на винду? Ну для таких неофитов, кому само слово емакс это сильное колдовство. Мне вообще так что бы изкоробки.
Основные диалекты
— 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 - это минималистичный лисп, пригодный в основном для обучения, исследований. Наиболее практичными реализациями являются GNU Guile ( https://www.gnu.org/software/guile/ ) и Chicken Scheme ( http://call-cc.org/ ).
— Racket - Развитие PLT Scheme. Racket включает в себя много подъязыков (typed racket, lazy racket, frtime racket, Scheme стандартов r5rs и r6rs).
— Clojure - Стильный, модный, молодежный лисп с бóльшим уклоном в функциональщину, иммутабельными структурами данных, поддержкой параллельщины с транзакционной памятью, агентами. Ориентированность на JVM сильно отразилась на дизайне языка, что многим не нравится.
— Emacs Lisp - его область применения ограничивается емаксом. Является наследником ТОГО САМОГО MacLisp'а.
— Lisp Flavored Erlang (LFE) - Реализация Lisp поверх виртуальной машины Erlang (BEAM), в итоге мы имеем всё лучшее из обоих миров: привычный синтаксис s-выражений, макросы, функциональщина, иммутабельность, многопоточность из коробки + набор либ для построения отказоустойчивых распределённых приложений OTP. http://lfe.io/
— 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
Как изучить?
— Emacs Lisp
+ An Introduction to Programming in Emacs Lisp https://www.gnu.org/software/emacs/manual/html_node/eintr/index.html — скучный туториал, предполагающий что читатель вообще не умеет программировать
+ Emacs Lisp Reference Manual https://www.gnu.org/software/emacs/manual/html_node/elisp/index.html
— Common Lisp
+ Practical Common Lisp http://www.gigamonkeys.com/book/ или русский перевод — http://lisper.ru/pcl/
+ On Lisp http://www.paulgraham.com/onlisp.html
+ Land of Lisp
+ 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
+ The Little Schemer, The Seasoned Schemer, The Reasoned Schemer
+ SICP (это скорее вводные лекции по программированию, а не учебник по схеме, но тоже пойдет)
+ http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme.html
+ Попрактиковаться можно на Exercism'е http://exercism.io/languages/scheme
— Racket
+ The Realm of Racket
+ How to Design Programs http://www.ccs.neu.edu/home/matthias/HtDP2e/index.html
+ https://docs.racket-lang.org/
— Clojure
+ Programming Clojure, 2nd edition (для новичков)
+ Clojure for Brave and True http://www.braveclojure.com/foreword/ — В отличие от предыдущего сухого изложения, более приятный для восприятия материал, да и бесплатный, если читать онлайн.
+ The Joy Of Clojure, 2nd edition (есть есть бэкграунд в Лиспе или ФП)
+ Попрактиковаться можно на Exercism'е http://exercism.io/languages/clojure
— 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/Racket
+ Emacs + Geiser (поддерживает GNU Guile и Chicken Scheme)
+ 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