{Основные диалекты}
:: Common Lisp - разрабатывался как промышленный язык, пригодный для широкого спектра применения, из-за чего имеет достаточно объемную спецификацию. Является мультипарадигменным (процедурщина, функциональщина, ооп (CLOS)), с сильной, динамической типизацией. Есть опциональная декларация типов и частичный их вывод в некоторых реализациях.
Описание особенностей: http://habrahabr.ru/post/143490
Основные реализации:
- свободные: SBCL (нативный код), Clozure CL (нативный код), ECL (через сишку), Clisp (байт-код; небольшой размер образа; похоже, заброшен), Clasp (LLVM; ориентирован на интероп с C++), ABCL (байт-код JVM), CMUCL, GCL.
- коммерческие: LispWorks, Allegro CL, Scieneer CL, mocl
:: Scheme - это минималистичный лисп, пригодный в основном для обучения, исследований. Наиболее практичными реализациями являются GNU Guile и Chicken Scheme.
:: Racket - развитие PLT Scheme. Racket включает в себя много подъязыков (typed racket, lazy racket, frtime racket, Scheme стандартов r5rs и r6rs).
:: Clojure - для тех, кто считает, что из смеси явы и лиспа может получиться что-то хорошее, или тех, кто интересуется креольскими языками, есть отдельный тред. Тред утонул, дом сгорел, отец-подлец бросил, поэтому поживёт сиротка пока у нас. Мальчик со странностями, но хороший, не обижайте. Шапка треда здесь https://rentry.co/9ve9d
{Scheme}
::: Учебники
- SICP :: https://mitpress.mit.edu/sites/default/files/sicp/index.html
- The Scheme Programming Language (R6RS) :: https://www.scheme.com/tspl3
- Практика :: https://exercism.io/my/tracks/scheme
::: Документация
- http://web.mit.edu/scheme_v9.2/doc/index.html
::: Остальное
- https://github.com/theodesp/awesome-scheme
- https://github.com/schemedoc/awesome-scheme
{Racket}
::: Учебники
- HtDP :: https://www.htdp.org/
- Racket Guide :: https://docs.racket-lang.org/guide/index.html
- Beautiful Racket: https://beautifulracket.com/
- Остальные :: https://racket-lang.org/books.html
::: Документация
- https://docs.racket-lang.org/
::: Библиотеки
- https://github.com/avelino/awesome-racket
- https://pkgs.racket-lang.org/
::: Среда разработки
- DrRacket :: https://docs.racket-lang.org/drracket/
- Online :: https://www.jdoodle.com/execute-racket-online/
{Common Lisp}
::: Учебники
- Cookbook :: https://lispcookbook.github.io/cl-cookbook/
- PCL :: http://lisper.ru/pcl/
- OnLisp :: http://www.paulgraham.com/onlisptext.html
::: Документация
- http://www.lispworks.com/documentation/HyperSpec/Front/index.htm
- https://cl-community-spec.github.io/
::: Библиотеки
- https://awesome-cl.com/
- https://ultralisp.org/
- https://lisp-journey.gitlab.io/blog/state-of-the-common-lisp-ecosystem-2020/
::: Среда разработки
- https://lispcookbook.github.io/cl-cookbook/editor-support.html
Предыдущий тред: >>2681837
Скорее нет, чем да.
Всё таки это языки разных парадигм.
Форт конкатенативный, а лисп аппликативный.
Но общие черты есть. Конкатенативные языки стремятся к простому синтаксису, гомоиконности, вполне обладают функциональной базой (вычисление с помощью композиции).
А ещё их мощным плюсом является то, что они просто донельзя просты. Пока у многих языков реализация интерпретатора/компилятора является по сути чёрным ящиком с множеством магических вещей (типа GC, EventLoop, RefCounting, итд), то в конкатенативных языках даже GC не нужен, ибо нахуя, если переменных нет.
В конкатенативных и в стековых языках нет переменных в привычном понимании этого слова.
![image.png](https://2ch.life/pr/thumb/3142890/17148466051870s.jpg)
Я думал, что (1 2 3 4) - это просто сокращенная форма для (1 . (2 . (3 . 4) ) ), соответственно (1 2) и (1 . 2) - это одно и то же.
Но вот на ЛОРе пишут, что это разные вещи, мол, в NewLisp неправильно сделано.
И в чем здесь отличие Форта от Паскаля или Си, кроме синтаксиса? Привычное понимание переменной - именновая ячейка памяти, содержимое которой можно читать и изменять. Т.е. вместо MOVB (1000), 123 или POKE 1000, 123 можно записать x:=123 или 123 x !
Вот в Erlang нет переменных, только аргументы функций и локальные константы. Соответственно x:=x+1 или x @ 1 + x ! не напишешь, а для изменяемого состояния нужно использовать рекурсию.
> И в чем здесь отличие Форта от Паскаля или Си, кроме синтаксиса?
Насчёт Форта не знаю, но в других конкатенативных языках, типа Joy у языка действительно другие семантические свойства.
> Вот в Erlang нет переменных, только аргументы функций и локальные константы.
Под переменными я имел в виду именно аргументы и константы.
Они есть в аппликативный языках, но не в конкатенативных. Там используется бесточечный стиль.
К примеру, в аппликативный языке мы пишем так:
fn x = print(x + 1)
Или более наглядно в лиспе:
(define (fn x) (print (+ x 1)))
В конкатенативном же:
: fn 1 + print
Тут отличия совершенно не в синтаксисе, а в том как вычисления выполняются.
Нет стека переменных, нет стека вызова функций. Есть только датафлоу. Это всё очень облегчает реализацию языка, даже не не уровне простого синтаксиса, а простого способа вычислять. Даже GC не нужен.
> Нет стека переменных, нет стека вызова функций. Есть только датафлоу. Это всё очень облегчает реализацию языка,
Брейнфак еще проще в релизации!!!
Щас бы учить юзлесс язык, идеи которого уже внедрены давным давно во все популярные ОО-языки: php ruby python java c# c++ Go Dart.
> идеи которого
Идеи лиспа: гомоиконность и мощнейшые макросы (которая к примеру позволяет добавить завтипы и линейные типы в язык).
Он может иметь любой синтаксис и любую семантику.
Ни один из перечисленных тобой языков этими свойствами не обладает.
Вот ты можешь в джаву, го, дарт встроить зависимые типы и вывод типов по Хиндли-Милнеру.
Нет, очевидно.
А в лишпе это просто делается макросами:
https://docs.racket-lang.org/ts-reference/index.html
https://docs.racket-lang.org/ts-reference/Experimental_Features.html#%28part._.Dependent_.Function_.Types%29
Можно даже ad-hoc полиморфизм как в Haskell добавить при желании.
Такого тебе никакой кастрированный golang не даст.
Шо, в какой-то из перечисленных уже завезли полноценную поддержку горячей замены кода?
>встроить зависимые типы и вывод типов по Хиндли-Милнеру.
>А в лишпе это просто делается макросами
Ну, не прям уж ПРОСТО, но по крайней мере это возможно сделать.
https://github.com/coalton-lang/coalton вот как раз такой проект для любителей ХМ, монадок и борщелиспа
Мы чисто хикки.
Чисто Ричард?
Не стоит даже качать бесплатно.
![image](https://2ch.life/pr/thumb/3142890/17211237776630s.jpg)
Видел на эту тему пост на реддите, 6 летней давности, там чел тоже сокрушался. Видимо за 6 лет нихуя не поменялось. А жаль, прошёл несколько туториалов(встроенный в calva, несколько бесплатных книжек по основам), мне понравилось. Но нужно иметь бэкграунд предметной области, при чём не самый базовый, с кондачка не вкатиться. Может в других лиспах другая картинка, но сомневаюсь.
Но эти фишки вставлены через жопу в уже переполненный и уберусложнённый синтакс, которому лишь бы поддерживать ОО. В лиспе ты просто напишешь код, а с другими языками и их заморочками будешь бороться. Даже с питоном.
![image.png](https://2ch.life/pr/thumb/3142890/17217128340460s.jpg)
Нету у этом вашем (((ЛИШПЕ))) никакой гомоиконности. Вместо имени функции использовать лямбду нельзя.
Угу, "просто пишешь", а потом материшься, потому что непонятно, какого хуя оно не работает, хотя должно. Как в каком-нибудь C++, где надо знать костыли всех стандартов. Какое же говно этот лисп.
Вот на JavaScript лямбды какие надо (если бы не было шизоидных преобразований типов, был бы идеальный язык).
Все есть, в полноценном виде, не как у эрланга/пролога.
>>228405
Это разные пространства имен для символов, в зависимости от контекста будет взято значение из таблиц переменных или функций.
Согласен, решение хуйня, потому что кроме возможности назвать переменную list и т.п. ничего не дает, но на самом деле писать funcall/function надо довольно редко даже в весьма функциональном коде. если это так важно, то пробуй схему.
https://stackoverflow.com/questions/1020968/separate-namespaces-for-functions-and-variables-in-common-lisp-versus-scheme
>>228405
>Вот на JavaScript лямбды
Нет, алсо, после "жс" дальше можно не читать.
>если бы не было шизоидных преобразований типов
Если ты пишешь в 2024 на жс вместо тс на своем макакофронте, то ты долбаеб со скилбокса видимо.
Я понимаю, если бы ты в пример привел Хаскель и Окамл, там действительно сделано как надо, но ты какую то хуйню из 90ых притащил и еще на типы пожаловался, хотя эту проблему в жс давно решили, но ты, в силу своей отсталости, даже про это похоже не в курсе.
>гомоиконности
Значение знаешь?
>>228414
> потому что кроме возможности назвать переменную list и т.п. ничего не дает
https://docs.racket-lang.org/gui/button_.html
Даёт возможность не изобретать на каждый род сущностей по конвенции именования, чтобы не отстреливать себе ноги, случайно перекрыв локальной переменной пакет, класс, функцию, макрос, перезапуск и т.д
Держи
Всё
Нет, не ломает.
>можносделать
Прошло миллион лет, а лисподебилы так и повторяют свою хуйню, как будто это 2011 и в /це нульчика
перечень людей, кто хочет вместо полноценного языка со всем из коробки на уровне примитивов юзать прикрученную сбоку на макросах дрисню:
конец списка
Да, его же легче к программе привязать чем к графическим гуям?
>гомоиконность
А как вы теперь свои гомоиконы пердолите когда в силе запрет пропаганды ЛГБТ?
Скажу тебе по секрету, далеко не всем заказчикам есть дело до используемых технологий. Можешь хоть на бреинфаке с апл писать, лишь бы поставленная задача была решена.
Ну и чем тот же коалтон отличается от "полноценного языка"?
Но это только если техдир не узнает? Они обычно всякой экзотики как огня боятся.
На фрилансе т.е.?
где угодно
договаривайся с тимой
все равно если на выходе тупо докер контейнер то все равно на чем писать
у меня в конторе так на эрланге пишут, такая же нишевая хреь как лисп
Пачка это 3 штуки на всю Россию? Ну да, чуть побольше чем у лиспа, но программистов у него примерно столько же, лисп хотя бы в парочке вузов встречается.
А скобочники за 146 лет существования лиспа так нихуя нормально и не сделали. Единственный полноценный редактор у них это емакс(пиздец), типа очень быстро в нём работать. Сука ты на нём пишешь не отрываясь по несколько часов что ли? Нет, ты точно также сидишь, думаешь, что-то пробуешь, потом эвалишь и так по кругу, где бля скорость нахуй. В одной операции, которая нужна примерно никогда? Хуита короче. Просто не экосистема, а какой-то балаган.
Да, только голый ханчентут и статика. Статья именно об этом.
>clhs/clus
нечитаемая хуета
если ты считаешь это нормальным, то ты походу из сторожки своей не выходил лет 40
>плагин для своего вскода
плагины есть, и вроде даже не один, но не сравнится с функционалом той же кложуры, максимально примитивная хуета, что есть, что нет
да и в целом почему в cl не запилили за столько лет нормальной инфраструктуры, тот же квиклисп как я понял по сути каждый раз загружается в репл при инициализации новой сессии, т.е. ебать костыль
>нечитаемая хуета
Да я уже понял, что с чтением у тебя сложности, даже шапку никак осилить не можешь.
Там есть ссылка на документацию в современной верстке, а там, в свою очередь, ссылка на ещё одну - пользуйся. Ну или не пользуйся.
>плагины есть, и вроде даже не один
>но не сравнится с функционалом той же кложуры
Какой ты пробовал и чем не сравнится?
>тот же квиклисп как я понял по сути каждый раз загружается в репл при инициализации новой сессии, т.е. ебать костыль
Вот это да! Ух, а какие непотребства динамический компоновщик выделывает - тебе лучше вообще не знать
ну я так и думал, что ты охранитель, вот поэтому лисп и находится на уровне засохшего кала, потому что нет человеческих условий даже просто начать что-то делать
никогда не понимал подобные визги
какой тулчейн тебе нужен? сырцы это просто текст, лисп машина это просто лиспмашина
хуй знает что тебе нужно чтобы писать тексты и пихать их в лиспмашину
ну вот что? смузи?
алсо по сабжу треда
вы ваще компилите свои коекаки в бинари? или в объектники? или похуй?
>вы ваще компилите свои коекаки в бинари? или в объектники? или похуй?
Если просто скрипт, то обхожусь росвеллом. Если что-то крупнее - asdf program-op
https://lispcookbook.github.io/cl-cookbook/scripting.html#with-asdf
>хуй знает что тебе нужно чтобы писать тексты и пихать их в лиспмашину
>ну вот что? смузи?
С Л А Й М
Л
А
Й
М
ну и поставь себе слайм, или еще какой плагин хуягин их сейчас силлиарды
вот блять ноют ебаные нытики аррря как писать букафки я нимагу печатать у миня адин палиц а не восимь рук пук хрюк аря
хартьфу блять
почитал сей материал, благодарочка
лень искать в кукбуке поэтому спрошу: можно ли скрестить объектник лиспа с объектниками например сишки и зашить в бинарь? вроде бы есть трансляторы лисп ту си, но этот путь мне не очень нравится
ну допустим на лиспе фибку хуйнуть (сам прото и тело функции), а на сихе мэйн и вызов с параметрами пользователя
такой вот простецкий пример чтобы вычислить фибку до миллионного числа допустим, но на традиционных декларативно императивных языках, чтобы не сильно бошку ломать об лисп
>можно ли скрестить объектник лиспа с объектниками например сишки и зашить в бинарь?
ecl именно для этого и нужен, правда, код он генерирует менее быстрый, чем sbcl.
Впрочем, sbcl тоже научился делать библиотеки:
https://github.com/40ants/sbcl-shared-library-examples/tree/master
https://github.com/quil-lang/sbcl-librarian
я же не про либы спрашивал, а про объектник
с фаслом чо можно наколдовать? есть в нем таблица символов?
>с фаслом чо можно наколдовать?
Ничего. Только загрузить в образ. К тому же, формат фаслов не документирован и может меняться от версии к версии.
Прямо сейчас, только на хехе: по эрлангу от 7 компаний, по эликсиру от 10. А по лиспу сейчас их сколько, господин обосрамс?
>- Is CIEL yet another language re-design?
>- Absolutely not. CIEL is plain Common Lisp. We don't redefine the semantics of the language. CIEL is a collection of useful libraries, shipped as one Quicklisp meta-library, a core image and an executable.
![image](https://2ch.life/pr/thumb/3142890/17240119795500s.jpg)
встала хуем задача написать очередную тулзу под лисп
а в частности лиспкомпилер
да да я вкурсе что sbcl итак компилит сырцы хуе мое речь как раз пойдет об этом
неудобство заключается в том что строчку (compile-file "filename") нужно держать в сырце, а я хочу оставить сырцы без этих лишних телодвижений
итак что мы имеем:
сырец <filename.lisp>
sbcl
zsh (bash cl)
что я хочу:
$ ls
filename.lisp
$ cl filename.lisp
$ ls
filename.lisp filename.fasl
$ cl -b filename.lisp
$ ls
filename.lisp filename.fasl filename.exe*
я вот думаю, что нужно снять копию с сырца, дописать в копию враппер defun main(), дописать в копию последней строкой функцию компила (соответственно если флаг был то компил в бинарь, если флага не было - в fasl) и затем в хидден режиме этот модифицированный сырец скормить серверу, чтобы он ничо не пукал в консоль, но высрал файлик, затем удалить промежуточный мусор
звучит как задача для мейка, но я не хочу плодить мейкфайлы для всяких хеловордов на лиспе, а потому мне нужен либо баш, либо bin/cl
затем надо просто прописать очередной алиас в zshrc:
alias cl='compile-lisp.sh'
сунуть эсаш в юзербин и сделать его экзекьютабл
так как тут тред лиспа - помогите с bin/cl скриптом для этой хуйни? я только начал изучать лисп (да и в баше не шарю), но тулзу для удобства пользования очинь хочица
![image](https://2ch.life/pr/thumb/3142890/17240119795500s.jpg)
встала хуем задача написать очередную тулзу под лисп
а в частности лиспкомпилер
да да я вкурсе что sbcl итак компилит сырцы хуе мое речь как раз пойдет об этом
неудобство заключается в том что строчку (compile-file "filename") нужно держать в сырце, а я хочу оставить сырцы без этих лишних телодвижений
итак что мы имеем:
сырец <filename.lisp>
sbcl
zsh (bash cl)
что я хочу:
$ ls
filename.lisp
$ cl filename.lisp
$ ls
filename.lisp filename.fasl
$ cl -b filename.lisp
$ ls
filename.lisp filename.fasl filename.exe*
я вот думаю, что нужно снять копию с сырца, дописать в копию враппер defun main(), дописать в копию последней строкой функцию компила (соответственно если флаг был то компил в бинарь, если флага не было - в fasl) и затем в хидден режиме этот модифицированный сырец скормить серверу, чтобы он ничо не пукал в консоль, но высрал файлик, затем удалить промежуточный мусор
звучит как задача для мейка, но я не хочу плодить мейкфайлы для всяких хеловордов на лиспе, а потому мне нужен либо баш, либо bin/cl
затем надо просто прописать очередной алиас в zshrc:
alias cl='compile-lisp.sh'
сунуть эсаш в юзербин и сделать его экзекьютабл
так как тут тред лиспа - помогите с bin/cl скриптом для этой хуйни? я только начал изучать лисп (да и в баше не шарю), но тулзу для удобства пользования очинь хочица
![image](https://2ch.life/pr/thumb/3142890/17240181438760s.jpg)
>roswell
неа, не похоже, это какой то пакетник, а я переизобретаю хук
может на днях сам осилю, сейчас не особо есть время ковыряться
Не только, это ещё и альтернатива почившему cl-launch -- пускалки скриптов. Твой пример как раз оттуда.
Показываю, как пользоваться:
1. ros init yopta # генерируешь скелет скрипта
Successfully generated: yopta.ros
2. Открываешь своим любимым редакторомемаксом и пишешь свой скрипт. Вот тебе пример с зависимостями: https://dpaste.org/bNDSv
3. Запускаешь ./yopta.ros
Первый запуск потребует какое-то время на компиляцию всех зависимостей
4. При необходимости создаешь бинарник: ros build ./yopta.ros
так мне не нужен генератор скрипта
мне нужен скрипт
так что снова нет, я не переизобретаю розвел, я переизобретаю хук
Только тебя на эти 7 ваканский один хуй не возьмут потому что ты кроме смузиегвого джаваскриптопитона с 10000 ваканский ничего не осилил, ну и нахуй ты тут перед нами выебываешься?
Ты какую проблему пытаешься решить? Из твоей шизофазии сложно что-то понять, можно только догадываться. Ясно только одно: ты явно делаешь что-то не так.
Тебе нужен инструмент для превращения скриптов в исполняемые бинарники или что?
Понятно. Ладно, набивай свои шишки сам.
Опять обосрался... Прямо таки обосрамс-комбо. Ну соберись, что же ты...
Я последние 4 года только и работаю эликсир/эрланг разработчиком.
Система мониторинга и управления, SCADA выходит.
Что-то я не вижу 2х зарплат как ОП пишет. Может немножко выше среднего, но гораздо больше вкусных вакансий по Python/Go/Rust. Наверно надо ждать западный хаир, там будет вкуснее надеюсь. Щас 250к, 13 лет.
Ой, это в эликсир треде ОП писал про 2х, не тутошний.
Язык одной реализации, стандарта у него, конечно же, нет.
Но тем не менее схемы он лаконичнее.
R5rs самая маленькая, r7rs современнее. А так зависит от того, для чего спеку читаешь - мне как энтузиасту зашла r7rs своей лаконичностью и выверенностью. Только дин диспатча не хватало, но он прикручивается как и половина фич через макросы+cps
Вроде бы у Racket'а комунити меньше, но при этом они имеют свой оверлей в генте:
https://gitlab.com/gentoo-racket/gentoo-racket-overlay
>почему в CL принято устанавливать модули quicklisp'ом?
Потому что удобно.
>Есть ли в этом сакральный смысл?
Встречный вопрос: если ли сакральный смысл в дополнительном опакечивании для целого зоопарка дистрибутивов?
> если ли сакральный смысл в дополнительном опакечивании для целого зоопарка дистрибутивов?
У тех же дистрибутивов линукса, например, не принято использовать сторонние пакетные менеджеры для system-wide вещей, т.к. это усложняет отслеживание версий модулей/пакетов и может превращать систему в свалку без централизации управления системными либами. У мейнстримовых дистрибутивов (арч, генту, дебиан) подобное прослеживается с тем же перлом, руби и питоном. Но вообще не прослеживается с общелиспом.
Да и опакечивание делается пользователями конкретного дистрибутива, не для зоопарка в целом. Но то, что вообще никто не захотел заморачиваться с этим языком — немного интересно стало.
>сторонние пакетные менеджеры для system-wide вещей
Пакеты для cl не являются общесистемными и нужны только во время разработки, ибо софт распространяется в виде цельных образов.