Это копия, сохраненная 23 июля 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Основные диалекты
— 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 - это минималистичный лисп, пригодный в основном для обучения, исследований. Тем не менее, Racket вполне практичен. Racket включает в себя много подъязыков (typed racket, lazy racket, frtime racket), включая схему стандартов r5rs и r6rs.
— Clojure - Стильный, модный, молодежный лисп с бóльшим уклоном в функциональщину, иммутабельными структурами данных, поддержкой параллельщины с транзакционной памятью, агентами. Ориентированность на JVM сильно отразилась на дизайне языка, что многим не нравится.
— Hy - Lisp-синтаксис для Python с анафорическими макросами
— Emacs Lisp - его область применения ограничивается емаксом. Является наследником ТОГО САМОГО MacLisp'а.
— 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
Как изучить?
— Common Lisp
+ Practical Common Lisp http://www.gigamonkeys.com/book/ или русский перевод — http://lisper.ru/pcl/
+ On Lisp http://www.paulgraham.com/onlisp.html
+ 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
+ http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme.html
+ Racket Guide
+ SICP (это скорее вводные лекции по программированию, а не учебник по схеме, но тоже пойдет)
+ Попрактиковаться можно на Exercism'е http://exercism.io/languages/scheme
— Clojure
+ Programming Clojure, 2nd edition (для новичков)
+ The Joy Of Clojure, 2nd edition (есть есть бэкграунд в Лиспе или ФП)
+ Попрактиковаться можно на Exercism'е http://exercism.io/languages/clojure
— Hy
+ Официальный сайт http://hylang.org/
— 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
+ Emacs + geiser
+ 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
Common lisp
Читал оригинал. Ну ок.
Ага, этот бложик тоже читал.
Наркоман штолле сука? Пиши код блеять.
это же половину времени будешь изобретать велосипеды, которые уже изобрели в други языках
Попробуй библиотеками воспользоваться. Говорят, помогает от велосипедостроительства.
чтобы понять и начать использовать как работают исключения в мейнстрим языках, нужно сломать голову
чтобы понять как работают продолжения, сопрограммы в альтернативных языках нужно тоже
а соответсвенно чтобы понять работу сигналов в лиспе нужно этот заеб перемножить один на другой..
Пожалуй.
https://habrahabr.ru/post/247965/
Лиспаны, что думаете насчёт этого странного, наркоманского язычка, именуемого пиколиспом? Вроде и из коробки всего полно, и ffi не замороченный, и веб-гуй пишется удобненько, и на ведро ставится без всяких танцев. Но какой-то он... ебанутый.
Мне кажется, что не так все однозначно. Надо бы придумать, где его можно применить.
Но зачем? Хотя про ведро где почитать можно?
Хули толсто, Clojure - самый живой Lisp, а JVM - самая популярная платформа, с ней и посредством Kawa (Scheme) с успехом поиграться можно.
Но кложура - не лисп. Это вообще не язык программирования, а такой хипстерский дсл для скриптования жавы. Специально для тех, кому надоело программировать на xml.
Хорошо что ты знаешь своё место.
Тебя и там за кложу ссаными тряпками закидают.
Упал с 2% до 1%? Ну хуй знает.
Возможно, его вытеснили скриптопараши вроде перла, питона и пыха везде, где все возможности лиспа все равно были не нужны. В целом появляется все больше и больше специализированных языков и они утаскивают прогеров из метаязыков. А чтобы вытащить из жабы быдлокодера, ему еще нужно объяснить, зачем ему все эти фичи.
Но как так вышло? Ведь было же сообщество. Куда оно проебалось?
Впрочем, пых питон и прочая дристня действительно гораздо более дружелюбны к новичкам.
Ты ебанутый, лисп-машины нахуй не нужны. Питономашин же нет.
Зачем лисп похитил питона?
Потому что питон зло, очевидно.
Но за щекой ничего нет. Ты правильно хоть накидал?
И когда запилят единый репозиторий библиотек с пакетным менеджером для всех реализаций схемы?
Спасибо.
Ебать ты шизофреник.
Есть мнение, что не нужно - все живые Схемы обзавелись собственными расширениями над стандартами.
>И когда запилят единый репозиторий библиотек с пакетным менеджером для всех реализаций схемы?
Лол. Никогда. Это ж схема.
Да. Но так уж случилось, что реализаций несколько. Исправить это можно единым репозиторием библиотек.
Просто смирись, что Chicken Scheme это один язык, а Guile это другой.
1. Потому что ты школьник и не можешь в Google.
2. Потому что 90 процентов программистов - долбоебы, которые не могут в SICP.
> Где комьюнити?
> Потому что 90 процентов программистов - долбоебы,
С таким подходом коммьюнити и не будет.
Общелисп и есть самый настоящий промышленный язык. Учись пользоваться гуглом.
Фреймворки и сообщество есть, но немногочисленгое. Но не количество главное.
так никому коммунити уровня тупых жабаиндусов или go-детей и ненужно
Гуглом пользоваться научись, полуебошный.
https://julien.danjou.info/projects/emacs-packages#rainbow-mode
Спасибо, пидор.
Вообще я просил придумать какую-нибудь задачу, а не предлагал соревнование.
В музыкалке учился что ли?
Еще как вариант это называется "замыкание": http://letoverlambda.com/textmode.cl/guest/chap2.html
Но тут функция не совсем строится.
А чо нет-то.
>Критики нового стандарта указывали на его раздутость и чрезмерное внимание, уделённое практическим требованиям, что привело к нарушению «функциональной чистоты» Лиспа и увеличению объёма поддерживающих его Лисп-систем.
>Более существенно то, что Интерлисп базируется на динамическом связывании, тогда как все новые версии Лиспа — статические.
Кто-нибудь пояснит что за "функциональная чистота" такая нарушилась после стандартизации и что за динамическое связывание было вместо которого запилили статические?
Может быть, под статическим связыванием подразумевается лексическая область видимости?
А функциональной чистотой, насколько мне известно, ни маклисп, ни интерлисп никогда не отличались.
Та же ситуация с Flycheck.
Выкини emacs.
Заскринь модлайн.
Спасибо!. Не ругайся. Нюфак же
Ну так для какого тебе диалекто то надо?
http://www.gnu.org/software/mit-scheme/documentation/mit-scheme-ref/Special-Form-Syntax.html
В общем посмотрел я на определения функции cond when and в sbcl. и все они написаны с использованием только if. Получается я могу только на if все писать. Вот же откровение.
cond это не "основной" оператор, а сахарок для if, реализующийся на макросах. Как в лиспе, так и в схеме.
Ты уже большой. Видишь, сам справился.
Для этих вещей у нас есть хаскель.
В том что при интерактивной разработке ты наслаиваешь приложение постепенно, как будто создаешь скульптуру. Ты мгновенно получаешь обратную связь и работаешь с образом своего приложения, а не работаешь по стандартному циклу "Отредактировал, сохранил, перезапустил". Реплы во всем что я пробовал кроме лиспа годятся только для проверки тривильных вещей, а не для полноценной разработки.
Говно ваша интерактиваня разработка. На нормальной статике в нормальной можно написать целый модуль без твоих циклов "Отредактировал, сохранил, перезапустил", потом этот модуль собрать, и он будет как положено работать.
Глядите-ка, жабомакака подтянулась, которая по 3 минуты ждет пока у неё хэлло-ворлд запустится.
Ну да, жабка же единственная статика, и нормальная статика, ничего слаще редьки ты не пробовал. Scala компилирутеся в 2 раза дольше
Вскукарек<кококо> вскукарек = new Вскукарек<кококо> ();
Это хачкель или жаба?
Для вставления в питон есть Hy в шапке.
VS
((if (> (rand 10) 5) + -) 3 4)
Дискасс.
бля, ну это специфический момент, тут-то не про синтаксис, а про устройство интерпретатора(одно окружение или несколько),
Это все тот же всем настоебавший lisp-1 vs lisp-2.
Лично мне больше нравится явный funcall, потому что я вообще не с первого раза вдуплил в середине другого куска кода что ((XYNTA) .!)))345)) это вызов функции собранной в результате вычисления.
так а что же еще, но мне (function +) (или во что там раскроется #'+) кажется немного хуетой, вообще, конечно дело вкуса
мимо-могу-немного-в-питон
Можешь генерировать macrolet-формы, например.
Надо выделить ЦЕЛЬ в ((1(2(3 4 цель))
вот так все работает (car (cdr (cdr (car (cdr (car (cdr (car '((1(2(3 4 цель))))))))))))
Но когда я пытаюсь в сокращение
(caddadadar '((1(2(3 4 цель)))))
то
* (caddadadar '((1(2(3 4 цель)))))
debugger invoked on a UNDEFINED-FUNCTION in thread
#<THREAD "main thread" RUNNING {1002A8AEE3}>:
The function COMMON-LISP-USER::CADDADADAR is undefined.
Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT] Exit debugger, returning to top level.
(SYMBOL-FUNCTION CADDADADAR)
0]
и что тебя удивляет? caddadadar - неопределенная функция, вложенные c*r определены до 4 уровня http://www.lispworks.com/documentation/HyperSpec/Body/f_car_c.htm
Шпасибо, т.е. это никак c*r не сократить? Странно, что в учебнике задание еще и сократить.
можно (caddar (cdadar '((1(2(3 4 цель)))))), а можно и самому определить
(defun caddadadar (x) (car (cdr (cdr (car (cdr (car (cdr (car x)))))))))
>>717898
ну, я вот думаю, 47, логика такая
(let (#'42) (+ . #'5))
(let ((function 42)) (+ . (function 5)))
(+ . (42 5))
(+ 42 5)
47
А вообще, поясни потом правильный ответ, и как до него дойти
>(caddar (cdadar '((1(2(3 4 цель))))))
Так и есть скорее всего, ибо на том месте про определение функций в помине нет.
Первый вариант чуть-чуть лаконичней, но я спотыкаюсь на его чтении. Второй вариант длиннее, но в голове его удобно проговаривать — "из фу" он и есть "из фу", пауз при чтении не возникает.
Что является стандартом и почему?
У меня spacemacs. Конфиг показать не могу, т.к. ноута под рукой нет, но там и смотреть-то практически нечего.
Или если речь о схеме, то, кажется, общепринятым является foo?
Это тебе вот такое дерьмо удобно проговаривать: (if is-foo) ?
is-* имеет смысл как свойство объекта.
(if shit.isTasty) ; читается нормально
Оба эти варианта читаются отлично:
(if foo?)
(if foop)
Мир Лиспа. Том 1. Введение в язык Лисп и функциональное программирование
В отличии от Practical Common Lisp там практические примеры после каждой главы и подача материала легко усваивается. Что скажите про нее? Щитаю, что она оптимальна для ньюфага.
PCL не для ньюфагов, а для тех кто знаю как программировать впринципе, хочет выучить CL.
Все равно ошибка.
default-load-handler: expected a `module' declaration
found: something else
in: #<path:/root/Documents/SICP/1.32/1.32.scm>
context...:
standard-module-name-resolver
Надо же, это сработало.
так задание же из sicp, там и mit-scheme подойдет(с ней sicp и проходил в свое время)
Вроде это для макросов ридера, т.е. переопределение того, как текст преобразуется в s-exp, например, можносделоть инфиксную арифметику и т.д..
Пропущеная скобочка это не шутки.
https://github.com/quickdocs/quickdocs-updater/blob/master/quickdocs-updater.asd
Вот пример использования. Нахуя оно там?
Ну а как ты сделаешь чтобы квадратная скобка преобразовывалась в #( без макросов ридера?
Или тебя что-то конкретное смущает? #\ = символ
А, я хз, похоже на сокращенный eval
Для вычисления выражения на стадии чтения s-exp'а.
>>719297
Читает строку из файла и подставляет её в выражение, а потом уже раскрывается макрос defsystem
Ага, я так примерно и понял. Спасибо.
Конечно, стоит, ведь в схеме жизни нет. Даже по меркам лиспосообщества.
Кложа/Clojure охуенна. Причин несколько:
- очень развитое комьюнити
- иммутабельные структуры данных, что избавляет от рейс кондишенов и позволяет удобно писать асинхронный код
- core/async, stm, атомарность, промисы
- Clojurescript, где комьюнити тоже совершенно охуенное: есть ом, реагент, куча других либ и биндингов
- Отличные макросы (да, есть и в CL)
...
Список достоинств можно только продолжать.
Короче, реально писать не на Кложе вообще смысла не вижу. Главный недостаток это JVM с невозможностью реализовать tail call elimination, stop the world'ом (для сравнения Ерланг/Эликсир -- в BEAM такого нет, там каждый актор заводит свой хип) и долгим стартом (особенность JIT в JVM).
И да, если вам понадобятся Акторы, то есть вполне рабочие биндинги к Акке.
В общем, программисты выбирают Кложу, а диванные кукаретики продолжают срать под себя. Хуйню тут развели блядь какую-то.
Тебе в жаваскрипт тред.
Опять набрасываешь, ирод?
На кложе никто не пишет, кроме хипсторов-вебпетухов. И то там кложескрипт, а не сама кложа.
Все преимущества, что ты перечислил, сводятся на нет одним базовым принципом кложи - плотной интеграцией в хост-язык, которые имеют совершенно иную, нихуя не совместимую с лиспом идиоматику. Поэтому код на кложе, как правило, представляет из себя ту же яву/яваскрипт, но с чуть отличающимся синтаксисом и немного подсахаренный.
Не распинайся, тут сидят зашоренные шизики, для которых всё что было после 80х - дохуя сложна, нинужно и нипанятна.
лол пририсуйте туда эмблему кложи, а ебло замените на маккарти
>>720688
> Главный недостаток это JVM с невозможностью реализовать tail call elimination
Используй loop-recur, он компилируется в цикл
> stop the world'ом
Для больших хипов есть Zing VM от Azul
> (для сравнения Ерланг/Эликсир -- в BEAM такого нет, там каждый актор заводит свой хип)
Если у тебя есть большой кусок данных, то он всё равно должен хранится в хипе какого-то актора, смекаешь?
> И да, если вам понадобятся Акторы, то есть вполне рабочие биндинги к Акке.
Нахуй акторы, есть core.async
Но то же самое есть и в общелиспе. Только в отличие от кложи он является языком полноценным, а не дырявойыми оберткойами (таки три платформы - три разных языка) вокруг жавы, жс и додиеза.
>то он всё равно должен хранится в хипе какого-то актора
В ерлаше бинари >64КБ идут в отдельный хитровыебанный бинарный хип.
>Нахуй акторы, есть core.async
Это неудобно. А все кто любит чтоб было удобно берут Okku.
>>720995
Общелисп - обычная переусложнённая императивная говнина с макросами.
> В ерлаше бинари >64КБ идут в отдельный хитровыебанный бинарный хип.
Что такое "бинари"? Большой вектори или мапа это "бинарь"? И какой в этом бинарном хипе GC алгоритм?
> Это неудобно.
Шта? По-твоему акторы удобнее чем CSP?
Вся его развитость заканчивается на лойсах на гитхубе, участии в хипстохакатончиках и, в редких случаях, запиливании недоделанной оберточки над жава/жс-библиотечкой.
Вот у хаскела сообщество можно назвать развитым, там действительно наблюдается движение.
Что такое "бинари"?
Бинарный тип данных.
> Большой вектори или мапа это "бинарь"?
Нiт, но при желании их обоих можно скастовать в бинари. Ну или получить такие сразу, из сети/файла/мемори.
>И какой в этом бинарном хипе GC алгоритм?
Висят до тех пор, пока на них не останется ссылок откуда бы ни было. В остальном как обычно.
>Шта? По-твоему акторы удобнее чем CSP?
Разумеется. Анониманя связь по каналам говно, работать без примитивов процесс/узел крайне неудобно. Модель акторов - это самый общий конкурентный концепт, средствами которого можно выразить большинство остальных, тот же ССS или CSP, обратное невозможно.
> Модель акторов - это самый общий конкурентный концепт, средствами которого можно выразить большинство остальных
По твоей логике GOTO - самый удобный концепт управления ходом программы, потому что через него можно выразить все остальные.
Алсо, сам уже больше года пилю бэкенд на дотнете, специальность обучения интересная, вот и не ливаю из универа
Врядли здесь кто-то из анонов хоть раз щупал этот автолисп.
Если не найдется нормальной литературы по автолиспу, попробуй поверхностно проштудировать pcl (ссылки в шапке), чтобы раобраться что да как.
Ну надо было сделать парсер одной фигни. Залабал на общелиспе. Оче годно. Плюс пробую тут на общелиспе селениум насиловать. Тоже норм вроде.
Парсер, кстати, модный. Интерфейс на clack + ningle + cl-markup + parenscript + css-lite
А чому так много либ для одного парсера? В Clojure вот один Instaparse справляется.
Это либы для интерфейса. Сам парсер юзает dexador + plump + jsown + cs-csv
Запилил себе иконку уютную - делюсь, мало ли, пригодится кому.
Тред про Emacs проебался куда-то, потому сюда.
https://github.com/TatriX/cl-selenium-webdriver
Ему чето типа plotlib нужно, а не свой движок писать.
>>724894
Глянь вон там http://cliki.net/plotting
Надо именно автолиспом сделать
Скиньте свои custom agenda или порекомендуйте хороших, а то говно получается.
Я имел в виду что-то типа общелисповского clhs ( http://www.lispworks.com/documentation/HyperSpec/Front/index.htm ),
Но уже нагуглил вот это http://stackoverflow.com/questions/15393797/lisp-splitting-input-into-separate-strings (последний ответ). Почти твоя задача, осталось только строки к числам привести. Код там, конечно, - говно а мож просто автолисп - говно, но суть должна быть понятна.
Ну и хуй с ним?
Там столько всего из коробки, что не приходится. Что нужно-то?
Я писал для org-drill. И то не скрипт, а просто интерактивную функцию.
скачал sicp.plt пакет, теперь DrRacket могет в beside/below, но все равно не могет в wave/rogers
Нихуя там сложного нет.
Просто функции, которые вызываются в динамическом контексте.
Что такое динамический контекст? Это список, хранящийся в динамической переменной, которая перебинживается дополненной cons-ячейкой каждый раз когда ты делаешь handler-bind (или там restart-bind для рестартов).
Ниже про сигналы. Про рестарты +- все то же.
В списке хранятся пары typespec -> функция.
Каждый раз когда ты из скопа соответствующей динамической переменной выходишь, соответственно, список возвращается к предыдущему состоянию.
Что происходит при signal? Она просто берет, проходится по списку, соответственно снизу вверх, получается, и вызывает все функции, для которых (typep <кондишн который ты ей дал> <соответствующий typespec в паре>) возвращает не nil.
Что происходит при warn? То же самое, только если не произошла раскрутка стека, функция еще и пишет message кондишна в stderr.
Что происходит при error? То же самое, только если не произошла раскрутка стека, выполняется функция invoke-debugger, которая зависит от реализации.
Что такое раскрутка стека? Это процесс нелокального выхода из точки в коде. Т.е. это операторы throw, return-from и go. В процессе раскрутки стека снизу вверх вызываются защищенные формы unwind-protect.
handler-case отличается от handler-bind тем что функции-обработчики он за тебя генерирует сам, и в конце каждой помимо твоего кода генерирует оператор return-from, т.е. инициирует раскрутку стека к текущему блоку.
Ебать ты наркоман. Представляю тебя плешивым дрыщем, сидящем в 6 сантиметровых очках на бабкином стуле и упарывающемся скобками.
>>732211
Поймаю в Бостоне - ебальник разобью. Хотя стоп, не поймаю, тебя же не возьмут в джетбрейнс ОПЯТЬ, ХАХАХА.
jdevelop
Воу воу кто ето, ето бостонский алкаш на связи!
25 строка
>>(lambda (x) (x))
Тут ты не возвращаешь x, а вызываешь его. Правильно будет
>>(lambda (x) x)
он
Ну, в принципе, я тоже так думаю. Потому что, когда неинтересно, чтение превращается реально в муки.
Через гуглодебагер.
А еще забыл сказать что пока оно в ветке https://github.com/TatriX/kite-mini.el/tree/dev и не готово до конца.
Есть. Но ебаться не хочется. Уж слишком фурифокс тормозной для разработки.
Сегодня утром вот поглядел видео и прочитал статью. С автором несогласен. С Сасменом, тоесть.
Я неточно выразился, я не несгласен, я просто его аргумент убедительным не нахожу. То, что теперь инжинерия поменялась таким образом, как он сказал, вовсе не означает, что тут же студентоту надо учить мануалы читать. Помему, свои костыли и велосипеды ценнее в практическом смысле, чем использование чужих. Именно при обучении, не в работе.
Автор потихоньку мержит в апстрим, а пока самое свежее тут: https://github.com/TatriX/kite-mini.el
Прикрутил отправку сообщений в консоль. Например, если во время загрузки скрипта все пошло по пизде, мы увидим пикрелейтед.
Обновление замыканий, конечно, охуенная вещь.
А чо там, полное обговление кода без проблем проходит? Ну т.е. допустим, пишу я код на каком-нибудь йобаскрипте, потом модуль транслирую в жс и отправляю браузеру. Он нормально обновится?
Поддержка сурсмапов в планах. Пока её нема, хотя для личного использования можно в 5 строчек написать.
И ещё, кто-нибудь ковырял clasp?
Кложурскрипт выглядит вкусно, но жаботормознутость перечеркивает все достоинства.
Ещё тормознее.
https://github.com/clojure/clojurescript/wiki/Quick-Start
> Download the standalone ClojureScript JAR.
Ты совсем поехавший?
http://techcrunch.com/2015/06/30/trucker-path-raises-20m-to-claim-the-uber-for-truckers-moniker/
Что за хуйня? В кложескрипте нет функции compile или хотя бы eval, потому что транслятор на яве^Wкложуре?
люди делятся на два типа: одни зарабатывают деньги, а другие неудачники. Сейчас деньги зарабатывают они.
Там есть eval, но для этого нужно специальный билд собирать (ибо много весит):
https://github.com/clojure/clojurescript/wiki/Optional-Self-hosting
А по поводу необходимости ставить JDK, то тут дело скорее в инструменте управления проектами (Leiningen), который написан на обычной JVM-ной Кложе.
Всё правильно делает, нигерам в общелисповском сообществе не место.
очевидно блядь. Кложура это лучшее что случалось с Лиспом эвар. Только нищие долбоебы до сих пор этого не поняли.
Clojure объективно не дотягивает до CL.
Как язык - никакой. Производительность - так себе. Ну про минусы JVM даже лень рассказывать. Там много говна, начиная от recur, и заканчивая невозможностю нормально делать hot code reload и невнятными стектрейсами.
Единственно, что выделяет Clojure, это огромнейший хипстерский хайп вокруг нее, и соответственно, допизды всяких библиотек(95% из них подчиняются известному правилу, но есть и годные). Соответственно, больше людей, в том числе тех у кого что спросить можно.
Думаю, причина ответа ПГ именно в этом.
Знаешь ли, далеко не всем jvm подходит как платформа, а в другие кложура by design не умеет.
> Как язык - никакой.
Гораздо продуманней чем CL.
> Производительность - так себе.
Лучше чем у CL, если расставить пару тайпхинтов
> невозможностю нормально делать hot code reload
Что блять? Любой динамический var свапается в любой момент. Ты, видимо, не знаешь как на низком уровне делается code reload и веришь в какую-то магию.
>Лучше чем у CL, если расставить пару тайпхинтов
Ага, видел я эти "пару тайпхинтов", когда код переписывается в ещё более нечитабельную яву-дрисню со скобками.
>Что блять?
Насколько мне известно, там обновление кода через жопу сделано, из-за чего на ведроиде приходится сначала генерировать dex, а потом подгружать.
другой анон, если чо
Нет.
Сообщество то же - все кто используют ClojureScript на фронте, используют Clojure на бэке.
Библиотеки, не работающие напрямую с платформой, работают и там и там.
Например core.async - библиотека CSP и корутин - работает и там и там. Timbre, specter, instaparse, да практически все либы, которые имеет смысл делать кроссплатформенными - сделаны кроссплатформенными (после того как в 1.7 ввели reader conditionals).
С Андроидом ситуация такая:
Dalvik не позволяет использовать classloader в рантайме. А в Clojure всё на этом построено, т.к. исполнение коде в рантайме делается через класслоадер.
Поэтому для Android приходится делать AOT компиляцию и отказываться от исполнения кода в рантайме.
На других JVM таких проблем нет.
>Сообщество то же - все кто используют ClojureScript на фронте, используют Clojure на бэке.
Судя по проектам на гитхабе, пишут только на кложескрипте, видимо на серверную сторону выбирают что-то полегче jvm.
>Библиотеки, не работающие напрямую с платформой
Таких не бывает.
>Например core.async
Насколько я помню, там код продублирован отдельно для кложескрипта и отдельно для кложуры.
>>740388
Ну ок. А существующие объекты после обновления класса используют новую или старую версию?
> Судя по проектам на гитхабе, пишут только на кложескрипте, видимо на серверную сторону выбирают что-то полегче jvm.
Из чего ты деалешь такие выводы? Не знаю ни один проект, где так делают.
> Таких не бывает.
Смотри список выше.
> Насколько я помню, там код продублирован отдельно для кложескрипта и отдельно для кложуры.
Да, действительно. Но там дело в том, что она вышла во времена 1.6, а переписывать они не стали.
Посмотри остальные популярные либы, там всё через *.cljc
[code lang=lisp]
(:import java.lang.StringBuilder
[java.io File BufferedReader BufferedWriter InputStream
Writer InputStreamReader IOException])
(defn read-response [^BufferedReader in]
(let [sb (StringBuilder.)]
(loop [sb sb c (.read in)]
(cond
(= c 1) (let [ret (str sb)]
(print ret)
(recur (StringBuilder.) (.read in)))
(= c 0) (str sb)
:else (do
(.append sb (char c))
(recur sb (.read in)))))))
[/code]
Разве могут быть в __таком__ языке библиотеки, на работающие с платформой. И ты ещё что-то про бóльшую продуманность говорил.
> Ну ок. А существующие объекты после обновления класса используют новую или старую версию?
Там не сам класс меняется, а используется фича исполнения кода при загрузке класса.
Динамичность достигается через varы, которые можно свапать (с определённой семантикой).
Список выше.
Это ты у рича хикки спроси, почему он повсеместно использует подобную дрисню вместо того, чтобы один раз сделать нормальную обертку.
>>740427
>Из чего ты деалешь такие выводы?
Я как-то искал хоть какие-нибудь проекты на кложуре. И это оказалось не так-то просто, везде один лишь кложескрипт.
>>740433
А, понял. Ну а с объектной системой как? Допустим, написал я в кложе класс, создал несколько объектов, а потом класс изменил.
> Это ты у рича хикки спроси, почему он повсеместно использует подобную дрисню вместо того, чтобы один раз сделать нормальную обертку.
Обёртка есть c версии 1.0, называется slurp: https://clojuredocs.org/clojure.core/slurp
Кусок кода с BufferedReader выложен на сайте чтобы проиллюстрировать интероп с JVM.
> Я как-то искал хоть какие-нибудь проекты на кложуре. И это оказалось не так-то просто, везде один лишь кложескрипт.
Просто странная привычка выкладывать искходники продакшен кода есть только у фронтендчиков. И то, примеров кроме Circle CI я на знаю.
> Допустим, написал я в кложе класс, создал несколько объектов, а потом класс изменил.
Если ты имеешь в виду deftype или defrecord, то их можно менять в рантайме:
"deftype and defrecord dynamically generate compiled bytecode for a named class with a set of given fields, and, optionally, methods for one or more protocols and/or interfaces. They are suitable for dynamic and interactive development, need not be AOT compiled, and can be re-evaluated in the course of a single session."
(http://clojure.org/reference/datatypes#deftype_and_defrecord)
>Кусок кода с BufferedReader выложен на сайте чтобы проиллюстрировать интероп с JVM.
Тот кусок кода взят из реализации кложескрипта с гитхаба.
Но начинаешь щупать, так появляется стойкое ощущение, что тебя обманули.
Нашёл. Это используется в чтении ответа от процесса ноды. В обычной жизни такое пишется нечасто.
Кстати, в каких языках (кроме Эрланга) читать бинарный поток удобнее?
Поделись впечатлениями.
Да там в любой модуль загляни - везде ява-кишки ковыряют.
>Кстати, в каких языках (кроме Эрланга) читать бинарный поток удобнее?
Ну, как-то на общелиспе pbf разбирал. Вроде не так уж и плохо, хотя эрланговским сопоставлением с образцом было бы удобнее, да.
Хотя я так и не понял, почему все так хвалят его за то что он на JVM, а сами JVM не любят и стараются использовать поменьше.
Ну и да, никаких ридер-макросов, код-релоад через жопу, кривое и тормозное STM, нет нормальных примитивных структур данных, нет нормального ООП, макросы говно, мультиметоды - пародия на коммонлисповые, нет сигналов, РЕПЛ ДЛЯ ЕМАКСА ЗАПУСКАЕТ ДВА ЖАВАПРОЦЕССА ПО 600 МЕГАБАЙТ ОПЕРАТИВКИ БЛЯДЬ(у того же SBCL тихо крутится 50мб от силы, и это на 64бит).
ClojureScript хорош(но разве что по сравнению со скалажс и собсно жс)
А еще вокруг Clojure куча тупых хипстеров и хайп, что дичайше бесит.
_мимо лавсан_
рекомендую потыкать CL, разница станет очевидна
кодрелоад в JVM это само по себе анал и боль, но в Clojure это вообще смерть как закостылено. Вроде работает, но не как в CL. Макросы слабее. У них не определена семантика, меньше спецформ(macrolet? symbol macros? Не, не слышали. lexenv в макросах? Похуй, сделаем хоть чо то[тут рекомендуется сравнить с SBCL, есличо]). Мультиметоды рядом даже с CL не стояли. В CL дичайшая система обобщенных функций, которая вся выражается через MOP, и компиляцию в рантайме. Еще там классы крутые, но это отдельная история. Короче после CL - Clojure кажется поделкой на коленке.
Ну и да - кто там говорил про продуманность Clojure выше? Не особо она продуманная, это скорее что-то типа Python - типа, сделаем на глазок, быстренько и красивенько, поднимем хайп, а на остальное похуй. CL же - это результат эволюции нескольких передовых лиспов из 80х плюс комитет умнейших чуваков, заседавший 10 лет.
мимо лавсан
Жалко только что они из этих лиспов кучу легаси притащили. А еще напрягает что в стандартной либе нихуя нужного нету. Впрочем, есть квиклисп. Но хочется чтобы хотя бы как в елиспе было: на каждый чих готовая функция.
ну так а что им было делать
80, куча лиспов, давление вендоров
сейчас стдлиб кажется устаревшим, да, но тогда он был передовым
алсо, рекомендую помогать мне пилить новый стдлиб
https://github.com/Lovesan/CLR/
>это скорее что-то типа Python - типа, сделаем на глазок, быстренько и красивенько, поднимем хайп, а на остальное похуй
Что не так с Питоном?
Зачем создавать новый велосипед? Почему бы не допилить сузествующий (cl21, например)?
Ну и хоть бы планы/цели расписал.
Нет, не меня
cl21 это в осн. синтаксический сахар. А у меня там задатки на норм стдлиб, на функциональность. Слизываю с CLR потихому, но а откуда еще слизывать?
>>740976
работы дохера
>>740960
- Неконсистентность семантики("чойта тут воткунто?" пример - print - функция или встроенное чото? Или там, лямбды)
- Плохая обратная совместимость, конфликт 2 и 3
- Тормоза. Бля, CPython(99% питона в мире) тормозит как пиздеееееец. Бедная gentoo евпоча.
- GIL
- Общая, какая-то, ну не знаю, нейстройность языка. Ну вот нахуя можно использовать окружение как dict? Что за ебаный бред? Это же не скомпилировать, и не оптимизировать нормально. Что за self как явный аргумент, хотя у нас классическое классовое ООП, а не JS, и не смоллтолк? Итд.
- Куча хипстеров, с говнобиблиотеками, которым дай волю, ядро прыщей на питон перепишут.
- Вообще, все это easy(в противоположность simple), типа php, питона итд, оно провоцирует говнокод и непрофессионализм в программировании. А потом мы удивляемся, почему так упали рейты.
- Итд. Спать хочу, забыл апрельские тезисы
два самые крутых проекта, которые я когда-либо делал для опенсорса на CL, это virgil и doors.
На гитхабе есть:
https://github.com/Lovesan
Первый - FFI с подходом полной сериализации в/из сишной памяти. Типа, абсолютно прозрачная работа с сишкой и вообще foreign кодом как с лисповыми объектами.
Doors - интерфейсинг WinAPI, но самая доделанная часть, за которую мне не раз спсб говорили - это интерфейс к COM. Можно в т.ч. и создавать свои COM-сервера(для SBCL и других не умеющих в DLL только out-of-process ессно).
>cl21 это в осн. синтаксический сахар.
Ну не совсем. Там больше реструктуризация, избавление от устаревешего говна, прикручивание всяких александрий.
>Слизываю с CLR потихому, но а откуда еще слизывать?
С дотнета шоле или того забытого проекта или он не clr звался, а как-то похоже обновления общелиспа?
>Бедная gentoo евпоча.
Она бедная из-за libbash, а не только питона.
да, CLR типа дуднет.
Если полезть в мой код, можно наблюдать там прямой пиздинг интеллектуальной собственности
А ClojureCLR использовать не думал? Там интеграция с дотнетом теснее некуда.
А вот хуй знает.[code]
; 728: F7F9 IDIV EAX, ECX
; 72A: C1E002 SHL EAX, 2
; 72D: 85D2 TEST EDX, EDX
; 72F: 7507 JNE L3
[/code]
Судя по сгенерированному коду, (zerop (mod ...)) на месте.
> deleting unreachable code
> --> LET IF AND IF AND THE IF PLUSP >
А, может быть, там подставляется проверка аргументов на неотрицатльность, а затем удаляется, т.к. из их типов ясно, что они положительны.
Почему нет-то? Это ж просто интерпретатор, а не образ лисп-системы как у общелиспа
AI Winter
>Это ж просто интерпретатор, а не образ лисп-системы как у общелиспа
А чем ньюлисп хуже/неполноценнее нормального (того же общелиспа)? Нельзя компилировать код в екзешник или что? Я просто сейчас книжку читаю http://www.fuzzylisp.com/book.html там все примеры на ньюлиспе, возможностей там явно не меньше, чем в каком-нибудь пистоне.
а откуда мысль, что он хуже, он просто другой
но они должны быть круглыми!!111 а этом вся суть нелисп!!
Как будто темку на вордпрессе глянул
У меня "трагедия", я пишу на ruby за денюжку в одной конторе вот уже почти 5 лет. В последний год раби мне с каждым днем становится противен не знаю пока почему. Решил посмотреть в сторону Си, начать сначала так сказать. но нет. Читаю сейчас SICP, делаю упражнения и вы знаете, для меня будто открывается новый мир совершенно иной настолько яркий. Лисп очень крутой язык. Паралелльно посмотрел на clojure. Прочел статью Пола Грэма http://www.nestor.minsk.by/sr/2003/07/30710.html
и тут понеслись у меня мысли. Посоветуйте мне на какой путь встать? Продолжать дальше писать на руби и не рыпаться, пересесть на Лисп? Но какой? Common Lisp? Clojure?
Ну, если найдешь работу, перекатывайся конечно
Почему "или"? Продолжай писать на руби и перекатывайся на common lisp. Если даже не найдешь ему платного применения, то получишь хотя бы полезный опыт.
Однозначно кложура - она сейчас на переднем крае во всех перспективных областях. Достаточно посмотреть на список книжек на любой помойке типа http://it-ebooks.info/tag/clojure/ . Кложуру за несколько лет продвинули в разы дальше, чем коммонлисп за все 160 лет его существования.
А что по-твоему ещё он мог посоветовать негру?
>Однозначно кложура - она сейчас на переднем крае во всех перспективных областях.
Или, если перефразировать, часть вебжавахипстеров, что не осилила скалу, использует кложу. На этом её применение заканчивается.
>Кложуру за несколько лет продвинули в разы дальше, чем коммонлисп за все 160 лет его существования.
Кложу никуда не продвигали, она паразитирует на жвм и лиспах.
>>750771
В общем, не слушай этих жвм-сектантов. Кложа, если сравнивать с общелиспом, довольно дряной язык: ни сигналов, ни нормального ООП, ни эффективных реализаций, и всё это помножается на многочисленные минусы жвм и жавы, которая там изо всех щелей проглядывает >>740428
Аноны, когда будете читать тот пост помните о том, что его пищет 27-летняя нищая пидораха, которого выперли (не взяли) со всех адекватных работ и он разразился соплями в одном из соседних тредов.
А пока пидораха ныл как все плохо, Хик написал еще одну охуительную штуку.
http://clojure.org/about/spec
> она паразитирует на жвм и лиспах.
Ваще-то это лиспы сейчас паразитируют на кложуре. Народ сначала осваивает ее, а потом в редких случаях интересуется подножием эволюционной лестницы :)
> ни сигналов
Зачем они?
> ни нормального ООП
Нормальное там ООП.
> ни эффективных реализаций
Под JVM и JS - какие тебе еще нужны реализации?
> и всё это помножается на многочисленные минусы жвм и жавы
Часть чуда-то как раз в том, что кложура работает на жвм, интероперабельна и хорошо встроена в инфраструктуру.
Наоборот, тащемта.
>>753182
>> ни сигналов
>Зачем они?
В каком смысле? Ты не знаешь, что это такое? Или не понимаешь, как их использовать?
>Под JVM и JS - какие тебе еще нужны реализации?
Эффективные, написал же.
>Часть чуда-то как раз в том, что кложура работает на жвм, интероперабельна и хорошо встроена в инфраструктуру.
Ага, один большой неидиоматичный "плюс" >>740428
Уж если бы я оказался прикованным к жвм, то предпочел бы скалу, котлин, которые намного более гармонично вписываются в жава-мир и у которых хотя бы эффективный код на выходе, или в крайнем случае саму жаву, но никак не этот сплошной недостаток с именем "кложура"
>>753134
Эко ж тебя, успешного кложуриста-первокурсника, порвало.
Спасибо всем за ответы но вы меня еще больше запутали. я сейчас решил почитать The Land of Lisp, а там посмотрю и Common Lisp и Clojure.
Unknown &KEY argument :NAMESTRING
При вызове uiop/pathname:ensure-pathname путь к uiop :NAMESTRING :NATIVE :ENSURE-DIRECRORY T). Как я понял, в вызов не передается путь к либе. А почему, я так и не понимать.
ты либо троллишь либо троллишь.
Tcl задрочен на строках, а в остальном схожесть с лиспом не больше, чем у других языков, на которые повлиял последний. Он не больше лисп, чем JavaScript, например. INB4 "Да я овер 100 тисиэлевых килослоков на коленке за вечер пишу, ко-ко-ко…".
Столман, залогинься.
А что "остальное"-то?
))))))
Я понял!!! Динамические петушки - контрамоты. Они движутся во времени назад. Как было на самом деле: протоцепепе - ЛИСП 50-80 гг. C++ 80-90 гг. Haskell - новая версия цепепе. 90-00 гг. С точки зрения лиспопетушка сначала был Хаскель, в следующей версии он деградировал до цепепе, а в лиспопетушином будущем цепепе деградирует до лиспа.
А я все ломал голову, как человек может так ненавидеть будущее, так привязаться к прошлому, что пишет на лиспе? Но для лиспопетушка-контрамота лисп - это и есть будущее. А дальше ВВ2, индустриальная контрреволюция, религиозные войны, рабовладельческий строй, отрастание хвостов и подъем на деревья. Скай из зе лимит!
>И вообще, какие у ракеты слабые места по сравнению с common lisp/clojure?
Реализация. Ракетчики так не осилили запилить нормальный компилятор.
Вангую, что эти несколько секунд уходят на (require plot).
>~300 мб памяти
Что-то дохуя. Даже для ракеты и даже для его жирноватой ide.
Попробуй сборщик мусора вызвать.
Лисп задрал настолько высокую планку, что ни один из прошлых и нынешних сиплюсплюсов её не достиг.
Наркоман что ли? В лиспе всё есть объект, поэтому считай, что передаешь по указателю.
Окей, ясно. Там просто есть функции, которые конструируют новые объекты, и я затупил на этом примере. Башка не варит что-то.
ЗЫ, а циферки типа уже по значению передаются?
(setf a 1)
(setf b 1)
(eql a b) ->T
Зависит от реализации.
А какие слабые стороны реализации? Если говорить о скорости, то на бенчмарках racket вполне на уровне (среди других схем) - http://ecraven.github.io/r7rs-benchmarks/benchmark.html
В моих кейсах racket тоже оказался самым быстрым(сравнивал с guile и chicken). Расстраивает только потребление памяти и долгая загрузка библиотек.
То есть главный недостаток racket - низкая производительность?
>>759222
>(require plot)
А почему он так долго его загружает? Он его с нуля компилирует что-ли?
А haskell?
Или лучше вкатываться в кложуру?
В реализациях лиспа используются тегированные указатели, а числа, буквы в них упаковываются.
Так и ищут по удаленке, потому что на нормальных условиях такая работа стоит в 2 раза больше.
Решил снова за нее взяться.
Сегодня ночью впилил нормальные обобщенные словари как в дуднете, и синтаксис для них как в Clojure (типа {:a 1 :b 2})
https://github.com/Lovesan/CLR
Пока реализация есть только для SBCL. А треды и тредпулы только под винду. Потому что я ебал линукс в рот пока не закончу основную реализацию.
мимолавсан
Так, напиздел. Для SBCL-Linux треды и тред-пулы тоже работают. А вот IO первым делом будет под винду.
мимолавсан
>и синтаксис для них как в Clojure (типа {:a 1 :b 2})
Фууу, разные скобочки. Чем тебя вариант типа #h(:a 1 :b 2) не устроил?
хз, привычнее ля кложуреблядков, которых есть замысел переманить после дописывания
А зачем ты ffi велосипедишь? Не целесообразнее ли взять cffi, которая де-факто стандарт?
Как сферический язык в вакууме cl заруливает.
Как инструмент для решения проблем рулит и педалит кложура
блджад, если сделают эффективную реализацию и начнут пиарить, Racket может взлететь, мне кажется
Chez Scheme неплохая. Только у нее в поставке даже srfi нет
ни один уважающий себя современный разработчик не выберет язык с мутабельными типами данных и отсутствием нормальных конкарренси примитивов.
Толсто
ни один уважающий себя современный разработчик не выберет язык без зависимых типов. А тем более жаву да ещё и с покореженным синтаксисом.
Это будет библиотека абсолютно без внешних зависимостей
Маня, синтаксис в Common Lisp это вопрос решаемый не приходя в сознание
Если бы ты смотрел мой доклад на ITGM, где я из CL сделал сначала JS, а потом PHP, понял бы что к чем
мимолавсан
> мимолавсан
кто такой, чем знаменит?
Поборник лиспа и мелкософта из /c/. Вел охуительный блог http://juick.com/lovesan/ где знатно доставлял, поливая всех и вся говном. Особенно не любит швабодную ос и пиздолизов. Читать в первую очередь теги долбоебы, прыщи, *Haskell (его тоже в основном говном поливает). Не взяли в джетбрейнс. В свободное время пишет биндинги на коммон лиспе. Верит, что метапрограммирование спасет мир.
может он уже дропнулся? новых записей ни в жж, ни в жуйке, ни на лоре с 2015.
он же был какой-то пиздастрадалец омежка и заливался от этого огненой водой.
ага, 5 коммитов вчера, из запоя что-ли вышел?
Пропил мозги нахуй.
Вообще печально что архимаг забросил, тот реально лиспкун, и его вклад в рашнлиспкомьюнити на уровне ксача.
У CL раздельные пространства имен для функций, переменных, пакетов и т.д., а у схемы одно на всё.
А почему через лямбду можно? Если смотреть в топ-левеле, то лямбда вроде возвращает то же.
((lambda (x) ( x x)) 4) <--работает
((symbol-function ') 4 4) <--нет
В symbol-function подаётся '*
Типа, логика в том, что больше неймспейсов -> меньше коллизий -> гигиена нинужна?
тут крушал поинт именно в том, что функции(которые обычно глобальные) в отдельном неймспейсе, да
Я имел в виду что, в кложе имен функций и переменных находятся в обном пространстве, как и должно быть в функциональном языке
А мне грустно
Ему gc самому было лень делать?
parenscript
jscl жи есть
У островных полубогов код точно такой же, но рабочий:
http://wat-aro.hatenablog.com/entry/2015/10/08/061911
[code]
(define (frac i)
(if (__<__ i k)[/code]
[code]
(define (recur i)
(if (__=__ i k)[/code]
>Должно быть =, а у тебя <
Я спрашиваю про реализацию cont-frac-iter в моем коде на идеоне. У меня там =.
А, вижу. Ты с именем там обосрался. У тебя frac-iter, а должно быть просто iter.
Воспользуйся рэкетом, там подобные ошибки сразу выявляются.
Оно и не должно: (lambda (i) 1.0)
Потому что даже их осилить не могут или пишут в блогах про "смотрите, какая хуйня случилась в этом фреймворке, и вот как я с ней справился".
Что там осиливать? Задачи рассчитаны на первокурсников.
Уж не с политача ли ты залётный? Не понимаю, что за тенденция такая выставлять себя хуже в сравнении с какой-то другой нацией.
>что за тенденция такая выставлять себя хуже в сравнении с какой-то другой нацией
А чем мы лучше? По технологиям мы сосем, наши бабы известны на весь мир как отъявленные шлюхи. Нет ничего проще, чем снять Наташку и купить русского быдлокодера для аутсорса.
ясно
Однако сильная штука, эта ваша пропаганда. Что ж такое человеку-то нужно сказать, чтоб он сам себя ненавидеть начал.
Он не себя ненавидит, а считает что вокруг него одни говноеды, а он сам рыцарь на белом коне, просто ему видите-ли не повезло родится в этом болоте.
В список диалектов AutoLISP добавьте (скриптовый язык AutoCAD), до Clojure это был самый популярный лисп.
Сам и добавь. Шапка в титанпаде
Кложурогоспода, как мне запилить структуру с состоянием? Прочитал про type, но вот не пойму как в нем хранить внутреннее состояние.
Допустим, мне нужно хранить состояние подключения во внутреннем поле типа Database. Я объявляю тип как
(deftype Database [url] (connect [db] ...) (disconnect [db]))
Экземпяр Connection мне нужно хранить в приватном поле, и создавать его при вызове метода connect, а если я укажу его в квадратных скобках при объявлении типа, то он будет публичным. Тащемта может дело в том, что я думаю объектно-ориентированно, но вот для этой задачи ооп на мой взгляд луше всехо подходит, ибо экземпляров Database нужно несколько, и у каждого из них будет свое состояние.
а почему тебе не завести атом для состояния подключения и написать для него функции-обработчики?
А зачем тебе изменяемое поле для соединения?
(connect {:host host :port port :database db ...}) => {:connection conn :conn-info {:host ...}}
И то я сомневаюсь, что эта информация не продублирована в самом объекте соединения.
>А зачем тебе изменяемое поле для соединения?
Идея в том, чтобы те кто работают с Database не пользовались даже connect. Я хочу при обращении к методу read-data проверять наличие соединения, и если оно есть то реюзать, а если нету то устанавливать новое с помощью connect. Вот, и вопрос в том где хранить это состояние. Database должен сам менеджить свое внутреннее состояние, а те кто обращаются к read-data могут.
Сейчас я вижу только один выход: при образении е методам Database ему еще должен передавать хешмап, в который он будет складывать свое состояние, и так при вызове каждого метода. Если так и нужно поступать в данном случае то ок, но вообще я искал решения похожего на классическое ооп с его инкапсуляциями.
потому что само по себе подключение это особенность реализации Database. Database реализует протокол Readable в моем поделии, а кроме него есть еще TextFile, который тоже реализует Readable, но у него нет connection внутри, ему даже и хранить своего состояние не нужно.
https://ideone.com/DZZxwq
Попробовал в репле:
user=> (defprotocol IEditName
#_=> (get-name [this])
#_=> (set-name! [this val]))
IEditName
user=> (deftype PersonName [^:volatile-mutable lname]
#_=> IEditName
#_=> (get-name [this] (. this lname))
#_=> (set-name! [this val] (set! lname val)))
user.PersonName
user=> (def pname (PersonName. "hoge"))
#'user/pname
user=> (def pname (PersonName.))
CompilerException java.lang.IllegalArgumentException: No matching ctor found for class user.PersonName, compiling:(/tmp/form-init3993095858741703866.clj:1:12)
Меня бы устроил этот вариант решения проблемы, я бы хранил внутреннее состояние Database в volatile-mutable, но вот теперь в конструктор нужно передавать все параметры, как-то это напрягает.
Ниже я в репле воспроизвел то, о чем говорил ранее:
user=> (defprotocol Readable1 (connect [this state]) (read-data [this state]))
Readable1
user=> (deftype Database [url] Readable1
(connect [this state] (assoc state :connection "Fake connection"))
(read-data [this state] (if (state :connection) "Lorem ipsum dolor" "ERROR")))
user.Database
user=> (deftype TextFile [name] Readable1 (connect [this state] nil) (read-data [this state] "File content"))
user.TextFile
user=> (def db (Database. "jdbc://blablalba"))
#'user/db
user=> (read-data db {})
"ERROR"
В этом решении состояние Database мне приходится таскать с собой, а для TextFile мне это состояние как корове пятая нога. Вот два варианта решения я придумал, но что-то мне подсказывает что оба они неправильные, поэтому прошу помощи здесь.
Попробовал в репле:
user=> (defprotocol IEditName
#_=> (get-name [this])
#_=> (set-name! [this val]))
IEditName
user=> (deftype PersonName [^:volatile-mutable lname]
#_=> IEditName
#_=> (get-name [this] (. this lname))
#_=> (set-name! [this val] (set! lname val)))
user.PersonName
user=> (def pname (PersonName. "hoge"))
#'user/pname
user=> (def pname (PersonName.))
CompilerException java.lang.IllegalArgumentException: No matching ctor found for class user.PersonName, compiling:(/tmp/form-init3993095858741703866.clj:1:12)
Меня бы устроил этот вариант решения проблемы, я бы хранил внутреннее состояние Database в volatile-mutable, но вот теперь в конструктор нужно передавать все параметры, как-то это напрягает.
Ниже я в репле воспроизвел то, о чем говорил ранее:
user=> (defprotocol Readable1 (connect [this state]) (read-data [this state]))
Readable1
user=> (deftype Database [url] Readable1
(connect [this state] (assoc state :connection "Fake connection"))
(read-data [this state] (if (state :connection) "Lorem ipsum dolor" "ERROR")))
user.Database
user=> (deftype TextFile [name] Readable1 (connect [this state] nil) (read-data [this state] "File content"))
user.TextFile
user=> (def db (Database. "jdbc://blablalba"))
#'user/db
user=> (read-data db {})
"ERROR"
В этом решении состояние Database мне приходится таскать с собой, а для TextFile мне это состояние как корове пятая нога. Вот два варианта решения я придумал, но что-то мне подсказывает что оба они неправильные, поэтому прошу помощи здесь.
На данный момент вывод моей программы такой:
10
625
5
#<procedure:...SICP/1.43/ex.scm:27:8>
#<procedure:...SICP/1.43/ex.scm:10:8>
Почему-то вместо значения выводится <procedure...
https://ideone.com/GXmoZS
А на идеоне это вообще не работает.
>А на идеоне это вообще не работает
С этим я разобрался. Это из-за #!
https://ideone.com/GXmoZS
Храни соединение в динамической переменной.
read-data будет её проверять и, если она не забинжена, будет устанавливать соединение.
>Почему-то вместо значения выводится <procedure...
Ну подскажите, блеадь, что я делаю не так, когда разворачиваю рекурсию в последовательность применения функций.
Вот: https://ideone.com/GXmoZS
Хочу проверить, правильно ли я понимаю, как выполняется repeated, и убедиться в этом, вычислив значения развернутых выражений.
В ракете выводится. И то, что не выводится вообще ничего - не то, что я хочу.
В твоем коде ничего кроме двух чисел в stdout не должно выводиться.
Да. Таким образом я хочу смоделировать вызов ((repeated inc 5) 0) на каждом этапе рекурсии. Чтобы убедиться в том, что я делаю это правильно, получившуюся функцию я хочу применить к тому же значению, к которому применяется ((repeated inc 5) 0) - к нулю.
А, не посмотрел, что там нету newline, и все три результата выводятся на одной строке.
Вариантов два
- Покупаешь LispWorks, используешь CAPI.
- Ищешь биндинги для библиотек тулкитов, пердолишься с ними.
Есть ещё третий стул — McCLIM. Но у него только из стабильных бекендов только CLX.
>>781765
К тому списку нужно добавить qtools-ui. На данный момент он, пожалуй, самый пригодный для использования, но у него один большой минус — smoke. Автор вроде собирается избавиться от этого говна и запилить нормальные биндинги
Целочисленная операция / примененная к 1 и 10 дает 0.
Floating point numbers нельзя сравнивать на равенство.
>McCLIM
CAPI от него и пошел. И недалеко ушел (это комплимент).
CLIM сейчас активно пытаются допиливать и перепиливать.
Потому что одно число рациональное другое дробное?
>Тебе про (/ 1 10) говорят
(= (/ 1 10) 0)
NIL
>ты даже не понимаешь
Очевидно, что не понимаю - иначе и не спрашивал бы.
Что с вами не так то?
На Shen можно. И даже больше.
Параметризируемые шоле? Можно. Даже встроенные есть: integer &optional min max, cons &optional car cdr, simple-array type length и т.д
http://ideone.com/O9vxO3
http://stackoverflow.com/questions/32889606/equality-check-with-fractions-in-common-lisp
Огромное спасибо!
Сам не пользовался, но что-то слышал про mgl или clml. Пощупай их.
Это копия, сохраненная 23 июля 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.