{Основные диалекты}
:: 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 не нужен, ибо нахуя, если переменных нет.
В конкатенативных и в стековых языках нет переменных в привычном понимании этого слова.
Я думал, что (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 вот как раз такой проект для любителей ХМ, монадок и борщелиспа
Мы чисто хикки.
Чисто Ричард?
Не стоит даже качать бесплатно.
Видел на эту тему пост на реддите, 6 летней давности, там чел тоже сокрушался. Видимо за 6 лет нихуя не поменялось. А жаль, прошёл несколько туториалов(встроенный в calva, несколько бесплатных книжек по основам), мне понравилось. Но нужно иметь бэкграунд предметной области, при чём не самый базовый, с кондачка не вкатиться. Может в других лиспах другая картинка, но сомневаюсь.
Но эти фишки вставлены через жопу в уже переполненный и уберусложнённый синтакс, которому лишь бы поддерживать ОО. В лиспе ты просто напишешь код, а с другими языками и их заморочками будешь бороться. Даже с питоном.
Нету у этом вашем (((ЛИШПЕ))) никакой гомоиконности. Вместо имени функции использовать лямбду нельзя.
Угу, "просто пишешь", а потом материшься, потому что непонятно, какого хуя оно не работает, хотя должно. Как в каком-нибудь 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.
встала хуем задача написать очередную тулзу под лисп
а в частности лиспкомпилер
да да я вкурсе что 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 скриптом для этой хуйни? я только начал изучать лисп (да и в баше не шарю), но тулзу для удобства пользования очинь хочица
встала хуем задача написать очередную тулзу под лисп
а в частности лиспкомпилер
да да я вкурсе что 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 скриптом для этой хуйни? я только начал изучать лисп (да и в баше не шарю), но тулзу для удобства пользования очинь хочица
>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 не являются общесистемными и нужны только во время разработки, ибо софт распространяется в виде цельных образов.
format t, а не format nil. С nil он просто возвращает отформатированную строку, а с t эквивалентно format standard-output
equal неуместен, для сравнения чисел есть =
setq использовать не надо, это рудимент, вместо используй setf, а именно в этом случае - incf
Ну и вообще, ты зачем за макрос руками работаешь? У loop же есть конструкция :for :to. А так две ошибки допустил, инкремент и проверка условия не в тех местах.
чота я пока не могу в функциональный стиль
лямбды эти ваще не даются
ну в процедурном канешн ничо сложного (кроме того что тут чота все макросами обмазано)
а блин, ветвление неправильно сделал, ну да ладно, сойдет для первого раза
Ветвления какие-то.... тьфу. Слишком высокоуровнево.
Раз уж взялся за tagbody/go, то не стоит останавливаться на полпути.
нет, ломает.
>(defmacro foo1 (msg) (format t msg) )
>(defmacro foo2 (msg) (foo1 msg) )
>(foo1 "test1")
>(foo2 "test2")
Ошибка какая-то. foo1 отдельно вроде выполняет, а через foo2 не хочет...
Хочу сделать как в си -
>#define foo1(msg) printf(msg)
>#define foo2(msg) foo1(msg)
- чтобы было понятно.
Потом ещё такой вопрос - как убрать кучу текста от sbcl при ошибках? Под сотню строчек вылетает на 1 ошибку. Нафига столько? Какие там флаги проставить?
И где вообще полноценное описание всяких закорючек в духе -
>` ' ~ @ # : & %
- и т. д.? Поисковик такое не берёт. А с этого нигде не начинают объяснение языка, хотя это основы несомненные, причём совершенно неочевидные для интуитивного понимания.
>#
эта хуйня вроде сокращение от lamda
>'
а эта хуйня сокращение от quote
>~
эту хуйню я встречал в принтах, начало управляющей севенции, например ~% это перевод строки как \n в си, ~a это %d в си (ну не только децималы а вообще вроде любую хуйню может выводить, мультифункциональная вставка параметра типа того)
только вкатываюсь
я не могу понять
да я могу написать просто рекурсию, но тогда есть вероятность переполнения, мне нужно лямбда решение
>Хочу сделать макрозамену foo2, которая использует foo1.
А читать ты что-нибудь не пробовал? Тот же pcl или хотя бы кукбук.
>И где вообще полноценное описание всяких закорючек в духе
Внезапно, в спецификации https://novaspec.org/cl/2_4_Standard_Macro_Characters
>>268250
>эта хуйня вроде сокращение от lamda
#' - это не лямбда, а макрос чтения для function https://novaspec.org/cl/f_function
>>268328
Ты эту лямбду просто возвращаешь. А вызывать-то её кто будет?
>но тогда есть вероятность переполнения
Хвостовую рекурсию оптимизируют почти все реализации cl, хотя по стандарту не обязаны.
>Под сотню строчек вылетает на 1 ошибку.
Игнорируешь слайм - ССЗБ. Даже у дедов в 80х был аналогичный инструментарий.
>Ты эту лямбду просто возвращаешь. А вызывать-то её кто будет?
милчеловек, напиши как надо? я когда то нагугливал лямбда факториалы всякие а сейчас не могу найти, чтобы на примере применить
>Хвостовую рекурсию оптимизируют почти все реализации cl, хотя по стандарту не обязаны.
на компилер надейся а сам не плошай
>милчеловек, напиши как надо?
Как ты пытаешься сделать, так не надо. Это неидиоматичный код с неоправданным оверхедом и просто мозгоёбка.
https://github.com/ruricolist/serapeum/blob/master/REFERENCE.md#iter
Используй nlet из serapeum, обычный цикл или явную рекурсию, ибо переполнение стека на какой-нибудь маргинальщине типа ABCL - не худшее, что там может случиться.
Ты ж сам скрин с примерами вкинул, где всё есть.
Если не понимаешь, как их использовать и вообще для чего они нужны, то тебе следует почитать что-нибудь более основательное, а не просто примеры кода.
https://ideone.com/g0fhFS
Вот тот костыль, который ты пытался соорудить.
Это неидиоматичный код для cl.
пик достаточно основательный? может дело в том что лисп не бейсик какой нибудь, не думал в эту сторону?
да блять я не настолько вкатун
просто концепция лиспа ебет мне мозг
сидишь блять думаешь как в одно выражение впихнуть два выражения
с 80ых могли бы и флаг сделать
>sbcl --script program.lisp
Backtrace for: #<SB-THREAD:THREAD "main thread" RUNNING {1001878103}>
0: (SB-DEBUG::DEBUGGER-DISABLED-HOOK #<SB-KERNEL::ARG-COUNT-ERROR {10018D2F23}> #<unused argument> :QUIT T)
1: (SB-DEBUG::RUN-HOOK INVOKE-DEBUGGER-HOOK #<SB-KERNEL::ARG-COUNT-ERROR {10018D2F23}>)
2: (INVOKE-DEBUGGER #<SB-KERNEL::ARG-COUNT-ERROR {10018D2F23}>)
3: (ERROR SB-KERNEL::ARG-COUNT-ERROR :KIND DEFMACRO :NAME FOO :ARGS NIL :LAMBDA-LIST (PARAMETER*) :MINIMUM 1 :MAXIMUM 1)
4: (SB-C::CHECK-DS-LIST #<unavailable argument> #<unavailable argument> #<unavailable argument> #<unavailable argument>)
5: ((MACRO-FUNCTION FOO) (FOO) #<unused argument>)
6: ((FLET SB-IMPL::PERFORM-EXPANSION :IN MACROEXPAND-1) #<FUNCTION (MACRO-FUNCTION FOO) {52A4AB2B}> NIL)
7: (MACROEXPAND (FOO) #<NULL-LEXENV>)
8: (SB-INT:SIMPLE-EVAL-IN-LEXENV (FOO) #<NULL-LEXENV>)
9: (EVAL-TLF (FOO) 1 NIL)
10: ((LABELS SB-FASL::EVAL-FORM :IN SB-INT:LOAD-AS-SOURCE) (FOO) 1)
11: ((LAMBDA (SB-KERNEL:FORM &KEY :CURRENT-INDEX &ALLOW-OTHER-KEYS) :IN SB-INT:LOAD-AS-SOURCE) (FOO) :CURRENT-INDEX 1)
12: (SB-C::%DO-FORMS-FROM-INFO #<FUNCTION (LAMBDA (SB-KERNEL:FORM &KEY :CURRENT-INDEX &ALLOW-OTHER-KEYS) :IN SB-INT:LOAD-AS-SOURCE) {10009EA8AB}> #<SB-C::SOURCE-INFO {10009EA873}> SB-C::INPUT-ERROR-IN-LOAD)
13: (SB-INT:LOAD-AS-SOURCE #<SB-SYS:FD-STREAM for "file program.lisp" {10009E8C53}> :VERBOSE NIL :PRINT NIL :CONTEXT "loading")
14: ((FLET SB-FASL::THUNK :IN LOAD))
15: (SB-FASL::CALL-WITH-LOAD-BINDINGS #<FUNCTION (FLET SB-FASL::THUNK :IN LOAD) {7FDF9E31F74B}> #<SB-SYS:FD-STREAM for "file program.lisp" {10009E8C53}>)
16: ((FLET SB-FASL::LOAD-STREAM :IN LOAD) #<SB-SYS:FD-STREAM for "file program.lisp" {10009E8C53}> NIL)
17: (LOAD #<SB-SYS:FD-STREAM for "file program.lisp" {10009E8C53}> :VERBOSE NIL :PRINT NIL :IF-DOES-NOT-EXIST T :EXTERNAL-FORMAT :DEFAULT)
18: ((FLET SB-IMPL::LOAD-SCRIPT :IN SB-IMPL::PROCESS-SCRIPT) #<SB-SYS:FD-STREAM for "file program.lisp" {10009E8C53}>)
19: ((FLET SB-UNIX::BODY :IN SB-IMPL::PROCESS-SCRIPT))
20: ((FLET "WITHOUT-INTERRUPTS-BODY-11" :IN SB-IMPL::PROCESS-SCRIPT))
21: (SB-IMPL::PROCESS-SCRIPT "program.lisp")
22: (SB-IMPL::TOPLEVEL-INIT)
23: ((FLET SB-UNIX::BODY :IN SB-IMPL::START-LISP))
24: ((FLET "WITHOUT-INTERRUPTS-BODY-1" :IN SB-IMPL::START-LISP))
25: (SB-IMPL::START-LISP)
с 80ых могли бы и флаг сделать
>sbcl --script program.lisp
Backtrace for: #<SB-THREAD:THREAD "main thread" RUNNING {1001878103}>
0: (SB-DEBUG::DEBUGGER-DISABLED-HOOK #<SB-KERNEL::ARG-COUNT-ERROR {10018D2F23}> #<unused argument> :QUIT T)
1: (SB-DEBUG::RUN-HOOK INVOKE-DEBUGGER-HOOK #<SB-KERNEL::ARG-COUNT-ERROR {10018D2F23}>)
2: (INVOKE-DEBUGGER #<SB-KERNEL::ARG-COUNT-ERROR {10018D2F23}>)
3: (ERROR SB-KERNEL::ARG-COUNT-ERROR :KIND DEFMACRO :NAME FOO :ARGS NIL :LAMBDA-LIST (PARAMETER*) :MINIMUM 1 :MAXIMUM 1)
4: (SB-C::CHECK-DS-LIST #<unavailable argument> #<unavailable argument> #<unavailable argument> #<unavailable argument>)
5: ((MACRO-FUNCTION FOO) (FOO) #<unused argument>)
6: ((FLET SB-IMPL::PERFORM-EXPANSION :IN MACROEXPAND-1) #<FUNCTION (MACRO-FUNCTION FOO) {52A4AB2B}> NIL)
7: (MACROEXPAND (FOO) #<NULL-LEXENV>)
8: (SB-INT:SIMPLE-EVAL-IN-LEXENV (FOO) #<NULL-LEXENV>)
9: (EVAL-TLF (FOO) 1 NIL)
10: ((LABELS SB-FASL::EVAL-FORM :IN SB-INT:LOAD-AS-SOURCE) (FOO) 1)
11: ((LAMBDA (SB-KERNEL:FORM &KEY :CURRENT-INDEX &ALLOW-OTHER-KEYS) :IN SB-INT:LOAD-AS-SOURCE) (FOO) :CURRENT-INDEX 1)
12: (SB-C::%DO-FORMS-FROM-INFO #<FUNCTION (LAMBDA (SB-KERNEL:FORM &KEY :CURRENT-INDEX &ALLOW-OTHER-KEYS) :IN SB-INT:LOAD-AS-SOURCE) {10009EA8AB}> #<SB-C::SOURCE-INFO {10009EA873}> SB-C::INPUT-ERROR-IN-LOAD)
13: (SB-INT:LOAD-AS-SOURCE #<SB-SYS:FD-STREAM for "file program.lisp" {10009E8C53}> :VERBOSE NIL :PRINT NIL :CONTEXT "loading")
14: ((FLET SB-FASL::THUNK :IN LOAD))
15: (SB-FASL::CALL-WITH-LOAD-BINDINGS #<FUNCTION (FLET SB-FASL::THUNK :IN LOAD) {7FDF9E31F74B}> #<SB-SYS:FD-STREAM for "file program.lisp" {10009E8C53}>)
16: ((FLET SB-FASL::LOAD-STREAM :IN LOAD) #<SB-SYS:FD-STREAM for "file program.lisp" {10009E8C53}> NIL)
17: (LOAD #<SB-SYS:FD-STREAM for "file program.lisp" {10009E8C53}> :VERBOSE NIL :PRINT NIL :IF-DOES-NOT-EXIST T :EXTERNAL-FORMAT :DEFAULT)
18: ((FLET SB-IMPL::LOAD-SCRIPT :IN SB-IMPL::PROCESS-SCRIPT) #<SB-SYS:FD-STREAM for "file program.lisp" {10009E8C53}>)
19: ((FLET SB-UNIX::BODY :IN SB-IMPL::PROCESS-SCRIPT))
20: ((FLET "WITHOUT-INTERRUPTS-BODY-11" :IN SB-IMPL::PROCESS-SCRIPT))
21: (SB-IMPL::PROCESS-SCRIPT "program.lisp")
22: (SB-IMPL::TOPLEVEL-INIT)
23: ((FLET SB-UNIX::BODY :IN SB-IMPL::START-LISP))
24: ((FLET "WITHOUT-INTERRUPTS-BODY-1" :IN SB-IMPL::START-LISP))
25: (SB-IMPL::START-LISP)
>>sbcl --script program.lisp
у меня глючит этот флаг
бывает грузит, бывает не грузит
так что я захожу с шоколадного
>sbcl --noinform < progname.lisp
>in .zshrc
>alias lisp='sbcl --noinform <'
мимо
>sbcl --noinform < progname.lisp
Через конвейер он по-другому работает: дублирует строчки, пишет значения выражений (со звёздочкой); вроде интерпретатора что-ли. В итоге вывод самой программы увеличивается в 4 раза и выглядит размашисто. Может и это всё тоже можно убрать флагами? noinform только приветствие убирает.
ПС: noprint, нашёл. Теперь удобоваримо. ) Спасибо.
>>268729
>Удобно
Гораздо удобнее, чем твои посты придумывать.
> можно убрать флагами?
вот такие еще варики
попробуй, мне звездочки в выхлопе репла не особо мешают пока вкатываюсь
Смари ещё варик:
mkfifo /tmp/pipe; while true; do cat /tmp/pipe; done | sbcl
А потом в емаксе вешаешь на хоткей write-region в /tmp/pipe
еще можно бинарь собрать и не париться
правда бинари на лиспе большие по размерам а по скорости я их не тестил, у меня нет профайлера
вот бы кто сравнил с сишкой
>в емаксе
почему в этой хуйне в цветовых схемах не работает face number?
он типа должен декорировать циферки как в виме, но нихуя
мб ты знаешь ответ
в душе не ебу
для функциональщины лучше схему/ракетку/кложур бери
коммон лисп больше оопшный/процедурный, дрочить лямбды там можно конечно, но не так удобно как в языках выше
написано что выражения вычисляются слева направо пока какое то из них не вернет тру
так выходит из простейшего OR можно свич слепить, напихать в него вызовы и пускай себе щелкает слева направо, как если бы это был свич (или в других языках селект кейс) сверху вниз пока не найдется первый тру кейс
я все еще не могу понять нафига в CL напихали так дохуя всяких макросов
вот если есть OR то нахуй тогда нужен COND? начинает вонять избыточностью плюсов...
c++ джава и питон тоже мультипарадигмальные но не будешь же ты в них фп дрочить? если хочешь фп то либа схема либа мл языки типа хаскеля и окамла
>экстендед тернарник
в некотором смысле да
это вообще-то макрос, ты его можешь сам за минуту написать
>COND
он для другого нужен, это как свич на условиях типа
```
(case t
((= 0 1) 1)
((= 0 2) 2)
((= 0 0) 'ok)
(t 'default))
```
только то что выше для CL некорректно
а cond вместо case t уже все делает нормальным
>вот если есть OR то нахуй тогда нужен COND?
А нахуй нужен COND, если есть IF? Всё избыточно, кроме специальных операторов.
Современное железо сплошь контрол флоу, то есть датафлоу приходится либо эмулировать как в джаве, либо перегонять на в контролфлоу представление. Датафлоу неэффективен, он типобезопасен.
repl это компилятор?
Нет.
>REPL (от англ. read-eval-print loop — «цикл „чтение — вычисление — вывод“») — форма организации простой интерактивной среды программирования в рамках средств интерфейса командной строки.
Неужели сложно было загуглить?
Ну ты не спрашивай, а вкидывай
Кстати, в шапке ссылка протухла. Вот актуальная
https://github.com/pcl-ru/pcl-ru/releases
Practical Common Lisp
Practical Common Lisp by Seibel Peter
В лиспе ты не сохраняешь программу как таковую - она создаёт мини-копию репла, по сути встроенный компилятор. Считай что каждая отдельная программа компилируется ин риал тайм при работе. Ты на ходу можешь теребить код.
Так а почему функцию нельзя вызвать тем же макаром? Однохуйственно же, значение переменной ты вызываешь в консоль или результат работы функции.
почемучка не жирни
ну ты конечно привел пример
ты бы еще про ардуину вспомнил
кажется лисп это ультрахайлевл бай дизайн, а писать на нем ось лейеред микропиську все равно что байтоебить на жабе
Выполняет код. Под капотом может быть как интерпретатор, так и компилятор. В случае sbcl - второе.
>>275221
>то тут уже без стейта (и сайд эффектов) никак
Лисп - мультипарадигменный, ФП даже не является основным из подходов, не говоря уж о чистофункциональном.
>>275250
>ты бы еще про ардуину вспомнил
http://www.ulisp.com/
> а писать на нем ось лейеред микропиську
https://github.com/froggey/Mezzano
>ссылочки
по-твоему я сказал что этого нельзя делать? я сказал что лисп инструмент не для этого
или мы должны уподобляться всяким шизам и писать шейдеры на пыхе? нет конечно. считаю твоя аппеляция инвалид
отклонено
>по-твоему я сказал что этого нельзя делать?
Нет. По-моему, ты просто имеешь крайне поверхностное представление о сабже.
>>275250
>кажется лисп это ультрахайлевл бай дизайн
Тебе кажется.
В общелиспе есть инструменты и для низкоуровневого программирование, и по "ссылочкам" примеры их применения, а ulisp - как раз "инструмент для этого".
Особенно интересно узнать, почему ulisp, предназначенный для программирования микроконтроллеров, для этого не предназначен?
диалекты лиспа - да
сидел такой же шиз безработный и пришла ему мысль слепить себе инструмент для ковыряния микроконтроллеров, ну и слепил
теперь сидит в треде и с пеной у рта доказывает что лисп про микрухи
в то же время дефакто стандарт индустрии - плюсы по понятным причинам
сам лисп для обучения нейронок сделали
Ну что же ты :( Такими знаниями обладаешь, а не хочешь делиться.
Мужики с 80х годов в неведении, на лиспах ОСи пишут. За столько лет не нашлось им такого светила, кто указал бы, в чем они не правы.
>в чем они не правы
ну и где твои мужики типерь? што с ебалом? узнали? согласны?
вас постигла судьба рубишизов, рыночек распределил всех по нужным этому миру шконкам
уровень вашей аргументации поражает
>ну и где твои мужики типерь?
Те самые? Уже на пенсии.
А новых практически нет. Symbolics прогорел, неправильно выбрав вектор развития. ИИ-пузырь лопнул. Передовые разработки (в т.ч. концепцию гуи и в частности окон) растащили более предприимчивые бизнесмены. А современные школьники, вроде тебя, только слышали звон, мол, ФП, ИИ и скобки. Поэтому сообщество очень малочисленно, крупных проектов почти нет.
>в то же время дефакто стандарт индустрии - плюсы по понятным причинам
Манямрии крестоёба.
мимо эмбедщик
Перед тобой repl
(+ 5 5)
10
Что он сделал? Скомпилировал или интерпритировал?
в репле интерпретирует вычислил выражение и результат высрал в ответ
скомпиль в бинарь и запусти правда он ничо не высрет в консоль, так как в этом коде нет принтов
Что произошло в SBCL REPL?
Когда вы ввели команду `(+ 5 5)` в REPL (Read-Eval-Print Loop) среды SBCL (Steel Bank Common Lisp), система выполнила следующие шаги:
1. Чтение (Read): REPL считывает введённое выражение `(+ 5 5)`.
2. Оценка (Eval): Выражение оценивается. В контексте Lisp, это означает, что функция `+` вызывается с аргументами `5` и `5`.
3. Печать (Print): Результат вычисления, который равен `10`, выводится на экран.
4. Цикл (Loop): REPL возвращается в начальное состояние, ожидая следующего ввода.
Компиляция или интерпретация?
SBCL, как и многие другие реализации Lisp, использует компиляцию в машинный код для выполнения выражений. Это означает, что даже в интерактивной среде REPL, выражения компилируются перед выполнением. Таким образом, когда вы ввели `(+ 5 5)`, SBCL скомпилировал это выражение в машинный код, а затем выполнил его, чтобы получить результат `10`.
Попробуй гопоту4, она чуть поумнее.
В PCL норм упражнения.
палучаица я магу сделать демона для серва, который будет чекать дэйт/тайм файлика (ну как мейк по той же логике) МОДУЛЬНЕЙМ.лисп и если он изменился схавоть его через load и крутить обновленную версию, а устаревший луп модуля брейкнуть
ебать
ета чо прод без компила?
а с колько вакансий тебе нужно, чтобы работать на кложур?
Просто интересно, а что тебе дала бы информация о работе, которая тебе не светит? Особенно с твоими навыками поиска информации.
Во что вкатываемся? В прошлом веке кложура была популярной. А щас она как будто пропала с радаров? Не то чтобы кложура была настоящим лиспом, конечно.
Я в другую религию ударился на какое-то время, не было времени следить.
Че с ней случилось то? Столько хайпа было.
>Я в другую религию ударился на какое-то время
В секту переписывателей подался, да?
>Че с ней случилось то?
Харизматичный лидер ушел, у последователей опал хер, в итоге рассосались по новым игрушкам. Остался только тонский и ещё полтора аутиста.
>Столько хайпа было.
Хайп - штука недолговечная.
В какой-то момент, да. Но меня так заебало время компиляции, что я вернулся к истокам.
> Харизматичный лидер ушел
Рич съебался? Вот это новости. Куда, неизвестно?
>Рич съебался?
Лет пять уж прошло. Сказал, что наигрался, и ушёл в закат.
>Куда, неизвестно?
Хз, не интересовался.
Языкосрачи уже никому не интересны. Какая разница, насколько крутой язык, если ВАКАНСИЙТОНЕТ
Половина программача - вкатыши, которым инфоцыгане наобещали наносеков, другая - клерки с ипотеками. О какой душе ты говоришь?
Он давно уже доэволюционировал, если ты про то что умеет CL, см cl-lib.
seq.el это более новая либа, которая выглядит как стандартный функциональный набор, в каком-нить жс, что как по мне намного удобней, потому CL примитивы застряли в 80ых.
>Он давно уже доэволюционировал, если ты про то что умеет CL, см cl-lib.
Сходу бросается в глаза, что пакетов ещё не завезли, иначе не было бы этих вот seq-some, cl-getf.
>seq.el это более новая либа, которая выглядит как стандартный функциональный набор, в каком-нить жс
Я бы сказал, как в каком-нибудь CL, лол. Примерно 3/4 из CL, но имена местами изменены на более общепринятые. Только take, drop и group с хаскеля стащили.
>seq-reduce (function sequence initial-value)
>reduce function sequence &key key from-end start end initial-value
>seq-position (sequence elt &optional testfn)
>position item sequence &key from-end test test-not start end key
А, так они опциональные аргументы выкинули. Фууу, за это дизлойс.
>>288220
Да кто ж сомневается, что и так работать будет? Но неудобно же.
Ну cl-lib никуда не делать. Хочешь его, юзаешь его же.
> Но неудобно же.
Да хз. Греп лучше любых сраных lsp как по мне.
Ну было бы у тебя `seq::some` тебе было бы сильно лучше?
>Ну было бы у тебя `seq::some` тебе было бы сильно лучше?
Нет, было бы
(defpackage pkg (:use #:el #:seq))
(some ...)
Вот у меня есть проект. Как мне найти все использования конкретного `some` в нем? Если мне не изменяет память, тулинг вокрул CL в такое просто не умеет.
Наконец переделали на всё на методы и прикрутили динамические примеси для расширяемости.
Больше никакого monkey patching'а как в былые https://github.com/stumpwm/stumpwm-contrib/blob/master/util/swm-gaps/swm-gaps.lisp
Как он щас, кстати? Я лет семь назад с него слез, потому что он заебал глючить на мелочах типа иконки телеги в трее лагучей.
Если я правильно помню, оно худо бедно работало только для публичных глобальных функций. А типа, кто юзает вот эту приватную функцию поправь терминологию сам хуй.
Я понял что я особо не трогаю конфиг своего вм вообще после изначальной настройки, поэтому динамичности как у стампа мне особо не надо. dwm за глаза хватает. Впрочем, его еще и легче править на лету, чем stumpwm.
Да не, слайму похуй экспортируется символ или нет.
Я вот сейчас буквально stumpwm ковырял, постоянно пользовался sly-who-{calls,references} - всё отлично работало.
>Впрочем, его еще и легче править на лету, чем stumpwm.
Ну не, в плане модификации и, тем более, отладки на лету stumpwm всем даёт пососать.
Хер знает, не могу сказать что у меня хорошие от этого процесса воспоминания.
Ну может когда у меня будет очередной приступ тинкеркрастинации, гляну еще раз.
Тебя какой именно аспект скриптования интересует?
https://lispcookbook.github.io/cl-cookbook/scripting.html
В кукбуке этот вопрос вроде достаточно полно освещён, не показано только примеров с roswell'ом в качестве пускалки скриптов.
Есть супер простая задача.
Есть директория, в ней лежат csv файлики. Каждый надо распарсить, удалить дубликаты из колонок по определенным правилам, сгенерить sql и вставить его в базу.
Эт не лаба. И я уже все сделал. Мне просто было любопытно как бы это выглядело на общелиспе. Сколько боли бы это вызвало.
>Сколько боли бы это вызвало.
Зависит от СУБД и объемов. Но если у тебя не десятки гигабайт и bulk insert не нужен, то, скорее всего, ноль боли.
>Мне просто было любопытно как бы это выглядело на общелиспе.
Любопытно — сделай. Разомнешь серое вещество.
Ну ты и бака!
Я для себя чисто для души.
Да не велика разница.
Да уже разобрался. Описывал метакласс для прозрачного доступа к атрибутам в sysfs и нужны были прокси-слоты.
Короче, определил метакласс, классы direct-слотов, effective-слотов и метод slot-value-using-class и его setf-версию, которые читают и пишут из/в sysfs. Работает, но мне не нравится, что место под эти слоты выделяется в объектах. Нет, мне не жалко этих скольких-то лишних байт на объект, но перфекционизм не даёт покоя.
В первой надо было писать процедуру на sql
Во второй выводить самые толстые файлики через консольный git
А где описание на русском что такое eval и куда и когда его надо вставлять?
Ну вот пусть она и объясняет, куда там евалы засовывать надо.
Кто-нибудь мне может объяснить, какого хуя в APL выражение ≤\1 0 0 1 0 1 0 возвращает 1 0 1 1 1 1 1, а не 1 0 1 1 0 1 0? Я джва годадня убил на отладку своего говнокода из-за этой хуйни.
Предполагаю, что ответ "просто потому что". Но как тогда добиться ожидаемого поведения оператора scan?
Ценный коммент, спасибо за правду. Посмешил.
предположу что все же система была написана на сlojure, а не на общелиспе или схемке
У них вроде и брощелисп, и кожура используются.
То есть, куда вставить read и print ты разобрался, а для eval дырки не хватило?
Я кстати решил его таки дочитать. В свое время половину прочитал, и как-то забросил.
Message Passing style оч симпотично выглядит.
Ну или порекомендуйте онлайн интерпретаторы.
drracket