Это копия, сохраненная 16 августа 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 сильно отразилась на дизайне языка, что многим не нравится.
— Hy - Lisp-синтаксис для Python с анафорическими макросами ( http://hylang.org/ )
— 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 (https://www.amazon.com/Little-Schemer-Daniel-P-Friedman/dp/0262560992), The Seasoned Schemer (https://www.amazon.com/Seasoned-Schemer-MIT-Press/dp/026256100X), The Reasoned Schemer (https://www.amazon.com/Reasoned-Schemer-MIT-Press/dp/0262562146), Death of a Schemer (https://www.amazon.com/Death-Schemer-Frank-May-Chronicles/dp/1610273060)
+ 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
+ Portacle ( https://shinmera.github.io/portacle/ )
+ 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
+ Проекты, заслуживающие внимания ( https://github.com/CodyReichert/awesome-cl )
+ 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
здарова чувачки
Вроде такой крутой язык, а неумеет нормально с IO работать. Пара каких-то дерьмолиб и все.
Где его вообще можно применять то?
>А как мне быть если нужно хранить состояние? Вот я должен проводить итерацию пока не будет достигнут какой-то критерий. А критерий может быть мутабельным, ну например на протяжении скольких-то шагов приращение результат было меньше заданной точности. Тупо создавать новое состояние и кидать его как доп параметр в рекурсии?
Ты наркоман совсем?
Если нужно хранить состояние - храни состояние.
Лисп тебе этого не запрещает.
Да. Вообще говоря любой цикл можно реализовать через (хвостовую) рекурсию.
хуево все с IO только у хаскеля из-за фанатичной чистоты. Какие проблемы у кложи или у эрланга?
Для таких задач есть пролог тащемта
>не конкурентно способный
откуда инфа? Лиспы это много языков и на лиспах написано достаточно продуктов.
я не юзал ракет, поэтому не могу за него советовать, я по кложе. Стек простейший, ring и compojure это все что тебе надо для того чтобы делать вебприложения. Осваиваются за пару дней. Удачи
Спасибки. Мне вот почему то стек не показался простым, ну да ладно, буду бить дальше. А как насчет ClojureScript, по идее на нем можно писать под Ноду, или нет?
пацан ты походу ваще не вывозишь. Пыха это для рендеринга хтмля сервером. Мы про кложескрипт говорим, который на js хостицца. Реакт хороший фреймворк который дает няшные абстракции. Почти все библиотеки для работы над интерфейсами в кложескрипте являются сорт оф врапперами над компонентной системой реакта и это хорошо, потомушта реакт няшненький и декларативный, состояние от поведение отделяет.
Учись и просвящайся
(define (abs x)
(if (< x 0)
(- x)
x))
не будет работать правильно, потому что интерпретатор воспринимает минус из (- x) как функцию, и поэтому не возвращает отрицательный x.
То есть если вызвать функцию с положительным числом, то все будет нормально, (abs 5) вернет 5.
Если вызвать с отрицательным, (abs -5) то функция вернет положительное число 5, так как интерпретировала (- x) как функцию - и положительный x.
Если убрать скобки, будет ошибка синтаксиса. Не знаю как быть. Вроде должен быть оператор, который говорит что форма не содержит функций, чтобы (- x) возвращал отрицательный x. Не знаю как загуглить это, помогите плиз. Пишу на Racket.
определи функцию которая отнимает число от нуля и используй ее тут вместо минуса
Парадокс, но как ты написал не работает, нужно наоборот, (- x 0). Это только в ифах так. Чет даже не смешно, что не так с ракетой.
(define (abs x) (cond ((> x 0) x) ((= x 0) 0) ((< x 0) (- x))))
(define (abs x) (cond ((< x 0) (- x)) (else x)))
(define (abs x) (if (< x 0) (- x) x))
Ну почему такая херня, они что не проверяют код.
Что за MIT Scheme? Проверял в Racket. Да и что проверять, и так ясно что первый минус интерпретируется как функция.
Нашел в одном месте указание на такое поведение, но там вместо ссылки на объяснение, 2 левые ссылки.
For example, here's how one could create an absolute value procedure using lambda and if.
> (define abs-of-steele
(lambda (x) (if (>= x 0) x (- x))))
> (abs-of-steele -1)
1
> (abs-of-steele 1)
1
To understand why this is a horrible pun, click here and here.
Взято отсюда http://cs.gettysburg.edu/~tneller/cs341/scheme-intro/
примеры кода в сикп даны на языке Scheme. Это тоже такой лисп, там работает унарный минус
MIT/GNU Scheme running under OS X
1 ]=> (- 1)
;Value: -1
Ну и что? Racket это бывший Scheme. Фактически это один и тот же язык. Проблема же не в языке, а в том, что кто-то неправильно дает примеры, если даже в СИКПе ошибка.
Попробуй такую функцию:
(define (abs x) (if (< x 0) (- x) x))
При вызове на отрицательном числе, будет выдавать положительное.
Парень, ставь mit scheme и переставай зафлуживать тред :)
1 ]=> (define (abs x) (if (< x 0) (- x) x))
;Value: abs
1 ]=> (abs -33)
;Value: 33
У тебя должно было вернуть -33, отрицательное число должно было вернуть. В том то и ошибка.
Схуяли?
Все разобрался. Минус на минус дает плюс. Не понял условие, думал, что на отрицателный х должен быть отрицателный результат.
Какой именно лисп ты имеешь в виду? И что там ненормального с вводом/выводом
Таки дошли у кого-то руки, запилили слайм под богомерзкий атом.
А он как-то до этого на глаза не попадался
В целом да, правда не знаю насколько удобно.
https://www.infoq.com/news/2015/08/clojure-native-android-apps
Можно еще писать под React Native для андроид.
Вроде как есть возможность, но не стоит.
Можно, разрешаю.
Тогда тем более
Байт-код тот же и механизмы все те же. Просто вместо JIT теперь прекомпиляция.
>Просто вместо JIT теперь прекомпиляция.
>Просто
Для динамического языка, который тоннами создает классы в рантайме, это нихуя не просто. Раньше приходилось изъебываться генерацией dex'ов в рантайме и последующей их подгрузкой дальвиком, который далее их джитил. Теперь, насколько я понимаю, задача усложнилась и стала ещё более ресурсоемкой
Да. 1 это не аргумент
ченить за 2 года поменялось?
для ИТ срок громадный, а для говномамонта общелиспа похоже новье.
https://practicalli.github.io/
Там 4-й гайд по спейсмаксу.
Собственно этот - https://practicalli.github.io/spacemacs/
Спасибо.
Прям вот двачую. Так то все понятно, проме гита. Сегодня удолил весь проект, и ххуй смог откатить. Заебок.
А как на Clojure писать грамотно? Будут ли подобные слои?
Типо как https://github.com/magnars/dash.el для Emacs Lisp.
Кложаскрипт тут обсуждается?
Какой тулинг сейчас самый модный? Кто-то пишет про figwheel, кто-то про boot-*. Что посоветуете?
> мап, фильтр и редьюс на клиспе пишется за 3-4 строчки
мап(который одновременно ещё и зип) и редьюс там уже есть и так
А вот фильтра нет. И партиал-аппликате и функшон-сомпозе
и ещё кучи всяких полезностей
> пишется за 3-4 строчки
Ну так кто-то должен был уже написать
> Читаю сикп
лучше перед сикпом почитай хотя бы какие-то основы по лиспу или схеме
иначе будешь кучу таких дурацких вопросов задавать
Ковычко - это цитирование. Нет ковычко - списко вычисляецо (+ 1 2) -> 3.
Есть ковычко - списко не вычисляется, а остается как есть '(+ 1 2) -> (+ 1 2).
Ковычко 'something - сахар для (quote something). quote - это специальный оператор, предотвращающий вычисление своего оргументо.
>quote - это специальный оператор, предотвращающий вычисление своего оргументо.
Какой ужас. Все через жопу.
Если не ошибаюсь во всех лиспах так. Иначе как сказать интерпретатору, что первый аргумент списка не функция, только пометив список.
Не через жопу, а семантика. quote + eval - одна из многих фич лиспа, перекочевавшая в эти ваши JS и PHP.
бамп
Clojure.
Ну чего сразу обзываться-то? Вот в рубях отличные названия, а в космонавтов говно
Блин какие космонавты. В коммоне
Как макросы освоишь, так перестанешь обращать внимание на названия и познаешь истинный дзен диска.
Точечная пара состоит из двух регистров address и decrement. Эти функции отдают содержимое этих регистров, contents of address/decrement register - car/cdr
В atom+nuclide можно добавлять удаленные проекты, в емаксе есть tramp. Что еще есть?
>А вот фильтра нет.
remove-if же
>И партиал-аппликате и функшон-сомпозе
Это уже в александрии есть
Емакс мне просто не нравится. Нуклиде требует установки серверной части. Хочется и простоту(например, подключение и копирование поверх SSH), и приятный редактор.
А хрен ли с этим элексиром дольше знакомиться-то, если уже хорошо знаком с эрлангом и хачкелем?
Только узнал, что raco может декомпилировать байткод, надо будет попробовать.
А куда ты его катал, еслм не знаешь как запустить? Реплом не польхуешься что ли сука?
Скачал с сайта MIT Scheme и начал писать, но от него ни ответа ни привет, даже числа складывать не хочет.
Ну дык результат вычисления выражений только в репле сам выводится, а ты ж небось ему файл скармливаешь. В любом случае, рекомендую скачать drRacket как более дружелюбную для новичков среду
Виртуальная машина Эрланга очень даже располагает писать под нее. Какие сейчас лиспы живы кроме кложур?
Не то скачал. Качай Racket, он современный, все инструменты есть.
где-то вдали заплакал Рич Хикки
Но как же все эти хипстеры с ливкодингом на реагенте? Все уже умерли?
Очень смешно. Где вакансии? Где компании его использующие? Где проекты? Где сообщество?
Не знаю, такими эзотерическими штуками не интересуюсь.
Лейн или бут?
Это были не вопросы.
Интересно было бы пощупать что-то статически типизированное, компилирующееся в BEAM. Был YHC, но он сдох. Грустно, хоть сам садись и пиши.
> Иначе как сказать интерпретатору, что первый аргумент списка не функция, только пометив список.
(list a b c)
Упражнение
>Какой результат напечатает интерпретатор в ответ на каждое из них?
Что это за строчка как мне её понять?
Наркоман штоле аль не выспался? Равенство конечно. Печатать будет булевские значения обычно, True аль False.
Ладно. В общем, по скольку, они неравны то значением этого выражения будет False.
a == b
Картинка выглядит сомнительно, да еще и исследование 2000 года.
Предлагаешь ещё одну книг прочитать? Не нашёл в оглавлении упоминания про кавычки.
Предлагаю перед чтением любой книги открывать черепную коробку и вставлять туда мозг.
Университет Британской Колумбии (UBC), на курсере есть их курсы, по программе HTDP, на Racket.
Это не такое важное, чтобы в оглавлении было.
Глава 1
Примерно как си и жаба. Или, что точнее, как схема и жаба.
А что это за значок? Ты что халфлюфе третий делаешь?
Первая строка кода определяет используемый язык, для Racket будет #lang racket. Можно еще менять в настройках среды Dr. Racket.
Открываем официальный сайт и смотрим примеры кода. Видим следующее
#lang racket
(require 2htdp/image) ; draw a picture
(let sierpinski ([n 8])
(cond
[(zero? n) (triangle 2 'solid 'red)]
[else (define t (sierpinski (- n 1)))
http://racket-lang.org/
((fn foo [x] (when (> x 0) (conj (foo (dec x)) x))) 5)
что будет на выходе?
Ответ: [5 4 3 2 1] - какого хуя? Разве функция foo не должна сработать до функции conj? Если так, то foo должно вызваться 5 раз, и затем, когда в foo передастся (dec 1), должна начаться свертка рекурсии, функция conj сработает для х = 1 и пустого вектора, затем для х = 2 и вектора [1], добавив 2 в конец нового вектора, т.е. уже будет [1 2] и т.д. Т.е. на выходе имеем вектор [1 2 3 4 5]. Так какого хуя ответ - [5 4 3 2 1]?
Разве в кложе не аппликативный порядок вычислений, а нормальный?
А, все понял. Просто я тупой.
Аппликативный порядок как раз и подразумевает, что сначала вычисляется conj, а затем вычисляется foo. И каждый раз идет присоединение к (foo x) значения x + 1. Спасибо за помощь!
Емакс страшный, лайт тейбл мертвый, найткод аскетичный, а в атоме все через задницу, даже proto-repl нормально не работает.
Не опускаться же до вима.
И спейс, и акву пробовал — какое-то оно для пришельцев. Я несколько раз пытался вкатиться в емаксы, каждый раз хотелось убежать.
Саблайм с плагином SublimeRepl.
вкатывайся еще, с первого раза мало кто осиливает
И редактор, в общем-то, не самая большая проблема. Самая большая проблема в том, что я не могу понять, как заставить связку редактор-консоль-figwheel-cljsrepl-браузер работать.
Запустил простой проект. `lein figwheel` включается в режиме cljs-repl, выражения вида `(.log js/console "Hello World")` дают ожидаемый результат в браузерной консоли.
LightTabe подключается с этому фигвилу, но в режиме clj-repl — в результате `(printl "Hello world")` печатает строку в терминале, а не в браузере, и js/X объекты мне не доступны. Подключение через nREPL в атоме приводит к такому же результату.
Если же запустить proto-repl, и уже в нем вручную импортировать figwheel-sidecar и запустить сам фигвил — все работает как надо. Но делать так каждый раз не весело будет.
Строка — самый простой пример. Меня больше интересуют извращения с re-frame/dispatch.
Допустим, я хочу протестировать некую последовательность событий. Как мне это сделать?
Вариант 1: протыкать все кнопки вручную.
Вариант 2: сохранить в редакторе`#_(dispatch-some-events)` и исполнять это выражение в cljs-repl по мере надобности.
Похапэ ждет тебя.
ну вроде как фигвил имеет свой собственный репл независимый от cljs-repl. Поэтому там проблемы с их линковкой. Если получится завязать фигвиловский репл с каким-нибудь редактором то отпиши в тред плизики :3
И так убил на это слишком много времени, больше возиться как-то не хочется.
Пока остановился на таком варианте:
В терминале — `rlwrap lein repl`, `(figwheel-sidecar.repl-api/start-figwheel!)`.
В атоме — подключаю proto-repl через nREPL, `(cljs-repl)`.
Многовато лишних движений(аж целых 2!), репл работает медленновато, но терпимо. Еще надо протестировать, как эта связка поведет себя при потере сети.
Может потому, что это лисперы любят делать eDSL?
[:span {:class "foo"} "bar"] — что это, если не DSL?
DSL не обязан быть полностью отличным от основного языка. Кому надо — могут обмазываться reader macros и превратить лишп в хачкель, но часто ли это требуется?
Это читается "декларация html-элемента, который должен отрендериться как <span class="foo">bar</span>". Синтаксически это просто гетерогенный вектор, но по сути это DSL.
Кода на лиспе значительно меньше, но быстрее ли его писать, думаю не сильно, на джаве можно огромными кучами кода ворочать в всяких модных IDE, при должном скилле думаю весляр с 20 летним опытом на жабе будет офигенски быстро генерить кодяру для какого-то фреймворка.
Лисп не за скорость разработки любят, за скорость разработки можно любить пайтон и руби и я слышал перл
В современном мире скорости написания примерно одинаковы: в лиспе код за тебя пишут макросы, в других языках - IDE.
Дурацкий вопрос, субъективщина. Сам попробуй и прикинь нравицца тебе или не
А какие именно у хаскеля проблемы с IO?
Метапрограммирование, компиляция кода в риалтайме, интерактивность системы с горячей подгрузкой кода.
>В современном мире скорости написания примерно одинаковы
Нет конечно. У лимпа цикл "исправить ошибку - перезапустить" гораздо меньше, за счет этого скорость разработки приложений выше.
>Есть в ...
В лиспе оно есть все сразу, сделано нормально, и органически сочетается друг с другом, благодаря чему возникает синергетический эффект.
Синтаксис ебанутый, неудобные скобочки везде, где надо и не надо.
Это копия, сохраненная 16 августа 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.