Это копия, сохраненная 20 июля 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Основные диалекты
— 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
Оно не стандартизировано, так что у каждой реализации свои особенности.
Можешь почитать это http://ccl.clozure.com/docs/ccl.html#implementation-details-of-clozure-cl
или это http://www.sbcl.org/sbcl-internals/index.html , попутно ковыряя исходники SBCL, в которых, как говорят, достаточно несложно разобраться
или это https://github.com/froggey/Mezzano https://github.com/froggey/Mezzano/blob/master/doc/internals/abi
Спасибо, анон!
Смотря для чего. С моей точки зрения, общелисп практичнее хотя бы потому, что нет разрозненности между реализациями, отчего и библиотек больше, и качества они лучше.
Сама кложура частично и еще порты всякие
Все проекты - фронтендные, то есть 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, это к примеру), поэтому я свалил с него
Не, ничего более не имелось в виду, просто проследовал просьбе из шапки прикрепленного треда.
Хотя, конечно, можно было бы запилить оформление шапки как в крестотреде, но позже, т.к. пока времени на переоформление не имею.
Мы тут проект в прод начали делать на кложурскрипте. Взяли реагент, гарден, секретаря и еще какой-то залупы. Стоит ли брать ре-фрейм или проще накостылять? Надо чтобы обязательно был сервер-сайд рендер. Сейчас это сделано через эксресс+кложурскрипт на "сервере", чтобы компоненты были общими.
Какая разница на чем их делать?
абсолютно ненормально
лисп - язык для настоящего искусственного разума, а не для дэбильных нейроноперделок
Могу посоветовать отказаться от garden, довольно тяжелая штука (тормозит), тяжело править стили, т.д.
Ре-фрейм однозначно стоило бы брать, если бы ты не сказал про сервер-сайд. Нет, ре-фрейм можно срендерить на сервере, но довольно костыльно.
А так вроде как Ом легко рендерится на сервере, а функционала много.
Ом мне не нравится. Когда гарден должен начать тормозить? Сейчас я сделал так:
1) lein garden once конпелит стили и кладет их в статик файл (для прода)
2) В реагенте я делаю (garden/css style-map)
В результате фигвил это дело вместе с разметкой накатывает и результат приходит через 0.1 секунду в браузер. Зависимость есть, брат жив. Правда стилей пока не много: ~150 строк структура.
Второй вопрос: hoplon щупал?
http://lisper.ru/pcl/
Можешь изучить CL чтобы было с чем сравнивать, но увы реальный софт на нем писать боль. Уж я то знаю.
http://www.parens-of-the-dead.com/
Вот тут магнарс на кложуре делает сервер сайд.
ПРосто сейчас такое время, когда нужно чтобы код на сервере и клиенте был общим. Поэтому кложурскрипт и тянут на сервер (с нодой)
хм, уже работает
Началось все с книжки "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). Да оно просто пиздец как медленно поднимается, но когда поднимется, равных по удобству инструментов я пока не видел.
Началось все с книжки "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). Да оно просто пиздец как медленно поднимается, но когда поднимется, равных по удобству инструментов я пока не видел.
(defn fuck [shit]
(* shit turd))
(fuck 2)
Является ли fuck чистой функцией?
Ну раз turd имутабельно, то получается что fuck зависит только от аргумента, а значит оно чистое. Правильно или нет?
Если set! забанен, то да. Если нет, то зависит.
Чуток стесняюсь. Суть в когнитивных искажениях, синестезии и особому строению и самоорганизации при импульсных нейронных сетях.
Я просто некоторое число..
https://core.ac.uk/download/pdf/6117416.pdf я думаю, что связи между нейронами образуются подобно грибнице.
Но там меня не примут, я довольно плохо знаю математику.
> garden
ну, у меня garden висел на auto, оперативы мало, из-за этого и тормозил похоже. У меня рядом с boot (вместо lein) висит вебпак, так как нужно компилить зависимости для React, вот он у меня сейчас и занимается стилями, писать на stylus намного удобнее, чем на garden.
> hoplon
нет, но сейчас посмотрел, выглядит круто, нужно попробовать поиспользовать. Там полноценное FRP, можно делать global state, от него зависимости, от него еще зависимости.... и получается re-frame, только без удобного регистра субскриберов и без хэндлеров/интерцептеров, цикла событий. Но если есть сервер-сайд рендер, то можно поверх него сделать свой re-frame.
golang я знаю давно. Пометка про первый проект - это не то, что он первый мой проект, а первый проект из списка кложуровских проектов. Писать на golang мне нравится, лол. Кложа и го - два из четверых моих любимейших языков (на других двух (хачкель и erlang/elixir) я просто ничего реального не писал)
Ну на кложе много серьёзных проектов, другое дело, что мне серьёзный бэк писать особо не приходилось, простая rest api прослойка между db и клиентом + немножечко логики, это мне проще написать на golang/ruby+sinatra/express. А если нужно что-то крупнее, то я возьму рельсы. Смысла писать бэк на кложе я для себя не вижу. Разве что есть профит передавать между клиентом и сервером edn вместо json (а то на клиенте функции для преобразования "is_active" <-> :active? для каждого запроса туда и обратно).
Просто не укладывается, как может одновременно нравится кложура/хачкиль/эрланг и такой дибиловатый ребёнок с вечной ухмылкой-го
На го я пишу, когда мне нужно написать что-то очень быстро, за короткий промежуток времени, и что бы это работало. Причем это получается не говнокод, как на пыхе, а что-то нормальное (статическая типизация и простота в разбитии кода на кучу модулей) Я почти не использую горутины сам (хттп-либа сама запускает все хэндлеры в своих горутинах), я просто пишу код, как на питоне. Ничего крупного и серьёзного я писать на го не стану.
Когда же я пишу на хачкеле, я пишу это уже медленнее, постоянно пытаюсь что-то отрефакторить, сделать код еще чище и проще и в итоге много времени сам охуеваю, как же круто все это на фп. (Собственно, мне сложно охуеть от какого-то императивного кода, а вот от функциональных решений я до сих пор охуеваю, как от qsort на хаскеле много лет назад).
Сомневаюсь, что кто-то здесь пользуется чем-то иным, кроме емакса. Чего и тебе советую.
Горутины кстати охуенная вещь. Вроде как core.async собственно навеян горутинами и каналами? понятно что в начале был CSP
горутины вещь крутая, я не сомневаюсь, только они не нужны в коде, где идет запрос базу, преобразование в json и отправка ответа
core.async действительно сильно напоминает горутины (хотя бы "go")
Горутины нужны если у тебя не один запрос в базу, а запрос в базу и три запроса к сторонним сервисам. Тут они с каналами становятся просто незаменимыми.
Вот кстати кто-то сверху спрашивал про CL. Просто сравните овертон с той поделкой что для CL сделана. И сразу все вопросы про дохлое комьюнити отпадут. как же блядская жвм бесит своей тормознутостью на подъеме
Я с ним поигрался, пощупал их экземплы, погенерил дабстеп, но не придумал, что лично мне с ним дальше делать и забил.
Я в тебя готов кидаться говном целый день. Этот блядский кусок говна жрет память по 100мб/минута, из-за чего постоянно крашится. Заебало.
нет, не было причин пока. Но много видел, что люди используют, значит это как минимум не сильно проблемно
Вася, неужели ты не понимаешь, что проблема не в количества памяти, а в том, что это херота течет как второй фурифокс? Почему я могу открыть 300 буферов с жс и го, и емакс даже 2х гигов не отожрет, а немножко жабы убивает машину?
Не знаю, у меня не убивает. И имакс с 300 буферами у меня отжирает мегабайт сто памяти максимум, кстати. Может у тебя какие-то волшебные мегабайты?
А пьедестал?
Куда не тыкни, Coming soon!Coming soon!Coming soon!Coming soon!
Мне на клжс приходят на ум только два больших опенсурсных проекта: прекурсор и сиркл си ай. Они оба на оме вроде как, так что хз.
Двачаю вопрос, кстати.
Как я понял, бут используют те, у кого какие-то сложные деплойные скрипты, и они их хотят писать на кложе, а не на баше, и им нужен доступ к энвайроненту жвм во время сборки, так что нельзя взять кложурно-одный шелл. Но сам я хз, что там за деплой у них такой, что это нужно.
мне бут нужен только потому, что я заебался писать огромные ебучие конфиги для лейна
А что для бута при той же функциональности не будет такого же по размерам конфига?
Незнаю как остальные, а я вынужденный кложурист. Потому что цл умер, а других живых и готовых для прода альтернатив нет. Хоть свою пиши. пополни ряды прочих мертвых лиспов
Лол, "опыт в коммерческих проектах от 5 лет".
Объясни тогда, каким образом жырный конфиг лейна прверащается в пустой бут фейл?
>Потому что цл умер
Ну, мне так не кажется, сообщество таки живо и даже развивается, хоть и медленновато
Да, и мне объясни. Темплейты и плагины для лейна работают с бутом, кстати? Бут нью фигвил пашет?
>>879937
да че там объяснять, огромные сложночитаемые (и сложноредактируемые без паринфера) конфиги профилей заменяются на простой читабельный код
https://gist.github.com/anonymous/c26bfe1dc7e37d20c246d6f975f993f5
Конфиги таки есть, но это не такая ебанина, как на моем прошлом проекте на лейне (пикрелейтед), многое норм по дефолту
Про шаблоны не знаю, бутом пользуюсь только первый проект, писал все с нуля.
Эм... Так ты же просто выкинул гарден и фигвил, не? Если из лейна их выкинуть, то там тоже будет малобуков, лол. Или я чего-то не понял?
там используется reload, который вроде как заменяет фигвел (такие же панели с ошибками, такой же хотрелоад, только репла нет).
Кроме того, если бы я вставил в бут garden, он бы все равно вышел короче из-за возможности использовать
а) дефы, функции
б) определять параметры по умолчанию. В лейне, как видишь, некоторые параметры дублировались для разных "профилей". Может, это можно было как-то сделать в лейне, но мне лень разбираться с форматом этих конфигов.
в) как я уже писал выше, многие параметры в boot указаны по дефолту в удобных значениях.
Я тот человек, который между кодом и конфигом выберет код, не переношу огромные json/xml/yaml конфиги, где можно настроить все на свете.
https://github.com/cxxxr/lem
Не просто медленновато, оно просто в конвульсиях.
Да и сам язык, увы, пригоден конкурировать только с сишкой до 89 года. А если начать к нему прикручивать батарейки уровня CL21, то начнется адовая фрагментация. В общем увы и ах.
Лол, в чем смысл? Писать ядро редактора на тормозном цл вместо ультрабыстрой сишки?
А емакс без тонны код на елиспе никому не нужен.
Смысл в компилируемости расширений в машинный код, очевидно.
>А емакс без тонны код на елиспе никому не нужен.
Поэтому я и говорю >>880087
>Если они ставят себе целью совместимость с емаксом
Благо, елисп не так сильно отличается от общелиспа, и запилить слой совместимости вполне реально (я даже видел где-то в сети). Тем более, что елисп в последнее время мимикрирует под цл.
Лучше бы многопоточность помогли запилить, чем делать очередное ненужно.
А на счет "не так сильно отличается", ты походу елисп последний раз видел лет 10 назад.
Думаю, им лучше знать, что им лучше делать.
>А на счет "не так сильно отличается", ты походу елисп последний раз видел лет 10 назад.
Последние 10 лет он только и делал, что потихоньку превращался в цл.
Ну в лейне тоже можно объявлять биндинги и расшаривать куски конфига в разные места. Но вообще я тебя понял, это скорее вопрос личного предпочтения. Мне вот наоборот приятнее работать пусть с многословным, но представленным в виде данных билд-конфигом.
Хотели же (уже лет ндцать как) чхему впилить в имакс. Вощ и ныне там. А эти ребята взяли и запилил то же, но с кл?
>Хотели же (уже лет ндцать как) чхему впилить в имакс.
Впиливали же guile вроде.
>А эти ребята взяли и запилил то же, но с кл?
Нет, они переписали с нуля.
Впиливали, да чет не впилили как-то, не? По-крайней мере я ни одного пакета на нем не видел.
По совету сектанта итт попросил у менеджера еще одну плашку. Место под плашки в ноуте кончилось.
Говорю же, ноут. Нет там больше места под плашки. Теперь памяти хватает, но емакс все равно рандомно крашится от злоеубучего кложурсрипта. Плюс когда нрепл активен smex начинает тормозить. Какие-то буферы кложи при сохранении на 2 секунды виснут. Короче не так хуево как ванильный жс, но все равно плохо.
Бро, почини имакс. Ты мамой клянешься, что он у тебя крашится? Я буквально пару раз в жизни видел, как крашится имакс, причем один раз это был какой-то баг, который пофиксили в следующей же версии. У тебя точно весь имакс крашится? Это пиздец же.
Алсо, у тебя стабильные версии всего тулинга стоят, да?
Почему как только кложура поселилась в емаксе, он начал крашится? Крашится от слова закрываться нахуй мгновенно, проебывая все на свете. Крашится и тормозить.
Я не знаю, не видел кроме тебя никого, у кого крашится имакс. Версии-то у тебя стабильные и одни и те же у всех пакетов имакса и плугинов лейна?
В программировании мало чего понимаю, разбираюсь почти с нуля, но инфы по лиспу очень мало в интернетах
Немного разобрался, read-line теперь выводит мои числа из файла в консоли верно. Теперь как их перекинуть в edit_box, чтобы они там отображались?
Диалоговые окна в нём делаю, а уже саму начинку в лиспе пишу.
(defun vl_fs ( / fname file re ex)
(setq fname (getfiled "Выбрать файл" "D:\\" "txt" 16))
(setq file (open fname "re"))
(setq re (substr(read-line file)1))
(setq ex (close file))
)
Перед закрытием файла, надо его содержимое вывести в edit_box. В консоли у меня отображает нужный мне ряд чисел, я просто не знаю как его вывести в нужном мне боксе.
Стабильные. Одно и тоже на двух разных машинах. Конечно проблема в емаксе, во мне и даже в аллахе, а не в кложуре.
Ну в кложуре проблема быть никак не может, лол, - кложура крашит имакс? Что-то из разряда марсианских жидомасонов, срущих в подъездах. А вот в сидере - вполне, хотя все равно странновато, что весь имакс крашится. А что разрабы сказали?
Крашится оно только когда подцеплен фигвил. Чтобы говорить с разрабами надо им что-то показать. А показывать нечего, потому что даже стек трейс не поймать без танцев с бубном.
Ссссуууууука
Fatal error 11: Segmentation fault[1] 15524 abort (core dumped) emacs
emacs 72.48s user 2.74s system 4% cpu 28:20.22 total
> ulimit -c unlimited
> Fatal error 7: Bus error[1] 29185 segmentation fault (core dumped) emacs
Охуенно просто. Охуитетельно.
while (/= elem nil)
Если nil заменить на какое-нибудь существующее, то цикл правильно работает и останавливается на указанном элементе. Походу цикл повторяется второй раз и в конце всегда выдаёт ошибку "неверный тип аргумента: stringp nil". Пробовал заменять на null и на length 0, один хер та же самая ошибка.
Ну, за этим в документацию, мне, как и, наверное, всем остальным ИТТ, на автолиспе писать не приходилось, поэтому таких мелочей не знаю. Должен быть какой-то метод у edit_box вроде setvalue.
Спасибо, уже разобрался. Я пишу наверное чуточку быстрее полторы строки в день чем тут читают. Вот сейчас с циклом затык, даже нашёл пример аналогичный, но у меня всё равно не хочет работать.
Структура нарушается. Вот смотри, если я напишу
(while (/= elem 1))
То у меня будет считывать строку за строкой из файла, пока не наткнётся на 1, тогда цикл завершится. В моём случае мне нужно считывать строки до конца файла, т.е. пока элемент не будет равен пустом месту. В теории всё хорошо, я даже нашёл пример http://aco.ifmo.ru/~nadinet/html/lectures/lsp_2.html#_size где делают абсолютно также. Но тем не менее где то ошибка в цикле, и он запускается второй раз после прогона всего файла и выбивает ошибку.
Ты таки попробуй, потому что в общелиспе /= предназначен только для сравнения чисел.
>/= elem 1
Строка сравнивается с числом? Хм, автолисп слаботипизированный что ли?
Уже и в этом разобрался, подстрокой считывал дальше после окончания и цикл накрывался. Короче проблема внутри самого цикла была, а не в самом while.
И (/= elem nil) работает? Странно, потому что в документации пишут, что он только для численных сравнений.
В моём учебнике допускается
>Проверяет неравенство аргументов (рекомендуется использовать для чисел или строк).
>(/= <аргумент1> [<аргумент2> ... [<apryMeHTN>]...])
>Типы аргументов: любые.
>>883827
Ну что, нашел, в чем проблема? Если у тебя действительно последние стабильные версии имакса и всего сидер-релейтеда, то пиши им и без стектрейса. На чем крашится-то, на каком-то конкретном вводе в репл? Или вообще рандомно? На пустом проекте или только на рабочем? На обоих машинах енвайронмент один и тот же? Любопытно же :3
Вообще рандомно, перед этим начиная заметно визуально подтормаживать на сохранении/эвале кложурскриптовых файлов. Только на рабочем коннекте через фигвил. Энвайронмент ясен хуй не может быть 100% одинаковым, но дистр одинаковый, значит версии софта плюс минус одни и те же.
А хуле толку писать о сегфолте вообще без данных для выяснения причин. Без стека нет смысла.
Нет ты. У меня-то не падает.
А что за дистр, арч небось, лол?
Да не, напиши все равно, чтобы был репорт. А то я вот сейчас посмотрел их иссуи, вроде ничего похожего нет, и если у кого-то еще что-то похожее, то он тоже ничего не найдет и подумает, что ну его нахуй, и в итоге никто так и не пофиксит проблему, если она все-таки есть.
Алсо, я бы попробовал на другой версии имакса воспроизвести, если не лень. Ну и без загрузки конфига. И на пустом проекте.
Арч. Поймаю трейс, сделаю репорт.
Винда - это вообще сплошное мучение как бы. Вроде же расписано все на сайте у них. Загугли "lein windows", профит. Из редакторов попробуй курсив или лайттейбл, например. Хотя раз только кложурскрипт, то пусть хоть в нотепад.ехе пишет, фигвил же.
Почему тогда написано в мануале что достаточно пакет установить?
>The easy and quick way
http://www.nongnu.org/geiser/geiser_2.html#Installation
Простой способ установить пакет в сам емакс. Без git clone и ручной установки.
Потому что для того, чтобы был гейзер, достаточно установить гейзер. Гейзер - это не гуайл. Гейзер - плугин для редактора, а гуайл - конпелятор\интерпретатор схемы.
И правда охуеть! В кложуру завезли то, что в общелиспе из коробки уж лет с двадцать
20 лет как ненужно.
В любом случае, уже поздно выпиливать.
А смысл свой доктору покажи, уж что-то я сомневаюсь в его здравости.
Наверное то, о чем мы говорили, нет? Ты лучше вернись в свою палату, поржи, а потом, как будешь в более вменяемом состоянии, возвращайся.
У меня сложилось впечатление будто ты утверждаешь, что такая бессмысленная хуйня как "отлов чего-то там в компайл-тайме" не только не является бессмысленной хуйней, но ещё и существует в самом лиспе. Я ведь не ошибаюсь?
>Я ведь не ошибаюсь?
Частично. 1) не бессмысленная 2) отчетливый "компайлтайм" есть не во всех лиспах.
Ну а вообще удивительно, что кто-то в лиспотреде об этом не знает. Может, ты ещё и про вывод типов в общелиспе не слышал?
Рассказывай где ты в лиспе видел аналог этой кложурской бессмысленной хуйни.
Про вывод типов потом уж как-нибудь.
Вообще не похоже. Похоже, что ты ни шиша не понимаешь.
И вообще, судя по таким словам как "проверка корректности", ты гнойный статикодебил.
Твоё отношение к тем кто не разделяет твои вгзляды показательно. Даже незнаю кто хуже, ты или гитлер.
Какие еще мои взгляды, ты о чем?
Или ты думаешь, что тут кто-то кроме тебя не знает, что "Compilation failed" пишется, когда при компиляции были варнинги, кроме стайл-варнингов? Что код этот прекрасно скомпилировался и прекрасно работает точно так как написан? Что он "корректен" в любом смысле этого бессмысленного слова?
Давай показывай нормальный аналог той хуйни. (Подсказка: его нет и не может быть)
Типы в общелиспе так тоже умеют. Но только они полноценная часть языка, а не сбоку прикрученный костыль.
Это все прекрасно. Сам общелисп только мертв и неюзабелен уже. Увы.
>и прекрасно работает точно так как написан
Вообще-то нет. Дизассемблируй функцию и увидишь, что ничего, кроме кода выброса ошибки, там нет.
>Давай показывай нормальный аналог той хуйни.
Ну покопай гитхаб, там полно неработающего говна.
Проверка типов - вполне себе "нормальный аналог", единственное, что в компилятор вшито и апи не предоставляет
> Вообще-то нет.
Вообще-то да. Но если хочеть еще позора, можешь обосновать свое замечательное мнение, не такое как у других.
> Дизассемблируй функцию и увидишь, что ничего, кроме кода выброса ошибки, там нет.
Что ты несешь? Там check-type должен быть еще.
> Проверка типов
Где, какая "проверка типов"? Рассказывай, показывай.
> единственное, что в компилятор вшито и апи не предоставляет
Ну еще бы, какое может быть апи у того чего нет и быть не может.
>Там check-type должен быть еще.
Я имел в виду, что форма, не прошедшая проверку типов, заменена кодом выброса ошибки.
> какая "проверка типов"?
Которая не дает складывать попугаев с питонами, очевидно.
> Я имел в виду, что форма, не прошедшая проверку типов, заменена кодом выброса ошибки.
Во-первых, никакой "проверки типов" там нет. А во-вторых, это самое банальное удаление мертвого кода. Функция "умножить", если какие-нибудь из аргументов не являются числами, сигналит ошибку. В данном случае заведомо известно, что второй аргумент не число, поэтому этот вызов и заменили на сигнал ошибки. Это общая оптимизация, никакого отношения к типам она не имеет.
> Которая не дает складывать попугаев с питонами, очевидно.
Чего блядь?
Ну вот и хорошо.
По-моему ты что-то путаешь. Что именно из кл ты имел в виду?
Нет, это я насрал.
Не хочешь пообсуждать 3,4,5,...,11D-рендеринг и его практическую реализацию на CL? У меня есть интересная, как мне кажется, идея, но одному мотивации нехватает.
https://github.com/TatriX/cl-gl-tutorials
Нет, спасибо. Я лучше на растекрестах буду этим заниматься, чем на CL.
А чего не CEPL? Мне уже начинает казаться, что ты специально выбираешь неотлаженные и вообще недописанные библиотеки, лишь бы оклеветать общелисп и перетянуть потенциальных лисперов на кложу
Ну допустим. Но зачем ты пердолил указатели напрямую через cffi, ковыряя внутренности cl-opengl?
https://github.com/TatriX/cl-gl-tutorials/blob/master/06/translation.lisp#L188
Если ты читал ридми, то там написано, что это адаптация кода из книжки. Нужно было, вот и пердолил.
Вообще конечно, боль и страдание. Не рекомендую.
>Вообще конечно, боль и страдание. Не рекомендую.
Но ты сам же себе эти страдания и обеспечил. Есть же в том же cl-opengl нормальные обертки, нет, буду голые биндинги дёргать.
Это говорит лишь о том, что обертка хуевая, но благодоря тому, что CL позволяет положить хуй на инкапсуляцию, я смог дернуть приватные методы и сделать что мне нужно было.
Пакет %gl предоставляет низкоуровневые биндиги, на что какбэ имя пакета и намекает, зачем ты в него полез - для меня вопрос.
>Это говорит лишь о том, что обертка хуевая
Это говорит лишь о том, что ты ССЗБ, который не читает документацию и лезет без повода в низкоуровневые интерфейсы. И инкапсуляция тут совершенно не при чем. Даже удивительно, что ты не догадался до прямого cffi:foreign-funcall.
Лол. Документация. Не смеши мои тапочки. Почти у всего чем я пытался пользоватся на CL либо вообще нет документации, либо она настолько хуевая, что лучше бы не было. Начиная с гиперспека.
Гиперспек, конечно, выглядит стремновато, но он не так уж и плох, особенно если сравнивать с каким-нибудь доксигеном.
А так да, с документацией библиотек не так всё радужно.
Документация на format это адский ебаный пиздец. Проще в PCL сходить, чем найти нужную директиву в гиперспеке.
Не такой уж и пиздец. Но вообще да, было удобнее, если бы все директивы описывались на одной странице.
Что на счет gui? Хочется кроссплатформенно, конечно
В каком именно лиспе? Берешь и осиливаешь, точно так же, как в любом другом языке. В чем конкретно вопрос?
Насчет гуи - есть гтк\свт\свингпростихоспати\хтмл+цсс\реакт\реакт нейтив для андройда и айфона\биндинги к андройд сдк\хуйзнаетчтоеще, короче - все есть, конкретизируй вопрос.
Лучше завершу некоторые дела, потом запилю демку и вброшу сюда, а то объяснять текстом долго и лень.
Если ты поставил ванильный емакс, а до этого пользовался только блокнотом, то конечно неудобно.
Емакс как музыкальный инструмент, сначала ты его осваиваешь, а только потом можешь издавать прекрасные звуки.
-> >>887500 вот этот базарит
С кл тебе претти мач придется юзать гтк, не припомню там других живых оберток. Может меня кто-то поправит.
>>887501
> lispbox
Боже мой, где ты это говно мамонта откопал? Юзай https://github.com/syl20bnr/spacemacs - ну или имакс прелюд, например.
Вообще, судя по твоим постам ты, мм, новичок в программировании. В таком случае начинать с коммон лиспа - это очень странный и неудачный выбор. Есть plt racket, он специально сделандля изучающих кодинг, там сразу и редактор с ide, и гуй-библиотека, короче - абсолютно все в одном месте и из коробки, скачиваешь один исполняемый файл и все.
Из того, что кроссплатформенно, опенсорсно да, есть и проприетарные и пригодно для использования:
qt: https://shinmera.github.io/qtools/ https://shinmera.github.io/qtools-ui/
electron: http://ceramic.github.io/
gtk: http://www.crategus.com/books/cl-cffi-gtk/ http://www.crategus.com/books/cl-gtk/gtk-tutorial.html
>>888068
>-> >>887500 вот этот базарит
Десктопное приложение на жаве?! Да вы, мусьё, изв^Wкложурист.
Ну можно-то оно что угодно, хоть на mcclim'е педалить да x-сервер с собой таскать. Но только нужно ли?
Это вопрос философский. А вот то, что люди так делают - ето факт.
Ваше мнение очень важно для нас. Держите нас в курсе.
Была в прошлом треде кажется. Хватит тут рекламировать свою залупу.
Tо есть если на входе [(0,1), (0,2), (1,3), (1,4)] вернуть она должна [(0,[1,2]), (1,[3,4])]
haskell треда не нашел, но мне главное принцип, а код сам напишу
https://gist.github.com/anonymous/55538d787adf8d9c2f1bf25dcff6442b
возможно есть более красивое решение.
Второй пример на эликсире, там group_by принимает опциональный параметр mapper, который и делает все красиво
ну и на кложе
А если использовать plumbing, то чисто теоретически можно и так
(grouped-map first second ['(0, 1), '(0, 2), '(1, 3), '(1, 4)])
ты про abs? Все таки не ide, подсветка не такая умная, чтобы различать builtin функции и переменные. Я обычно просто не использую такие идентификаторы, но сейчас было лень придумывать
а если ты про то, что закрывающие скобки серые, то это из-за parinfer. Сервые скобки почти не видны и чисто психологически проще использовать паринфер
https://shaunlebron.github.io/parinfer/
Не очень понял, оно чем-то отличается от smartparens? Ну кроме ебанутой подсветки.
Кто-нибудь пробовал?
а я где-нибудь сравнивал с smartparens? Есть еще несколько аналогов, че ты их не перечислил?
Разница в том, что smartparens для emacs, а parinfer для практически всех современных редакторов.
Фичв с затемненными скобками сугубо опциональна - кому не нравится, может отключить. Но она все таки помогает психологически не лезть удалять лишние скобки, а просто уменьшить отступ.
ну по гитхабу смартпаренс мне больше нравится. Паринфер исключительно для лиспов, смартпаренс судя по всему работает с любыми вложенностями. Сравнить иначе не могу, имаксом не пользовался ни разу.
Смартпаренс нужно как следует допиливать, потому что из коробки оно нормально работает только с лиспом. Но все крутилки там есть. А в чем ты там лисп то пишешь?
атом это чистый + паринфер. Хочется перейти на имакс из-за сидра, но боюсь мой комп с 4-мя гигами оперативы, постоянно работающими рельсами, хромом и бутом/лейном, не потянет интерактивную разработку
Лол, это точно. 10 гигов сжирает в лет это ваша жвм.
Про скобки, да. Ненавижу незакрытые скобки. От кода на картинке у меня учащается сердцебиение и появляется мерзкое чувство тревоги.
Если честно - я не юзал смартпаренс, это какая-то новая штука, а паредит был всегда. Он умеет делать структурные переносы на уровень вверх и вниз? Я даже хз, как это словами объяснить, погугли демку на ютубе если что.
Я как раз наоборот, юзал только смартпаренс. Потому что когда нужно было выбирать, я сравнил их, и получилось так, что смартпаренс умеет все что умеет паредит и еще сверху всякого. У него даже есть готовый сетап, типа включи-ка мне биндинги ка у паредита.
Еще и сверху всякого?! Ок, мне даже представить сложно, пойду сам тогда погуглю.
в моем случае (автор скрина) это просто шрифт с лигатурами - https://github.com/tonsky/FiraCode
ну так не используй, никто же не заставляет) Мнение анонов тут интересно меньше всего
А что тут еще кроме мнений есть-то? Ради знаний есть книжки, ютубы и всякие стек оверфлоу. А тут просто говном покидаться, да личное мнение посмотреть.
Пацаны, raynes умер. Пиздец какой-то, ничего не понимаю. Он же на год младше меня был. Не сказать, что мы с ним прям особо общались, но блин. Помню, как он меня в ирц троллил, лол. И как он после того, как кложурное комьюнити собрало ему бабла на билет до конференции, писал в блоге о том, что мол йееееей, меня настоящая живая женщина обняла, лол. Он тогда еще пиздец каким жирдяем был. И еще как я чуть не проебал на его пастебине все свои пасты, когда юристы из-за спамеров заставили его вырубить, хех. Странное ощущение - вроде я его и не знал даже, но как-то мне хуево.
Да не переживай ты так, в конце-концов он всего лишь кложурист
что я не так делаю? for - проход по списку с выполнение кода и проброс аргументов - вроде работает, но если проход в проходе делаю - шлёт нахуй. и да, наверно это как дерьмо выглядит, но мне хочется так, чисто из академического интереса. вкатываться начал позавчера и да, это emacs lisp.
Двести
Зачем вы это делаете? Нельзя просто ссылку на gen.lib.rus.ec дать?
Пользуются. Просто нормальных посонов пользующихся общелиспом пренебрежимо мало.
Есть опенсорсный ecl, который компилится через сишку, но он не умеет в кросскомпиляцию. Автор говорит, что его код для этого нужно прилично перелопатить.
Также существует clasp, но он пока только пилится и совсем сырой.
Поясните, пожалуйста, почему нельзя считать руби развитием идей общелиспа, и вообще, назовите хоть одно фундаментальное различие между ними, не считая синтаксиса и махрового легаси вроде cons-ячеек, очевидно.
Забей на SICP/TAPL/HtDP парашу. Сразу читай Lambda The Ultimate, затем OnLisp, наконец плавно переходи к Introduction to MIPS Architecture - идеальная архитектура для реализации своего первого Lisp-компилятора на основе CPS. Если интересуют структуры данных, то только MIT-овский 6.851 Advanced Data Structures. Виртом и Ахо-Копрофтом можешь сраку подтереть. Кнута не читай, ему есть адекватная замена - книга Hacker"s Delight.
В пистоне, например. https://docs.python.org/3/library/ast.html
>>893244
Разве макросы в CL (ты же об этом, да?) не существуют, в основном, для компенсации небогатого синтаксиса?
Вопрос был о том, что лиспокод это AST. И ты редактируешь не строчки, а сразу AST.
Посмотри вот это: http://www.parens-of-the-dead.com/
Забей на Lambda The Ultimate/OnLisp/Introduction to MIPS Architecture парашу. Сразу читай SICP, затем TaPL и наконец плавно переходи к HtDP - идеальное руководство для реализации своего первого первого полноценного проекта. Если интересуют структуры данных, то только Аховский Data Structures and Algorithms. Маккарти и Тернером можешь сраку подтереть. Уоррена не читай, ему есть классическая замена - книга The Art of Computer Programming.
Охуенно ты конечнo tapl & htdp рядом поставил.
До тех пор, пока парсер не сделает свою работу, никакого AST в принципе нет, ты редактируешь все те же строчки, не говоря уже о макросах, которые могут экспандиться хуй знает во что, reader-macros, на которых можно сделать хоть транслятор PHP в s-expressions.
>>893258
Я о том, что метапрограммирование уровня CL -- это костыль, возникающий от недостатков в дизайне языка. У пишущего на раби или любом другом современном языке потребности в определении новых синтаксических конструкций, как правило, не появляется. Это такой же атавизм, как и cons-ячейки.
То же, что утверждать, что функции
>-- это костыль, возникающий от недостатков в дизайне языка. У пишущего на рабивасике или любом другом современном языке потребности в определении новых функций, как правило, не появляется.
Толстовато.
>Толстовато.
Если ты это о своём посте, то да. Синтаксис -- средство, а не цель, поэтому, во имя консистентности, целесообразнее выделить из множества синтаксических конструкций подмножество тех, которые позволяли бы описать любую из возможных функций, чем заставлять программиста заниматься этим самому. Как пример -- стандартная в лиспе практика использования макросов вроде with-something. На рубях подобное пишут, не прибегая к "метапрограммированию".
Макросы суть те же функции с тем лишь исключением, что они могут принимать код в качестве аргумента. Собственно и "консистентность" они нарушают не более, чем самописные функции.
>целесообразнее выделить из множества функций подмножество тех, которые позволяли бы описать любую из возможных предметных областей, чем заставлять программиста заниматься этим самому
Вот как-то так это звучит. Ты же понимаешь, что не просто так люди на XML программируют.
Вот только в лиспах почему-то поддержку cps, контрактов, типов, erlang-style обработки исключений и паттерн-матчинга запиливают с помощью библиотек, а в других языках приходится ждать новой версии языка. Ну и да, толстовато. Ни в руби, ни в лиспах не шаришь, сразу ведь понятно.
Стажёром пойти без диплома, возьмут?
(a) > (car (x (cdr ’(a (b c) d))))
B
(b) > (x 13 (/ 1 0))
13
(c) > (x #’list 1 nil)
(1)
Её уже дописали?
Никто точно не знает. Боюсь, человечеству потребуется ещё ни одна сотня лет, чтобы всецело понять магию скобок.
Нипочему. Это миф.
Т.е. он мог быть в чём-то хорош для символьных вычислений, что есть форма ИИ, но это всё в далёком прошлом.
https://shinmera.github.io/portacle/
Вим поставить - не вариант? Тем более, если ты виммер, то прикрутить slimv должен осилить.
Ну или spacemacs
NixOS/Nix Package Manager используют для сценариев сборки пакетов и конфигов системы DSL похожий на Haskell, здесь же для этих задач используется Guile Scheme.
(defun rand ()
(setf seed (mod ( seed 16807) 2147483647))))
Почему после каждого вызова (rand)
[2]> (rand)
20739838 ; здесь я понял, 123416807
[3]> (rand)
682106452 ; а тут с хуя такое
[4]> (rand)
895431078 ; ??????????????
Выходят такие ответы?
Разобрался, спасибо.
Потому что на лиспе есть свой пролог. Это то, что обязан запилить каждый начинающий лиспер.
http://franz.com/support/documentation/current/doc/prolog.html
На кложе разве что, остальные лиспы никому нахер не вперлись кроме комонлисперов отсюда
у crossover была пара вакансий на удаленку поддерживать легаси на крестах и общелиспе
еще есть AutoCAD где AutoLISP встроенный язык, на hh иногда встречаются вакансии
Кстати, да, самый верный способ покодировать на Лиспе на работе-AutoCAD, но туда не вкатиться, как в айти после пары книжек.
Она началась 23 января 3102 года до нашей эры, а должна окончиться через 432 тыс. лет после начала.
И насколько будет плохо, если я буду работать с лиспом в vim?
Не пойму, ты о Common Lisp спрашиваешь или о лиспах в целом?
>и можно ли сделать лисп без него?
https://www.reddit.com/r/lisp/comments/4mtktn/bone_01_lisp_without_garbage_collection/
>И вроде есть еще компиляторы лиспа в Си, что скажете?
ECL, например, мало кто использует, потому что медленнее остальных реализаций и не полностью соответствует стандарту.
Що? Куда шитый код?
На кложу обычно с явы/жс переходят, а там народ, как мы знаем, беспринципный, непривередливый, им что бэйсик, что хаскель, что вилкой, что лопатой - всё одно. Про такие мелочи как tco или call/cc и говорить не приходится, тем более, что они в CPS и руками писать не гнушаются.
Тсо не нужно. Хвостовые вызовы должны быть явными. Когда у тебя итеративный процесс и рекурсивный процесс выглядят одинаково, это плохонько и мислидинг.
О, а вот и оправдания "это не баг, а фича" подъехали. Такие как ты и бэйсик оправдывали, что де код должен быть явным и без черных ящиков, и полиморфизм у вас был вредным.
>Когда у тебя итеративный процесс и рекурсивный процесс выглядят одинаково
Щито?
>если я открываю второе окно
Что-что ты делаешь? Можно разделить текущий фрейм на два окна, а открывают, например, файл
Я не хочу несколько окон в фрейме, я хочу много фреймов и в каждом по окну чтобы управлять ими через WM
Есть. И даже во взаиморекурсивные умеет. И даже без костылей, как у кложуристов.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Standard-Hooks.html#Standard-Hooks
>buffer-list-update-hook
Вот, кажется, подходящий хук.
>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" - фиг знает.
Нужна помощь, небольшое количество Яндекс.Денег в качестве благодарности гарантирую.
Да, даже книгу для таких написали - Lisp in Small Pieces
>ни на одном не взлетела графика
А ты уверен, что там есть чему взлетать? Образ-то хоть и сжатый, но всего на 140мб, если иксы туда и впихнули, то без какой-либо оболочки.
>А ты уверен, что там есть чему взлетать? Образ-то хоть и сжатый, но всего на 140мб, если иксы туда и впихнули, то без какой-либо оболочки.
После
xz -d guixsd-usb-install-0.12.0.x86_64-linux
получилось 900 Мб.
Не думаю, что guixоделатели ожидают, что их пользователи будут настолько кульхацкерами, что начнут сами ставить иксы. Хотя кто их знает... Попробую в мане https://www.gnu.org/software/guix/manual/ про иксы почитать.
Но даже если допустить, что они не положили в исходную поставку иксы (хрен их знает, на самом деле), надо понимать, как их установить и прикрутить сверху кеды с КДМ-ом (или что там сейчас за него).
Я отбежал.
Значение какого слова тебе непонятно?
Я посмотрел, иксов в установочном образе и правда нет, но в desktop.scm, который в руководстве предлагают использовать в качестве основы, прописаны и гном, и крыса.
https://www.gnu.org/software/guix/manual/html_node/Proceeding-with-the-Installation.html
Не более чем остальные. http://www.schloerconsulting.com/quantum-computer-q-lisp-programming-language
http://stevelosh.com/blog/2016/12/chip8-cpu/
Да просто признай, что у тебя давно уже не осталось сил и мотивации на подобные эксперименты, а не времени.
hh.ru/vacancy/19379442
при чем они нормальная контора, сейчас и вообще топчик чтобы работать удаленно..
>Required Skills:
>C/C++ programming using MS Visual Studio IDE
Лиспера они ищут, хохо.
Жуткое легаси под Win'95, вот у них что.
Любой. Prove, например
Как там в 00-ых?
Поясняю.
Ну серьезно, хоть немного конкретизируй запрос. Ракетка - хорошо и замечательно, если в общих чертах.
Ну, например, какие отличия от просто Scheme и всяких Common LISP. Еще интересует о среде Dr.Racket и ее удобстве.
Common lisp - это друглй язык. Ракетка - одна из реализаций\диалектов схемки. Но на самом деле это больше, чем схемка - это еще и исследовательский проект, и многоязыковая среда для обучения програмированию. По поводу удобства - ну так возьми да скачай, попробуй. Ты чего аутируешь-то?
Схемка с кучей йоба-батареек, средой разработки из коробки, что снижает порог входа. Батарейки крутые, интересные, но кроме них больше ничего нет, и работает это счастье слишком медленно.
>какие отличия от просто Scheme
Про схему тебя пояснили
>и всяких Common LISP
а про всякие другие в шапке более-менее расписано.
>Еще интересует о среде Dr.Racket и ее удобстве.
Удобство - это не про неё, вот что мне кажется.
Емакс с гейзером лучше, хоть и чуть сложнее в освоении. Но до slime всё равно ни то, ни другое не дотягивает.
Но зачем?
Тебе же не тупой реплейс нужен? Верно?
Я из тех, кто покупает и так сдает. В понедельник сдавать, будь это Паскаль или С++, то уже бы нашел, а это... Нашел одного человека, жду когда ответит. Если не ответит, то жопа.
Вброшу ещё один приятный лиспик на этот раз поверх питона: hylang: http://docs.hylang.org/en/latest/
> More object oriented.
> Syntax for regular expression.
Ох...
Сколько уж этих редизайнов было.
> even Clojure doesn't have reader macro
Неправда, кстати.
Вообще, клу нужен нормальный новый стандарт, а не наколенные поделки, иначе никак не взлетит, имхо.
Спасибо, бро!
Экспертные системы - не ИИ
Есть некий код для общелиспа http://www.fuzzylisp.com/downloads.html его можно запустить на этих приложениях?
>Почто призываешь нас?
Поясните, как установить систему, вернее, как поменять на ней очищенное от блобов линукс-ядро на обычное "блобосодержащее" https://github.com/8p8c/my-guix/blob/master/packages/linux-nonfree.scm (у меня свободное ядро ругается на отсутствие драйвера под модем, соответственно не поднимается сеть)
Также, как в системе могут одновременно содержатся
>и гном, и крыса >>907186
и отсутствовать иксы?
Как поставить последние кеды, буду разбираться после того как осилю установку.
Слишком маргинальное и малочисленное сообщество, на нормальные порты не хватает.
Ставь виртуалку и пердолься, много времени и нервов сбережёшь.
https://www.youtube.com/watch?v=W3kfDKDSvM8
>Опыт программирования на Haskell в коммерческих проектах не менее 5 лет.
Какое изящное унижение борщехлебов.
Блин, там на жабе 5 лет, а я повелся:
https://spb.hh.ru/search/vacancy?text=haskell&area=2
Интересно, что количество вакансий по Clojure и Haskell в России почти совпадает (22 и 20).
...при этом кложурь раза в три моложе х-ля.
Когда скармливаю файл с тем, что я ввожу он просто его компилирует, запускает и не выводит результат.
Gambit делает тоже самое, разве что не компилирует.
ЧЯДНТ?
Потому что ты не выводишь результат?
В maxima тоже можно найти много старого кода.
Сомневаюсь. Вообще, не очень понимаю, зачем подобные курсы нужны.
(ql:quickload 'mcclim)
To load "mcclim":
Load 1 ASDF system:
mcclim
; Loading "mcclim"
To load "trivial-gray-streams":
Install 1 Quicklisp release:
trivial-gray-streams
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?
Поставил trivial-gray-streams вручную, теперь установка McCLIM стопорится из-за зависимости swank:
[package swank/sbcl];
; caught ERROR:
; READ error during COMPILE-FILE:
;
; The symbol "HOST-ENT-ADDRESS-TYPE" is not external in the SB-BSD-SOCKETS package.
;
; Line: 117, Column: 76, File-Position: 3633
;
; Stream: #<SB-SYS:FD-STREAM
; for "file /home/yaroslav/quicklisp/dists/quicklisp/software/slime-v2.19/swank/sbcl.lisp"
; {1007CEA9E3}>
;;
;; Error compiling /home/yaroslav/quicklisp/dists/quicklisp/software/slime-v2.19/swank/sbcl.lisp:
;; COMPILE-FILE returned NIL.
;;
То ли я ебанутый, то ли лыжи не едут.
Я не копался в причинах, просто поставил вручную trivial-gray-streams и проигнорировал ошибку при установке swank. Наверное это какой-то баг в Quicklisp.
>grep host-ent-address-type -iR .
>./sbcl-1.1.6/contrib/sb-bsd-sockets/name-service.lisp: (address-type :initarg :type :reader host-ent-address-type)
>./sbcl-1.3.14/contrib/sb-bsd-sockets/name-service.lisp: (address-type :initarg :type :reader host-ent-address-type)
>./sbcl-1.3.14/contrib/sb-bsd-sockets/defpackage.lisp: host-ent-address-type host-ent-addresses host-ent-addres
Похоже, у тебя просто старый sbcl.
И кстати, у меня с trivial-gray-streams из quicklisp'а mcclim работает.
>сижу и думаю чего все на лиспе так помешались
Какой-то странноватый у тебя досуг: надумал себе чего-то и сидишь да размышляешь.
Добавь в xyu-minor-mode хук, который будет проверять условия и отключать pizda-minor-mode
О заебись получилось, я мажорному сначала хотел хук прописать, не срабатывало, а когда минорному все ок.
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/ , приемлем ли мой вариант?
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/ , приемлем ли мой вариант?
Анончики, напомните, пожалуйста, как в Емаксе исполнить простейший код типа (* 2 2)?
С-x e?
Почему именно англоязычные учебники переведенные на русский? Смысл чтения подобных учебников?
СССРовские учебники (ну или программы по обучению, или... не знаю как правильно выразиться) по математике всем миром признаны самыми лучшими. Сравниться может с совком в этом только Корея. Так что подумай, не лучше ли на русском изучать?
>всем миром признаны самыми лучшими
Не имеющий аналогов, суетливый, сверхманевренный, блохастный учебник по математике под редакцией Садовничего.
Конечно, на уровне родного языка не знаю. Слишком уж это трудозатратно и неоправданно.
Ну тут нужно говорить не что ты не знаешь английский на уровне родного. А что у тебя боли при чтении информации на английском.
Исправляется это только одним способом.
Зачем ты это постоянно постишь?
cl-sdl2 до сих пор настолько сырой, что без знания CFFI им невозможно пользоваться?
Ну, я не нашел другого способа изменять отдельные пиксели в поверхности. Документации нормальной, кстати, я тоже не нашел, при этом у более старого lispbuilder-sdl она есть.
В sdl2 же выпилили поверхности, теперь вместо них текстуры. Разве нет? В любом случае, не лучше ли будет работать с пикселями через opticl?
Поверхности никуда не делись. Меня интересует именно SDL сейчас.
Есть (recur). Если этого мало, то завезли уже давно континюэйшены https://github.com/cjfrisz/clojure-tco
Устанавливал гикс на свой Доебан. Иногда он выключал мне компьютер после установки пакета. Надеюсь, уже починили
А нет, до cl-cont даже не дотягивает.
>Кложа норм вариант для нюфани для вката в лисп?
Да, вполне, хоть и кложа немного особняком стоит в лисп-мире.
Но если же ты хочешь попробовать именно функциональщины, то лучше взять что-нибудь из ML-семейства, потому что лиспы больше про метапрограммирование, чем ФП
После 16 попытки походу заработало. Хуй его знает что ему не нравится.
ЗЫ в конце переменной path нужны точка с запятой?
>Ну что за пиздец, как его юзать то ?
Ну сам виноват, нормальные люди под шиндошсом не сидят
Как только на линуксе появится нормальный стек CAD/CAM систем, так сразу на него и перейду. А сейчас никому кроме кодеров ан фулл ставку и серферам интернетов он нахуй не нужен.
Тогда не жалуйся.
Есть же виртуальные машины. Убунту сервер, объединённая папка с хост-системой, сеть в режим bridge и вперёд.
Да пусть кактусами давится, жалко что ли?
Это я про Cloud9, отличная штука
(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 как + помогите,плиз.
(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])
Халп, ткните носом, как последовательно получить результат работы всех этих функций
cgtqcvfrct = spacemacs
У тебя слеш не тот в функции average
https://pastebin.com/qdXuq5kq
Есть такой пример из годной книжки clojure for brave. Но не могу понять, почему после recur remaining в if (empty? remaining-asym-parts) меняется содержимое хэша? ПОлучается что remaining заменяет remaining-asym-parts ? Почему?
recur - просто рекурсивный вызов текущей функции. Костыль такой, потому что jvm и потому что не осилили.
Годная, куда годнее немногочисленных изданий на русском. Если читать онлайн, то еще и бесплатная. http://www.braveclojure.com
ахуенная, поверхностная немного но прикольный стиль изложения. Мне покатила как первая книга по кложе (у меня уже был бекграунд в фп)
spacemacs
что я повелся на бессмысленую пропаганду лиспоблядей
и изучил етит их лисп
знание лиспа никак не помогло мне расширить кругозор или улутшить свой стиль программирования
лучше уж хорший учебник Prolog-а почитать с разбором задач
чем тратить свое время на бесполезное функциональное програаирование
краткий словарь:
лямбда-функция как параметр
функция высшего порядка- функция в которую передается функция или которая возврвщаяет функцию
замыкание-то же что и лямбда
мондада-массив
Доблбоеб спалился. Если ты прочел на вики что такое функция высшего порядка то ты еще не выучил фп, да ты и прочесть то не смог -> >замыкание-то же что и лямбда
Я бы попросил тебя написать простейшую программку, что бы доказать, что ты не строчки на лиспе не написал, но я и так это знаю. Уебывай.
Нюфаня, please.
Потыкал палочкой шизика.
Не язык, а политач
> лучше уж хорший учебник Prolog-а почитать с разбором задач
> чем тратить свое время на бесполезное функциональное програаирование
Поэтому во все мейнстримные языки со всей силы тащат ФП-концепции, начиная с лямбд и ФВП и заканчивая трансдьюсерами, монадами и прочими сложными словами.
> лямбда-функция как параметр
Обосрался
> замыкание-то же что и лямбда
Обосрался[2]
> мондада-массив
Обосрался[3]
Ловите нюфака пока не убежал.
(map list vec1 vec2.1)
(map list vec1 vec2.2)
(map list vec1 vec2.3)
Как реализовать без циклов?
Если хуево объяснил, то вот код https://pastebin.com/HLARTkNQ
Нужно реализовать data-table, в Hint перечислены функции, которые нужно использовать.
[code]
(let ((keys (table-keys tbl)))
(map (fn (%) (data-record keys %)) (rest tbl)))
[/code]
Кложи не знаю, но видимо как-то так.
А вообще, кложурастов тут практически не обитает, потому что кложа - не лисп.
Работает, спасибо.
>потому что кложа - не лисп
Зато у нас есть [] и {}, признайся, ты тоже хочешь.
А что считается топовым лиспом? Где то тут видел, но сейчас не нашел, кто то писал, мол, как там вы без фича-нейм в cl и кложур, но вроде кроме рокета больше ничего и нет.
>Работает, спасибо.
>>потому что кложа - не лисп
>Зато у нас есть [] и {}, признайся, ты тоже хочешь.
В общелиспе они реализуются в несколько строк, но это не нужно, ибо солянка из разномастных скобок плохочитаема. Кстати, в кложе так сделать уже не получится.
>А что считается топовым лиспом?
Общелисп, конечно.
>Где то тут видел, но сейчас не нашел, кто то писал, мол, как там вы без фича-нейм в cl и кложур
Догадываюсь, схемер продолжениями хвалился. Но у них больше-то ничего и нет, в то числе и сообщества.
В жава-тхренд либо в жс
1. Собственно, а зачем лиспы нужны? Ну т.е. какова сфера применения? Академические исследования? Софт?
2. Часто ФП еще называют декларативным программированием, но я так и не понял что оно такое. Т.е. вот например ф-я квадрат на пхп, или императивный стиль:
function square($x) {
return $x $x;
}
На лиспе оно как-то так:
(define (sqaure x) ( x x))
Но в чем глобальное отличие? Типа в первом - я говорю интерпритатору что и как сделать, а во втором - в общих чертах набрасываю? Нихуя не понимаю в общем.
3. Почему под такие вещи не пишут удобных ide?
4. На лиспах есть вообще удобные фреймворки, или сорт оф? Ну типа как ларавель на пхп. Допустим если я захочу на лиспе написать блог - что мне для этого требуется?
ФП это не декларативное. Декларативное это что-то типа пролога (с натяжкой). Его суть в том тчо ты не описывешь порядок действий, а просто вкидываешь системе начальные данные и говоришь "зделай заебись", а она дальше ебется.
Интересно, значит я хуйни наслушался.
Про лисп чего только не говорят, и что он ФП, и что декларативный. На самом деле что из него сделаешь то и будет. Это метаязык.
На лиспе благодаря макросам можно запилить язык декларативного программирования под свою область.
Я кстати охуеваю от синтаксиса, у того же scheme его за час можно выучить. Алсо еще вопрос, я так понял у ФП языков как таковых нет веще навроде переменных, типов данных? Т.е. в (define (sqaure x) ( x x)) - sqaure это просто ссылка на память?
Можешь по-подробней пояснить за кложу. Я так понимаю что не просто кложей стак не ограничится?
скалу знаешь? у скалы есть скаласкрипт, который по сути является джаваскриптом с синтаксисом скалы и не совместим с самой скалой. у кложура есть подобное. кложур, как и скала, работает на жвм со всеми вытекающими (экосистема етц).
на бекенде обычно ты будешь кроме кложы ходить в либы и легаси на джаве (реже на скале), на фронте я не видел чтоб часто юзали кложускрипт (или скаласкрипт).
кложа не очень похожа на обычные лиспы, у нее синтаксис посложнее и еще куча мелких отличий от "обычных" лиспов, а еще в ней очень хорошо видно то, что она ориентирована на jvm.
Ну я сейчас пишу на жсе, и ищу еще какой нибудь интересный фп язык, на котором в будущем возможно будет найти работу и дополнить мой стэк. Как думаешь кложа под эти задачи подойдет?
правда я не видел чтоб у нас особо вакансий по ней было.
Так, короче. Во-первых, лишпы по сути не более ФП, чем какой-нибудь 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 и звёздочку на + потому что звёздочку здешняя разметка съедает).
Так, короче. Во-первых, лишпы по сути не более ФП, чем какой-нибудь 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 и звёздочку на + потому что звёздочку здешняя разметка съедает).
>1. Собственно, а зачем лиспы нужны? Ну т.е. какова сфера применения?
>Академические исследования? Софт?
Нет, блядь, балет. Какая ещё может быть сфера применения у языка программирования общего назначения?
>2. Часто ФП еще называют декларативным программированием, но я так и не понял что оно такое.
Декларативным называют описание проблемы в терминах некой абстракции, отличающейся от абстракции машины (т.е. память и последовательность команд)
>3. Почему под такие вещи не пишут удобных ide?
SLIME. Было бы хорошим вопросом: почему для других языков ничего подобного рода не написали
>4. На лиспах есть вообще удобные фреймворки, или сорт оф? Ну типа как ларавель на пхп. Допустим если я захочу на лиспе написать блог - что мне для этого требуется?
Есть и не один.
Спасибо. У меня вообще сложилось впечатление, буд-то лисп это как глина из которой разработчик лепят что нужно для своих задач, не? Пост, есть что-то как slime под схем? Я просто по сикп хочу заниматься. Или это мне надо гуглить все эти плагины для емакс?
>Кроме кложи
Кложефанат незаметен. Ладно бы схему в пример привел, но не этот же недоязычок для скриптования явы, в котором даже tco нет.
>ходят слухи что с помощью макросов из лиспа можно сделать хоть C++, хоть Haskell, но на практике я такого колдунства не встречал
Плохо смотрел. Вот сишка, например https://github.com/y2q-actionman/with-c-syntax/blob/master/README.org
>У меня вообще сложилось впечатление, буд-то лисп это как глина из которой разработчик лепят что нужно для своих задач, не?
Да, эта одна из его характерных фишек.
>Пост, есть что-то как slime под схем?
Slime только для общелиспа, у схемы geiser. Рекомендую просто взять спейсмакс, там уже всё настроено.
Можно, но сложно, потому что вакансий мало, а те, что есть, в основном с высокими требованиями.
Спасибо, анончик. А на той же кложе может писать программы общего назначения, которые обычно пишутся на питоне, или пока маловатое библиотек для этого? Или может он просто не подходит для этого?
Из кложи ведь можно использовать библиотеки для джавы. Думаешь их не достаточно?
Ты прав, спасибо, что ответил на мои вопросы, пойду осваивать.
Все что можно писать на джаве можно писать на кложе.
>которые обычно пишутся на питоне
Нет, конечно. Ты бы согласился заменить весь используемый питонософт жавой? Сомневаюсь.
>или пока маловатое библиотек для этого?
Да библиотек-то достаточно, но есть у кложи один фатальный недостаток, из которого следует куча недостатков и в дизайне самого языка, и в его реализации, и сообществе, и, собственно, в библиотеках. И называется он JVM.
все то же неофит без подворотов
https://racket-lang.org/download/
На, не мучайся.
>интерпритатор лиспа
Схемы. Лиспом обычно common lisp называют.
Интересно, а кто-то умудрился запустить ту же схемку на винде в нормальной среде разработки? Или никсы + емакс наше все? Я пробовал в эклипсе, но плагины так и не заработали.
>Интересно, а кто-то умудрился запустить ту же схемку на винде в нормальной среде разработки?
Да, емакс работает. Алсо, для задачек их сикпа и дррэкет сойдет
>Я пробовал в эклипсе, но плагины так и не заработали.
Они давно протухли, ибо какой лиспер захочет поддерживать плагин на яве для неюзабельного монстра
>для задачек их сикпа и дррэкет сойдет
Да все равно пиздец как неудобно после няшных иде от жетбрейнс.
>Да, емакс работает.
А есть какая-то инструкция как запустить емакс + спейсмакс на винду? Ну для таких неофитов, кому само слово емакс это сильное колдовство. Мне вообще так что бы изкоробки.
http://spacemacs.org/
Распаковываешь в .emacs.d в домашней директории и просто запускаешь емакс, выбираешь нужные слои и пользуешься. Кстати, там же можно попробовать спейсмакс прямо в браузере. Непонятно зачем и как, но оно работает.
Емакс можешь взять отсюда https://sourceforge.net/projects/emacsbinw64/files/release/
Это копия, сохраненная 20 июля 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.