Лисп - семейство языков программирования. Характерные особенности лиспов: динамичность, гомоиконность (код как данные), программируемость.
Основные диалекты — 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 сильно отразилась на дизайне языка, что многим не нравится. — Emacs Lisp - его область применения ограничивается емаксом. Является наследником ТОГО САМОГО MacLisp'а. — Tcl - скриптовый язык, оче удобен для написания скриптиков с окошками или edsl — 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 + Emacs + SLIME - самый лучший вариант. + vim + SLIMV + LispWorks + AllegroCL IDE упаси боже + Eclipse + cusp + <Что-нибудь для сублайма/атома уже запилили, наверное?>
>>593208 >Где-то есть подробнее про него, чтоб разжевано? На официальном сайте? >Везде пишут, что лучше использовать Clack вместо Hunchentoot. Hunchentoot - веб-сервер, а clack - слой абстракций над ними.
>>593208 >И еще как сделать emacs тёмным, меня эта белая тема уже доебала просто. Тему поменяй. Если не умеешь в настройку емакса, то лучше возьми spacemacs. >>593214 >Что еще кроме кложуры компилится в жс? jscl, parenscript
>>593218 Да там же старьё одно. Половину проектов, если не больше, уже забросили. >>593214 >Вот нашел интересную штуку: http://lispyscript.com/ Тот же js, только со скобками и парой перделок.
>>593649 Наоборот. На код из стандартной библиотеки переходит без проблем. Но вот перейти в мою функцию, которую я заэвалил через C-c С-с, не может, выдает ошибку.
Парни, а вы понимаете что лисп просто пиздец как крут? Вот смарите, есть классификаторы результат треньки нейросети https://github.com/Itseez/opencv/blob/master/data/haarcascades/haarcascade_eye.xml да? Где он у них? Лежит отдельно! А лиспобоги могут сохранить СОСТОЯНИЕ, закрыть консольку/емакс, пойти покушать, потом запустить sbcl и что? Правильно, продолжить тренировку дальше! Вот мне раньше казалось это пиздец каким долбоебизмом, типа вот есть данные, а вот алгоритм, а вот выхлоп, а вот еще что-то. Почему я раньше не понимал эту красоту лиспа?
>>594295 Что значит "полностью"? Снэпшот виртуальной машины? Для JVM есть Terracota, например. Это не свойство языка, и даже не свойство рантайма, это просто инструментарий (не особо понятно зачем нужный, кстати, разве что машины в кластере балансировать)
>>594295 Да, кстати, в Линуксе можно снапшот любого процесса снимать и запускать. Тут основная проблема в переносе открытых файлов, сокетов и прочего, и плюс непонятно что делать, если ты собираешься запускать снапшот на процессоре с другой архитектурой. Гораздо проще делать снапшот пользовательского состояния программы, и по этому состоянию запустить заново. А это можно сделать на любом языке, хоть на вижуал бэйсике. Главное состояние хранить отдельно.
>>594302 В лиспе эта фича вытекает из свойств языка. Усыплять и пробуждать ту же JVM особо смысла не имеет, потому что ты, по сути, просто приостановишь процесс.
>>594321 Ясно-понятно. А что это за свойство языка такое, как называется? И как реализовано восстановление состояния? Стэк восстанавливается? А регистры? Очень интересно послушать.
>>594356 Вот я и говорю - снэпшот виртуальной машины. Это много где есть. И это всего лишь инструментарий, к языку относится косвенно. На JVM вообще много языков, снапшот VM один.
>>594363 А для чего это в других местах? Терракота сделана для балансировки в кластере. А разрабатывать "наживую" проще вынося пользовательские данные в глобальные переменные и подменяя их. Я так и со Спрингом делал через Груви-консоль. Это всё в структуру приложения упирается.
>>594375 >Терракота сделана для балансировки в кластере. Так это совсем другой тип снапшотов с другими целями. Что смолтолк, что лисп потока выполнения в образе не хранит.
>>594381 В общем, разработка что на смолтолке, что на лиспе представляет из себя изменения состояния смолтолк-/лисп-системы. Сохранение образа нужно для фиксации этих изменений. А терракота, как я понял, просто замораживает процессжвм.
>>594398 Ты уже по третьему кругу идёшь. Ну ладно, я за тебя посмотрел, как SBCL делает снапшоты: http://sbcl.org/1.0/manual/Saving-a-Core-Image.html Это не снапшот VM как в Смолтолке, а сохранение состояния на уровне приложения. Стэк не сохраняется. Открытые ресурсы тоже. Устраняюсь от дискуссии.
>>595897 Сначала ругнулся на то что ему нужен opengl3.3, потом начал выдавать ошибку как в одной из issue на гитхабе нерешенной. Проблема висит уже почти пол года, движения нет. Судя по всему ментейнер положил хуй на проект.
В частности, там есть такое: >CompSci 101, курс по структурам данных, и когда сталкиваются с работой с указателями
>Другим сложным для многих студентов был курс, в котором изучалось функциональное программирование, в том числе рекурсивное программирование. В Массачусетском Технологическом Институте была очень высоко поставлена планка по этим курсам, разработан обязательный курс (6.001) и учебник ( Абельсон и Сассман, Структуры и Интерпретация Компьютерных Программ
Если вторую книгу (сисп) можно найти в инете, то о чем идет речь в первом? Современный курс CompSci_101 на сайте его универа вообще не о том. Какую книгу посоветуешь для изучения темы указателей? Спасибо.
> Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Глава 11. Хеш-таблицы. // Алгоритмы: построение и анализ = Introduction to Algorithms / Под ред. И. В. Красикова. — 2-е изд. — М.: Вильямс, 2005. — 1296 с. — ISBN 5-8459-0857-4.
Начал учить это ваше программирование через SICP и буквально на первом же упражнении обосрался.
> Упражнение 1.3 > Определите процедуру, которая принимает в качестве аргументов три числа и возвращает сумму квадратов двух больших из них.
Я в математике не ебу вообще, и как правильно найти два наибольших числа не знаю. Так что как допер, так и сделал: типа нужно найти наименьшее число, тогда два остальных будут наибольшими.
[CODE](define (ex1-3 x y z) ; определение процедуры ex1-3 с аргументами x, y и z (cond ((and (< x y) (< x z)) (+ ( y y) ( z z))) ; если x - наименьшее число, то y и z - наибольшие ((and (< y x) (< y z)) (+ ( x x) ( z z))) ; если y - наименьшее число, то x и z - наибольшие ((and (< z x) (< z y)) (+ ( x x) ( y y))))) ; если z - наименьшее число, то x и y - наибольшие[/CODE]
Вроде все должно работать, cond возвращать значение выражения-следствия единственного истинного предиката. А вот хуй! Интерпретатор все время возвращает 17, или что-то такое:
[CODE]1 ]=> ex1-3 3 2 1
;Value 17: #[compound-procedure 17 ex1-3]
1 ]=> ;Value: 3
1 ]=> ;Value: 2
1 ]=> ;Value: 1[/CODE]
Что делать-то? Я не понимаю где тут ошибка. Может cond работает как-то по другому? хз блять
>>597069 Чтобы осилить программирование, ты должен быть способен доказать, объединение и пересечение алгебраических множеств есть алгебраическое множество. Алсо, должен уметь на пальцах объяснить, что такое топология Зарисского.
>>597073 >При чем тут топология вообще, наркоман? Просто если ты не можешь осилить такую элементарную вещь как топология, то и в кодинге ты дальше макаки не продвинешься.
>>597094 Не стал бы отвечать на резюме петушков, которые не могут вычислить идеал аффинного многообразия и объяснить, чем нильпотенты отличаются от порядка элемента.
>>600899 А если серьёзно? На что можно рассчитывать если хорошо его изучу? Разные диалекты и библиотеки? Можно найти работу? И что на ней нужно будет делать?
>>600901 >его изучу? Что «его», кого его-то, ёпта, кого «его»? Здесь восемь разных языков, блядь, семейство одно, а языки разные, ёпта. > На что можно рассчитывать если хорошо его изучу? На свои знания.
Смотрите. Мне в Схеме надо преобразовать строчную запись числа в обычное число, т.е. функция получает на входе "1488" и выдает просто числом. Как я понял, без стринг-листа не обойтись, только он выдает (#\1 #\4 #\8 #\8). Как, собственно, лучше всего избавиться от этих решеточек и слэшев?
>>601499 >Что вы на них пишите? Что за тупой вопрос? То же, что спросить: "А что на C/C++ пишут?" Кто-то игры, кто-то сайты, кто-то естественными языками занимается, кто-то числодробилки пилит, кто-то скриптоту для автоматизации повседневщины, кто-то обработкой изображений и т.д.
Лисп - это чтобы угарно проёбывать свободное время, пока учишься в школе/инстике и сидишь на шее у родаков, и потом вспоминать с улыбкой, и не жалеть, даже осознавая, насколько это ненужно и бессмысленно.
>>601508 Рассуждать об абстрактном лиспе не имеет смысла, потому как разница между диалектами довольно ощутимая. Это то же, что рассуждать сразу о всех языках с си-подобным синтаксисом. Характерными же для всех диалектов особенностями можно назвать макросы (с сишными не имеют ничего общего) и полную динамичность (горячая замена кода, обновление определений классов и т.д.), из которой вытекает и интерактивно-итеративный метод разработки.
Что такое мокролиты? Что такое пандорические макросы и динамический ветер? Где прочитать про все это говно? Почему все это не гуглится даже на английском?
>>601546 Плодить синтаксические абстракции - это то, что психологи называют "representational overactivity". Для одной и той же функции/алгоритма/етц можно придумать очень много всяких нескучных синтаксисов её вызова/использоция, но продуктивность это не повышает, а скорее наоборот. Ведь кроме того, что делает функция, теперь надо знать ещё и новый специальный синтаксис вызова. Как делают прикладные математики - сводят всё к числам и матрицам, чтобы потом использовать все давно готовые инструменты для работы с ними Как делают прикладные программисты - сводят всё к переменным, циклам, объектам, функциям/методам, чтобы использовать готовые инструменты для работы с ними Как делают теоретические математики, логики, лисперы, хаскелисты - даже давно известное и понятное сводят к новопридуманным концепциям, логикам, языкам, синтаксисам, для которых нихуя ничего нет, для которых надо пересоздать с нуля мир, которые надо дополнительно выучить и проникнуться феласофией и тд
>>601588 А плодить бойлерплэйты - это как психологи называют? А использовать xml в качестве DSL? А превращать лаконично определенный алгоритм в развесистый семантический шум, в котором без поллитры не разберешь? Это как называется?
Я не говорю, что нужно плодить синтаксические расширения на каждый чих (плодить сущностей без надобности в любой парадигме вредно), но и категорически отрицать их полезность тоже глупо.
>Ведь кроме того, что делает функция, теперь надо знать ещё и новый специальный синтаксис вызова. Для использования любой сущности, в том числе и макросов, нужно изучить её интерфейс. И нет, это не так сложно, как тебе с дивана представляется. Особенно если сравнивать с java-стайл ООП.
>Как делают теоретические математики, логики, лисперы, хаскелисты - даже давно известное и понятное сводят к новопридуманным концепциям, логикам, языкам, синтаксисам, для которых нихуя ничего нет, для которых надо пересоздать с нуля мир, которые надо дополнительно выучить и проникнуться феласофией и тд Ты сейчас говоришьворчишь как SENIOR PHP DEVELOPER 20 YEARS EXPERIENCE: "Ишь понавыдумывали! 20 лет писал без всяких ваших этих самых, и вы тут устроили это самое... психологи ещё это representational overactivity называют".
>>601619 Нет, я это говорю как человек, слегка разочаровавшийся в том, что профит от этого всего строго отрицательный. Если не плодить на каждый чих - то зачем тогда лисп, синтаксис которого оптимизирован для этого? Оптимизировать нужно под НАИБОЛЕЕ частоиспользуемые сценарии. А не плодить на каждый чих - это придумать одну джаву, html, css, json, и успокоиться. Тебя походу выебали в детстве какими-нибудь JavaEE, но современные спринги, либы на аннотациях типа refit, библиотечки на флюент-апи, и так далее - это и есть хорошо сбалансированные легковесные абстракции без хуйни, без размножения несовместимого ни с чем синтаксиса и так далее.
>>601639 >я это говорю как человек, слегка разочаровавшийся в том, что профит от этого всего строго отрицательный Ох. Ну давай, поделись своим опытом. Судя по >без размножения несовместимого ни с чем синтаксиса и так далее ты плохо представляешь то, о чем рассуждаешь.
>о современные спринги, либы на аннотациях типа refit, библиотечки на флюент-апи, и так далее Это вообще пушка! Даже комментировать не хочу. Тебя походу выебали в детстве какими-нибудь JavaEE.
>>601619 >А плодить бойлерплэйты - это как психологи называют? А это то же самое. Разные виды программистов страдают этим по-разному. Глупо думать, что язык от этого защищает.
>>601650 Многие языки, из-за весьма ограниченной гибкости, вынуждают из раза в раз повторять один и тот же код. Как, например, ассемблер заставляет каждый раз писать служебный код для эмуляции абстракции "процедура".
>>601649 Блять, ну что тебе объяснять. У меня LOL и AMOP в бумажном виде есть ещё с универа. Я макроискпандил секспры с мокролитами в /c/ ещё когда ты под стол ходил. Хули я тебе буду расписывать, про все свои лиспопознания? По конкретным темам типа iterate/loop/reducers/transducers я сто раз уже писал на этих обоссаных анонимных парашах. И я ответственно заявляю, что всё это нахуй не надо. Это не бесполезно, а вредно блять. Строго вредно и контрпродуктивно.
>>601664 "Дороже" по трудозатратам только в кратковременной перспективе. В долгосрочной же поддержка бойлерплэйтов выходит в разы дороже. Но интерпрайзу именно это и нужно. >>601660 А я сразу и понял, что это ты. Все твои кококо-аргументы всегда плавно циркулируют между ВРЕДНА И НИНУЖНА, ОЙ НУ ТАМ НОВЫЙ СИНТАКСИС, ЕГО Ж ТРУДНА ИЗУЧИТЬ и ВОТ В ЖС ИЛИ ЖАВЕ АБСТРАКЦИИ ХАРОШИЕ, А ТУТ ПЛАХИЕ. >Хули я тебе буду расписывать, про все свои лиспопознания? Да забей, я и так знаю, что тебе сказать нечего.
>>601678 > Да забей, я и так знаю, что тебе сказать нечего. Ну ты меня по сути попросил доказать, что на лиспе невозможно написать что-то лучше чем на других языках. Гораздо проще привести хоть один пример чего-то такого и доказать этим, что я не прав. Так что предлагаю привести пример какого-то полезного прикладного лиспо-dsl, а я попробую доказать, что быдлоязыках то же самое делается лучше и дешевле.
>>601681 В спрингах там всяких тоже всё на аннотациях сейчас, никто давно не ебёт xml. При этом нет никакого необычного синтаксиса со специальными правилами. Аннотации - это просто прицеплённые метаданные, которые обрабатываются потом через рефлексию и тд. Аналогично для подобного метапрограммирования на json'е в жаваскрипте. Решения в таком духе и в плане юзабилити, и в плане разработки легковеснее синтаксических макросов.
>>601686 >никто давно не ебёт xml Не прошло и двадцати лет. Или уже прошло? > При этом нет никакого необычного синтаксиса со специальными правилами. > Аннотации Это и есть специальный синтаксис. Вся разница только в том, что в яве его захардкодили, а в лиспе это библиотека. Кроме того, строки в аннотациях тоже имеют "специальный синтаксис или структуру, которые нужно изучать". >Аналогично для подобного метапрограммирования на json'е в жаваскрипте. Ага. Я видел. Они там пытаются сделать то же, что в лиспе, но через жопу, еваля строки или обвешивая жсон нечитабельной лапшой калбеков. Алсо, структура жсона - это тоже что-то уровня "специального синтаксиса, который нужно изучать". >Решения в таком духе и в плане юзабилити, и в плане разработки легковеснее синтаксических макросов. Где не нужны хитрые абстракции, там их вменяемый программист не использует. А долбоеб - он и в ПХП, и яве, и в хаскеле, и в лиспе долбоеб. Это уже не языка проблема.
>>601738 В типикал лисподиеселе у тебя будет и специальный синтаксис типа defapi, defapicall и тд, и внутри ещё специальный синтаксис для роута. В аннотации только второй. Аналогично со всем остальным. Содержательная предметная информация - это минимально необходимое, незачем делать больше. На лиспе же чаще всего до реальных задач вообще не доходят и застряют где-то на этапе дизайна своих правильных лямбд или циклов. Ждём примеров, где реально нужны хитрые абстракции, а умные лисперы оказались не долбоёбы и хорошо решили задачу, получше чем на яве или жс.
>>601744 PEG, например, и прочие парсеры. В жс в таких случаях строки евалят, а в жабе интерпретатор или кодогенератор с нуля пилят. В первом случае страдает эффективность и удобство, во втором большие трудозатраты и малое удобство в использовании (поддержки со стороны ИДЕ нет, нужно изъёбыватся со сборкой и т.д.)
>>601750 > строки евалят Объясни, чем строка как здесь: https://github.com/zaach/jison#usage-from-a-commonjs-module хуже секспра. И в строке два символа оверхеда на открытие и закрытие, и в секспре. И строка и секспр не тайпчекаются. И строку и секпр можно вручную по-всякому провалидировать в коде. > большие трудозатраты Насчёт парсер-генераторов с этим ещё можно согласиться, но так получается по большей части из-за требований к производительности, а потому и генерации хайперфоманс стейт-машин целевого языка. И ещё, задача решена везде. Куда ни глянь - есть свои вариации lex/yacc. > и малое удобство в использовании, поддержки со стороны ИДЕ нет Чем поддержка произвольных секспров, которые разбирает твой макрос, в каком-нибудь slime лучше поддержки строк или жсона в типичном кодоблокнотике? Там же не будет ни комплишенов никаких, ничего. Только если сам плагин запишишь для емакса.
>>601771 >"return 'HEX';" Блядь, ну это вообще пиздец. На сишных макросах и то лучше бы было. >И строку и секпр можно вручную по-всякому провалидировать в коде. Если бы было можно, то запилили бы, а не это говно выкатили как готовую библиотеку. >Чем поддержка произвольных секспров, которые разбирает твой макрос, в каком-нибудь slime лучше поддержки строк или жсона в типичном кодоблокнотике? autodoc, macroexpand, семантическое выравнивание кода.
>>601785 > Если бы было можно, то запилили бы Так там и запилили. Когда делаешь 'parser.generate', у тебя выскочит ошибка, если там где-то неправильный синтаксис. > autodoc, macroexpand, семантическое выравнивание кода Какое ещё семантическое выравнивание? О семантике твоих кастомных секспров внутри вызова макроса емакс ничего не знает. А макроекспанд полезен только для мелких инфраструктурных макросов типа defapi, которые вредные, и которых вообще не должно существовать. Выхлоп парсер-генератора в макроекспанде - это что-то типа чтения ассемблера, который ты не знаешь. Autodoc тебе покажет инфу только для топлевел вызова макроса, для произвольных секспров внутри, которые описывают грамматику, он ничего не покажет. В случае с жс, топлевел вызов - это функция, потому обычный комплишн кодоблокнотиков/ide сработает.
>>601785 > ну это вообще пиздец А как тебе хочется? Ты хоть понимаешь, что можно сделать, например, var token = (name) => "return '" + name + "';"; и будет уже ["[a-f0-9]+", token('HEX')]
>>601797 >Так там и запилили. Они запилили парсер жс? Ну, молодцы. Я им не завидую. >О семантике твоих кастомных секспров внутри вызова макроса емакс ничего не знает. Знает. Даже если внутри верхнего макроса используется macrolet, для внутренних принято делать макросы-пустышки с докстрингом или хотя бы просто аргументами. >Выхлоп парсер-генератора в макроекспанде - это что-то типа чтения ассемблера, который ты не знаешь. Ну вот не надо, а. Хорошо написанный макрос обычно читается без затруднений. В ином случае, достаточно его полностью не раскрывать. >>601802 Да, да. Костыли-костылики. И ты ещё бочку гонишь на лисп, лол.
>>601807 > Они запилили парсер жс? Ну, молодцы. Я им не завидую. Зачем им писать парсер жс? Просто евалишь строку 'function (...) ...' и компилятор сам всё скажет, либо выдаст колобок. > для внутренних принято делать макросы-пустышки с докстрингом или хотя бы просто аргументами. > Да, да. Костыли-костылики. То же самое.
>>601816 >То же самое. И что, дохуя редактор внутри строк-то подсказывает?
В общем, к чему мы пришли? >лисп - гроб, гроб, кладбище, пидор >жс ака лисп для бедных - заебок. Евалим строки, крутим лапшу, делаем весёлые смайлики ;})
>>601827 > И что, дохуя редактор внутри строк-то подсказывает? См. функцию token. Так же, как в лиспе объявляешь вспомогательные макросы для указания метаданных, в жс объявляешь функции. >лисп - гроб, гроб, кладбище, пидор >жс ака лисп для бедных - заебок. Евалим строки, крутим лапшу, делаем весёлые смайлики ;}) Так и есть. Даже такой максимальный кейз как генератор парсеров из грамматик, делается здесь нормально. Может в каких-то мелочах на лиспе чуть лучше, типа что скобочки редактор выравнивает между строками, но это не стоит того, чтобы иметь в языке макросы, а вместо синтаксиса - гомоиконичную парашу, под их использование оптимизированную. Синтаксис жаб и жс оптимизирован под 99.9% нужд, а лиспа - под 0.1% ради того чтоб скобки в макросе выравнивались, ну охуеть. При этом задача нифига не прикладная, потому что генераторы парсеров нужны редко и уже везде давно написаны. На более приземлённых задачах типа дсли для роутинга и тд - всё ещё лучше на стороне жабок и жс.
>>601849 >Даже такой максимальный кейз как генератор парсеров из грамматик >и тот сделать нормально не смогли. Код в строках - это пиздец. И нет этому никакого оправдания. А ведь это далеко не единственный его недостаток. >а вместо синтаксиса У лиспа-то как раз синтаксис нормальный. Уж точно ничуть не хуже ;});});)} >Синтаксис жаб и жс оптимизирован Летчик.жпг Синтаксис? Оптимизирован? Щито? Обычная си-подобщина. >На более приземлённых задачах типа дсли для роутинга и тд - всё ещё лучше на стороне жабок и жс. Чем лучше? Как по мне - то же самое, если не считать, что обработчик приходится писать не на нормальном языке, а на убогой яве.
>>601858 > Код в строках - это пиздец. Я уже спрашивал, чем секспры лучше. Ты так и не ответил. > Уж точно ничуть не хуже ;});});)} Хуже, писанины больше и линейность меньше. А твой пик - это, конечно, лол. Макрос defapp, в котором ничего нет, то есть можно было сделать функцию. Зачем макрос? Но дальше ещё круче: макросы для вью, на которых аннотации для роутов. Посчитай количество лишних сущностей там и здесь:
var app = new App({ "/": (req, res) => res.send("<h1>welcome to lucerne</h1>"), "/greet/:name": (req, res) => res.send("hello {}!".format(req.params.name)) });
>>601887 >Я уже спрашивал Ты спрашивал какую-то хуиту про "" vs (). >чем секспры лучше. AST, выглядит естественно, является синтаксически корректным... Что ты шлангом-то прикидываешься? >Макрос defapp, в котором ничего нет Потому что все параметры дефолтные. Трудно догадаться что ли? >макросы для вью, на которых аннотации для роутов И что тут такого? Аннотация регистрирует маршрут для любой функции. Вью защищает от прямого использования в неподготовленной среде и занимается проверкой и разбором аргументов при необходимости. >Посчитай количество лишних сущностей там и здесь Словарь - раз, какие-то req и res - ещё четыре. А давай лучше в реальном коде посчитаем, а не в этом обезьянничестве на хелловорлд. Хотя нет, считай сам. Меня эта бесполезная полемика порядком заебала. Не понимаю, зачем в неё ввязался, ведь сразу было понятно, что ничего толкового ты не скажешь.
>>601660 >Это не бесполезно, а вредно блять Если это так вредно, то почему практически все языки предают свои парадигмы и заимствуют сущности функциональных яп?
>>601919 > является синтаксически корректным Строка тоже является "синтаксически корректной" с точки зрения внешнего языка, если есть открывающая и закрывающая кавычка, но о синтаксической корректности содержимого в контексте дсл этого ничего не говорит. И с секспрами точно так же. Сбалансированность скобочек ничего не говорит о синтаксической корректности с точки зрения дсля, описываемого макросом (defapp '(1 (2) 3)). > Словарь - раз, какие-то req и res - ещё четыре. Словари - это обычный жс. Req и res - это обычные параметры обычных лямбд, это тоже обычный жс. К чему это стремление плодить новые концептуальные понятия, термины, макросы, когда можно всё представить в виде чисел и матриц и оно только удобнее станет? >>601955 Речь конкретно про синтаксические макросы лиспов, а не про произвольные фичи из ФП-языков.
>>602034 >Лиспаны, поясните почему есть let, а есть let? Немного по-разному функционируют: первый сначала вычисляет все выражения, а потом разом биндит, а второй - вычисляет, биндит, вычисляет, биндит...
Видимо, они нужны, когда порядок вычислений важен: [code lang=common-lisp] (defparameter a 1) (defparameter b 2)
>>602190 Выше пример кода, когда let может быть нужен. Да и если выпиливать, то let*, который легко выражается через let. Почему не выпилили - хуй знает. Даже в минималистичной схеме он есть. Вообще, в общелиспе много старья, которым давным-давно никто не пользуется. Странно, что ты зацепился именно за лет.
>>602226 Читаю Land of Lisp, и когда там начали рассказывать про let я подумал о том, что уже давно не понимаю за каким хуем нужно две формы. Так же как flet и labels. Что мешает оставить только одну форму, переименовав их. let -> let, labels -> flet. Пытаюсь понять есть ли за этим какое-то обоснование (как я писал, может let значительно быстрее?) или это просто очердное говно мамонта.
>>603599 Сука, нахуй ты просишь решить за тебя задачу, блять? Попробуй решить сам, сука, а потом, когда обосрешься, принесешь сюда свой говно код, и у уже тогда анон тебе пояснит, почему конкретно ты дибил. Сука.
>>603642 Да идеи-то есть, пытаюсь реализовать, только вопросов много. Например, вот функция для подсчета чего угодно в строке (не длины самой строки): (define (counter str) (length (string-split str)))
То есть вот, например: >(counter "I love you") 3
>(counter "1488 1337 1024 666") 4
Но мне нужно наложить условие, чтобы оно исключительно слова считало. В Scheme нет предиката word?, вот у меня и ступор немного.
>>603887 А что там писать-то? Сейчас есть спейсмакс, в котором большинство емаксовых проблем решено. Да и документация у него на удивление нормально написана.
>>604072 >Что в спейсмаксе такого, почему на него стоит обратить внимание? 1) Всё уже настроено 2) Удобненько разбито на слои 3) Поддерживается многочисленным сообщество в актуальном состоянии
Читал тут On Lisp. Пол пишет: >It is therefore said that Common Lisp has distinct namespaces for variables and functions. We can have a variable called foo and a function called foo, and they need not be identical. This situation can be confusing, and leads to a certain amount of ugliness in code, but it is something that Common Lisp programmers have to live with.
Поясните за лисп? Для чего его юзают какие-то крупные предприятия и корпорации? Т.е., если я его выучу и пойду на работу, что я на нём буду писать? И насколько он сложный в освоении?
>>605965 Просто я не хочу тратить время впустую, изучать этот лисп, а когда выучу, вдруг осознать, что он уже устарел, и лучше бы я учил какой-нибудь С, Жабу етс. Просто, если я буду учить С# - я смогу писать десктопные приложения по виндой, обж-С для АйОси, РОР и ДЖС для веба, джава для бэк-энда и андроида Ну а Лисп для чего тогда?
>>605978 Разнообраное, блядь. Твой вопрос на уровне "А какое применение у языков с си-подобным синтаксисом, а какую мне за его знание работу дадут.". Вот и что такому долбоебу отвечать? Перечислять все сферы ИТ? Увольте, проще послать нахуй.
У сишки применения понятные: писать загрузчики для операционных систем, драйвера для чайников и прочий эмбед. У лиспа прикладных применений нет, но он нужен чтобы побыть неформалом/маргиналом, угореть по метапрограммированию в чистейшей инкарнации, повыдумывать и попрототипировать метапарадигмы.
>>606007 > писать загрузчики для операционных систем, драйвера для чайников и прочий эмбед. Странно. Тогда почему больше 50% кода на сишке к драйверам и ОС не относятся? Алсо, почему ты не перечислил остальные языки? >У лиспа прикладных применений нет Интересное мнение. Только что это за язык такой - лисп? LISP-1.5, который несколько десятков лет назад сгинул или какой-то другой? Ты уточняй, а то я чужие мысли читать не умеют.
>>606034 У любого. Сommon Lisp, Racket, Clojure. Последний выделяется чуть большим хайпом, и возможно большим количеством хоббистов, но это связано с его относительной новизной и пеаром Рича Хикки. Несмотря на это, всё что на нём пишут - иначе чем баловством или экспериментаторством не назовёшь. Не как что-то плохое, просто надо это понимать, чтобы правильно расставить приоритеты.
>>606050 И что для тебя не "баловство"? >это связано с его относительной новизной Связано с тем, что для ява- и жс-программистов clojure и clojurescript - глоток свежего воздуха. Новизны там никакой нет.
>>606073 Текущая экосистема JavaScript, Java, .NET, Python, Ruby, PHP - не баловство. > Новизны там никакой нет. Я имел в виду, что комонлиспу 30 лет, рэкету 20, а вот кложуре всего лишь 8.
>>606050 > всё что на нём пишут - иначе чем баловством или экспериментаторством не назовёшь гугли на ютубе канал russian clojure - записи хэнгоут конференций, где люди рассказывают где его применяют. Есть чуваки из дс2, кто делает буржуям медицинский софт на кложуре, русскоязычный контрибьютор в кложуру из Канады, из США и Германии люди есть, которые используют в продакшене
>>606007 >>606181 А, так это опять ты? >Кококо на нульче я был крутым лишпером, но потом всё понял. Чувак, если ты несколько лет кукарекал про лисп аки золотце, вместо того, чтобы писать код, а потом разочаровался - так это твои сугубо личные проблемы, не нужно из-за этого хаять язык, опять впадая в крайности и опять прожигая время впустую.
>>606826 Делаю (asdf:load-system :my-yoba-project) а потом уже запускаю что надо. Если проект - небольшая одноразовая хуита, то делаю примерно так же, как ты описал.
>>606927 А что ты ищешь? >проекты на common lisp По-русски что ли? Этак ты в лучшем случае упоминание какого-нибудь проекта только в лиспосраче на лоре найдешь.
>>606933 Не, ну ты же поправил что-то, хочешь посмотреть результат (если это не просто эвал одной функции, конечно). Если видел как работает CEPL, хочу так же белять.
>>606936 А, ты про это. После того, как запустил, начинаю править код. Исправил функцию, C-c C-c, смотришь результат. В некоторых случаях, как при работе с cl-sdl2, например, бывает удобно повесить свой перезапуск (http://www.lispworks.com/documentation/HyperSpec/Body/m_rst_ca.htm#restart-case ), чтобы из-за ошибки не перезапускать заново, а исправить функцию, скомпилить её и продолжить выполнение.
>>606957 Нет, рисовал один из игроков в мою основную игру. >>606961 Сюжет про мальчика (хуйдожник), который сидел на пеньке. "Ну почти" было про ашота.
>>606225 Ну смотри, если сразу в своём баловстве пытаться использовать все фичи лиспа на полную катушку, чтобы всё прощупать и понять, что из этого можно извлечь, приходишь к выводу, что такой максимальный режим - это тупик. Если не использовать настолько сильно и настолько по-максимуму - то оказывается, что всё оставшееся нормально делается более структурированными и легковесными средствами метапрограммирования в мейнстримных языках, при этом не жертвуя синтаксисом/типизацией, инфраструктурой, вакансиями. И это нежертвование даёт огромный общий буст и профит. Кстати, Золотце-то вообще Симту написал, и на ней игру почти релизнул. Тоже кое-что говорит о скобочках, правда? Надо делиться опытом, чтобы люди не проёбывали своё время на тот же путь. Я абсолютно уверен, что никто не извлечёт из фанатичного максималистского лиспоугара СИМФОНИЮ или что-то такое особенное. Люди просто в лучшем случае проебут время, а в худшем - ещё и психику. Но вам же этого и надо, чекашня обоссаная. Вы уже везде, но везде сосёте хуй, причмокивая ;)
>>607184 >пытаться использовать все фичи лиспа на полную катушку То, что ты описал, называется "программистская жадность". Наверное, все молодые программисты через это проходят. Тебе, видимо, повезло, и перенес ты её в особо тяжелой форме, из-за чего проебал не только время, но ещё и психику. Обычно переболевшие просто начинают чувствовать меру, но тебя же, бесконечного максималиста, швырнуло в другую крайность. >Золотце-то вообще Симту написал, и на ней игру почти релизнул Недоязык поверх, ЕМНИП, sbcl и огрызок варкрафта. Даже не знаю, много ли это, мало ли для нескольких лет форумного программиста. По сложности и объему работы там на две курсовые среднего студента 2-3 курса.
>>607228 Ну вот я объяснял выше по треду, что примеров профита метапрограммирования лиспа по сравнению с метапрограммированием жабок и жс нету, даже максимальные случаи вроде PEG-дслей нормально делаются без лиспа. И вообще, вот это всё желание подсадить людей на маргинальные языки, не будучи даже в состоянии объективно аргументировать цель мероприятия, меня очень сильно настораживает. Пока что буду считать, что это нужно чтобы у людей не было выбора в работе, и чтобы их проще было заманивать резко появившимися локально вакансиями в какую-то античеловеческую подпольную гебешную парашу.
>>607289 Тебе заняться больше нечем, воин форумный? >PEG-дслей нормально делаются без лиспа Да ради бога. Если евалить строки для тебя лучше, то еваль на здоровье. Тут-то ты кого и в чем убедить хочешь? Раз уж ты такой самоотверженный фанатик, то переместись в более подходящее для твоих рвений место. Например, в JS/Java-треды. Там с тебя пользы больше будет.
>>607452 You may also develop your own general-purpose engines, tools, tests, and boilerplate before the Jam begins. That way you can "hit the ground running" and have your basic code ready. The point is to design and code the gameplay during the Jam; there is no harm in preparing and testing out your general framework in advance.
Лучше объясните, почему я не могу сделать apply на макрос: (defmacro markup-img (src &rest args) `(markup (:img :src ,(concatenate 'string images-path src) ,@args)))
>>607610 >Выглядит мерзковато. Чому? Тот же cl-markup, но без постоянных оборачиваний в (markup ...). Алсо, он пригоден не только для html, а для любого xml с dtd-спецификацией. >djula Или https://github.com/archimag/cl-closure-template
>>607638 Потому что я хочу (:a :href "fuck" (:img :src "yeah")) А не (<:a :href "fuck" (<:img :src "yeah")) Которое не особо отличается от <a href="fuck"><img src="yeah">
>>607689 [code lang=lisp] ;; If non nil line numbers are turned on in all `prog-mode' and `text-mode' ;; derivatives. If set to `relative', also turns on relative line numbers. ;; (default nil) dotspacemacs-line-numbers nil [/code]
>>607789 За что глаз зацепился: >(apply #'clack:clackup (cons app args)) Можно писать (apply #'clack:clackup app args) >(slot-value product 'id) А чего ты ридеры/аксесоры не используешь? >(find-if (lambda (product) (eq (slot-value product 'id) id)) products) (find id products :key #'product-id) >(prompt-read "shop> ") Но зачем? Просто поднимаешь swank, а при необходимости коннектишься и делаешь то, что нужно: останавливаешь, перезапускаешь, фиксишь код и т.д. >build.sh roswell же ( https://github.com/snmsts/roswell ) Или, если не нравится, то cl-launch или buildapp
>>607817 >Можно писать (apply #'clack:clackup app args) Мерси, поправил. >А чего ты ридеры/аксесоры не используешь? Не освоился еще. А можно как-то менее геморойно это все генерить? >(find id products :key #'product-id) Каждый раз забываю про :key. Поправил >Но зачем? Просто поднимаешь swank, а при необходимости коннектишься и делаешь то, что нужно: останавливаешь, перезапускаешь, фиксишь код и т.д. Пытался собрать статический бинарник для хостинга, но не взлетело. Так-то я через slime пилю. >roswell же ( https://github.com/snmsts/roswell ) Посмотрю, когда до готовности доведу.
>>607829 Алсо сейчас мне приходится евалить весь файл (C-c C-k) и потом делать C-c C-e (restart), чтобы перезапустить сервер. Можно все это свести до С-с С-С нужной функции?
>>607829 >А можно как-то менее геморойно это все генерить? Ну, писать :accessor product-id не так уж и геморно, если сравнивать с другими языками. Но можно и макрос сделать, который будет генерировать аксесоры вида <class-name>-<slot-name>. Или через MOP попердолиться. Только сомневаюсь, что это целесообразно. >>607830 Они там какой-то стартуп пилят. Видел не так давно вакансию, где они лиспопрограммистов искали.
>>607832 >мне приходится евалить весь файл Зачем? Функцию просто перекомпиливаешь и всё. Или нингл не умеет обработчики маршрутов обновлять без перезапуска?
>>607835 Ну функцию/файл не столь важно. Кнопок жать одинаково, проще сразу файл компильнуть. Но вот сервер приходится перезапускать. Хочу как CEPL, заевалил функцию и оно тут же применилось.
>>607838 >Ну функцию/файл не столь важно. Медленнее. Состояние можно проебать, если оно где-то в топлевеле меняется. Ну или просто бывает код недописанный. >Но вот сервер приходится перезапускать. Зачем? Сомневаюсь, что это необходимо.
>>607840 >Зачем? Сомневаюсь, что это необходимо. И вправду, перезапускать не надо. >Медленнее. Состояние можно проебать, если оно где-то в топлевеле меняется. Ну или просто бывает код недописанный. А вот это как раз надо. Если заевалить только функцию используемую в роуте, то нихуя не применится. Поэтому я и подумал что надо перезапускать серв. Если евалить не только функцию, но и роут её использующий, применяется на лету. Так что проще весь файл загрузить.
Вот такие вещи: (defun println (text) (princ text query-io) (terpri query-io) (force-output query-io)) заебывают. Почему бы не форсить вывод по переводу строки.
>>607845 >Если заевалить только функцию используемую в роуте Ты про эту лямбду что ли? >(setf (ningle:route app (url "product/:id")) > (lambda (params) Если да, то просто жмакаешь C-c C-c и выполняется вся форма, начиная с setf. Как же этот setf глаза чешет, пиздец просто. >>607848 Он и так по переводу строки вроде бы форсится. Вообще, зачем ты princ и terpri используешь? format же их полностью заменяет. Тем более, что при компиляции он в те же принки и терпри раскрывается.
>>607852 Ну дык я заевалил функцию которая используется в лямбде. Нихуя не произошло. Приходится искать лямбду и эвалить её. Проще весь файл. Сетфы из примеров. В caveman, например, есть жабо-аннотации. А вот хуй, пока (force-output) не сделаешь, нихуя не происходит. Функцию вообще из PCL скопировал.
>>607855 >Ну дык я заевалил функцию которая используется в лямбде. Нихуя не произошло. Да ну, быть не может. Какую именно? Попробую воспроизвести. >А вот хуй, пока (force-output) не сделаешь, нихуя не происходит. [code lang=common-lisp] (defun test1 () (loop :for i :from 0 :to 3 :do (princ i) (terpri) (sleep 1)))
(defun test2 () (loop :for i :from 0 :to 3 :do (format t "~d~%" i) (sleep 1)))
>>607855 А. лол. У тебя ж там статическая страничка. [code lang=lisp] (setf (ningle:route appbase-url) (template (loop for product in goods collect (product-markup product)))) [/code] Ты обработчику строку присваиваешь, которую он с чистой совестью браузеру и отдает.
>>607860 Алсо >(defun img-src (src) >(defun product-href (product) В нингле нет чего-то вроде genurl, как в restas'е? Там для каждого маршрута генерируется метод genurl с такими же аргументами, как и самого маршрута. Например, для (defroute product ("/product/:id") ...) генерируется (genurl 'product &key id).
>>607862 >Щито? Че делать то? [code lang=common-lisp] (setf (ningle:route appbase-url) (lambda (params) (template (loop for product in goods collect (product-markup product))))) [/code] >>607862 >В лишпомире доки не блещут. Ну почему. У живых и нужных проектов с документацией обычно всё в порядке. Нингл видимо к таковым не относится.
>>607867 Типа, если задать обработчиком функцию, она будет дергаться на каждый запрос, а если задать константу (строку), она будет отдаваться одной и той же? Впрочем, звучит логично, вроде.
>>607867 >Но почему? Потому что это setf обычный, а он вычисляет присваиваемое значение. В данном случае это была форма (template ...), которая вычисляется в строку. >>607869 >если задать обработчиком функцию, она будет дергаться на каждый запрос, а если задать константу (строку), она будет отдаваться одной и той же? Ага.
Привет. Решил изучить Common Lisp, и попробовать для обучения создать на нем проект. Пошел по ссылке из шапки. Поставил себе lisp in a box, а при запуске такая вот фигня появляется: http://pastebin.com/t7C4ug3r Как ее отключить?
>>608709 Ах да, не забудь поместить в ~/quicklisp/local-projects/ сам проект или символическую ссылку на него. Либо добавь путь к местонахождению твоего .asd в переменную asdf:central-registry.
Привет, лисперы. Читаю SICP, там есть упражнение - что будет, если в рекурсивной функции вместо встроенного IF или COND использовать собственную функцию. Меня этот вопрос насторожил- не должно же быть разницы. Попробовал сам. И, внезапно, от использования собственного аналога IF интерпретатор зависает (ещё как, еле вышел по Ctrl+C, даже гном мне подвесил немного, впрочем гном то ещё говно). Можете объяснить, почему так? Вот сам код (в упражнении не факториал, но я упростил): http://pastebin.com/2Gbr2AKR
Алсо, посоветуйте годный REPL для Схемы, а то я ебал весь SICP и дальше проходить в стандартной оболочке, которая даже на клавиши Home/End и стрелки не реагирует
>>596803 >http://habrahabr.ru/post/122665/ Я не верю, что существуют люди без умственной отсталости и других заболеваний, которые неспособны понять указатели или рекурсию. Я могу их так объяснить, что даже пятилетний ребёнок поймёт. Серьёзно, о чём все подобные статьи? Откуда авторы берут такое?
>>610926 Я читал исследование каких-то американских преподавателей, которые заметили что студенты делятся на 2 категории. Первую бесполезно учить, потому что они необучаемы. Вторую бесполезно учить, потому что они и так всё знают и им надо давать более сложную программу. При этом в первую категорию входили в числе прочих талантливые математики. Мотивация также не была причиной необучаемости.
Также, они выделили несколько ступеней понимания программирования, каждая из которых сложнее предыдущей:
1. Последовательность операций. Оказывается есть люди, которые не могут понять что N-я строка выполняется только после всех предыдущих и может использовать результаты выполнения предыдущих строк. Необучаемые как раз те, кто мне могут понять концепцию последовательности операций. Они даже разработали примитивный тест на способность к программированию, который по существу проверяет может ли студент в последовательность операций. (тест примерно такой: "A=3; B=4; A=A+B; чему равно A?". Оказалось что этот тест быстро отсеивает необучаемых, безо всяких длинных анкет.)
2. Цикл. Оказалось что часть студентов не могут понять цикл, хотя и понимают последовательность операций. Профессиональными программистами понимается очень легко.
3. Рекурсия. Её не понимают даже многие профессиональные программисты.
4. Многопоточность. Это еще более сложная концепция, и непонимание многопоточности еще более распространено среди профессионалов, чем непонимание рекурсии.
>>610941 Опять же, информация из твоего ответа как раз подобна тому, над чем я недоумевал в предыдущем сообщении. Только ещё более невероятная. >тест примерно такой: "A=3; B=4; A=A+B; чему равно A?" Понятно, что если человек не знаком с программированием, он изначально может ответить неверно. Но если объяснить ему так: >буквы - это ячейки в которых лежит числа >знак равно кладёт значение справа от себя в ячейку с именем слева от себя >значение ячейки равно значению лежащего в ней числа Скажи, может ли человек в здравом уме не справиться с подобным тестом после такого объяснения? >Рекурсия. Её не понимают даже многие профессиональные программисты. Не понимают многие программисты - возможно. Профессиональные - абсурд, невозможно по определению. Это есть и в SICP, и у Виртов/Кнутов. Без рекурсивных структур данных разве вообще возможно программировать? (Тут я предполагаю, что профессиональный программист на динамическом языке знает, как реализовать связный список на Си)
>>610974 >Без рекурсивных структур данных разве вообще возможно программировать? Конечно, нахуя в бухгалтерском софте рекурсия, например? Пока структуры данных линейны (включая и списки), рекурсия не нужна, достаточно циклов.
>>610978 Мы говорим о профессиональных программистах?
Глубокие знания не нужны, пока все решаемые задачи стандартны. Но если возникает сложная задача, от крудошлёпа толку никакого - он даже в голове не может представить её примерное решение.
Ну я уж молчу про качество кода крудошлёпов. Взять хотя бы JavaScript. Без понимания особенностей замыканий в этом языке (а значит и концепции замыканий в целом) очень легко сделать утечку памяти. Ты уверен, что большинство JS-кодеров хотя бы слово такое знают?
А сколько ошибок, связанных с тем, что забывают операцию обернуть в транзакцию? http://habrahabr.ru/post/258449/ А потому что крудошлёпы, как ты сам говоришь, не могут осознать,что их код будет выполняться параллельно.
Так что если человек не понимает элементарных вещей, то он и бухгалтерский софт соответствующего качества напишет
>>610984 >Взять хотя бы JavaScript. Без понимания особенностей замыканий в этом языке (а значит и концепции замыканий в целом) очень легко сделать утечку памяти. Если кто захочет возразить, мол, крудошлёпы ограничены рамками фреймворка, то вспомните, что JS сейчас модно на сервер тащить. А там утечки куда опасней, чем на клиенте, и с фреймворками там всё хуже
>>610926 Проблема в объяснении. Рекурсию объясняют через факториалы и фибоначчевые числа. В итоге человек, вроде бы, знает, что это такое, но остаётся вопрос, а нахуй такая акробатика нужна. Отсюда и отсутствие понимания. С указателями ещё хуже. Я несколько лет писал на асме (правда, не очень активно), потом взял книжку по с и в главе про указатели не понял ровным счётом нихуя. Пришлось переводить в голове куски кода из сишки в асм, и только тогда стало ясно. Единственное нормальное объяснение указателей я видел в cs50.
>>611184 > В итоге человек, вроде бы, знает, что это такое, но остаётся вопрос, а нахуй такая акробатика нужна. Отсюда и отсутствие понимания. У меня в учебнике объяснялась на примере рисования фрактала, какое-то дерево штоле. А на чем лучше ее объяснять? Обход деревьев и графов?
>>610974 >Понятно, что если человек не знаком с программированием, он изначально может ответить неверно. Но если объяснить ему ... Нет. Смысл теста как раз в том чтобы не было никаких объяснений. Люди либо сразу понимают о чём речь, либо не понимают даже после объяснений. По крайней мере те исследователи пришли к таким выводам исходя из своей практики.
>Скажи, может ли человек в здравом уме не справиться с подобным тестом после такого объяснения? Да. Они прямо об этом писали и сами не понимают почему так происходит, но это факт.
>Профессиональные - абсурд, невозможно по определению. Профессиональный программист это тот кто кодит за деньги, для кого кодинг - профессия. Я видел профессионалов не понимающих рекурсию.
>>610978 >Пока структуры данных линейны (включая и списки), рекурсия не нужна, достаточно циклов. А еще копипаст таким людям очень помогает. Все рекурсивные функции они просто копипастят со StackOverflow.
>>611219 Не так и часто нужная рекурсия, справедливости ради. Особенно в вебе. Один хуй, хвостовая рекурсия не намного лучше обычного цикла, а зачем рекурсия если она не хвостовая?
>>611219 > Профессиональный программист это тот кто кодит за деньги, для кого кодинг - профессия. Я видел профессионалов не понимающих рекурсию. 1C'ники, PHP'шники, Front End Senjor Developer'ы.
>>611219 >Профессиональный программист это тот кто кодит за деньги, для кого кодинг - профессия. Я видел профессионалов не понимающих рекурсию. Человек может программировать на PHP, получать за это деньги и не знать правил приведения типов. Он профессионал? Человек может писать на Java, получать за это деньги и не знать, что такое сборка мусора, полиморфизм. Он профессионал?
>>611215 Да, деревья бы лучше были. Причём сначала написать через очередь, а потом показать, насколько проще это же делается рекурсивно. Тут сразу поймешь и как, и нахуя. >>611219 >Смысл теста как раз в том чтобы не было никаких объяснений ания. Тогда я бы, скорее всего, не ответил. Да и ты бы тоже. Потому что в A = A + B А будет равно A. И только если B равно нулю. А после правильного ответа ты, скорее всего, назвал бы спрашивающего идиотом и ушёл. >Люди либо сразу понимают о чём речь, либо не понимают даже после объяснений. Абсолютная хуета.
>>611229 >Один хуй, хвостовая рекурсия не намного лучше обычного цикла, а зачем рекурсия если она не хвостовая? Вот как раз нехвостовая рекурсия и нужна, потому что её в общем случае нельзя преобразовать в цикл (разве что написав собственный стек односвязным списком. Кстати, готов поспорить, что какой-нибудь крудошлёп может и такое навелосипедить, пытаясь решить рекурсивную задачу нерекурсивно).
>>611219 >Нет. Смысл теста как раз в том чтобы не было никаких объяснений. Люди либо сразу понимают о чём речь, либо не понимают даже после объяснений. А ничего, что это полная бессмыслица с точки зрения математики?
>>611256 >Тогда я бы, скорее всего, не ответил. Да и ты бы тоже. Потому что в A = A + B А будет равно A. И только если B равно нулю. А после правильного ответа ты, скорее всего, назвал бы спрашивающего идиотом и ушёл. Их эксперименты показывают другое. Особо подчеркну: эксперименты. Не предположения, как у тебя.
>>611261 >Работает быдлокодером == профессионал. У тебя подмена понятий. Вот есть продавец в киоске, а есть гений торговли, который может тебе запудрить мозги и продать акции никакущей фирмы за десятикратную цену. Оба продажники, оба получают деньги за работу, но профессионал только один.
>>611268 Ты описал разные профессии. Продавец в магазине выполняет чисто механическую функцию. Большая часть уже сделана за него (исследован рынок, определен список товаров, возможных клиентов, выбрана торговая точка, проведена реклама и т.д.).
>>611269 А ничего, что в языках с иммутабельностью нахуй не нужен этот тест, там наоборот способней будет тот, кто не принимает возможности изменения значения переменной. А исследователи говорят, что не справившимся дорога в программирование заказана. Чушь.
>>611283 >Хаскелеблядок, что ли? Лол, нет, Рубист. Но как-то работал в фирме, где помимо Руби и на Хаскеле писали. А ещё с иммутабельностью есть Clojure, Erlang и Elixir, которые популярней Хаскеля в продакшене. >То есть это не какой-то незыблемый закон. А звучит слишком категорично.
>>611283 Буквально вчера смотрел лекцию SICP где Абельсон говорил за каким хуем они после стольких лекций с функциональной еблей ввели присвоения в язык.
>тест примерно такой: "A=3; B=4; A=A+B; чему равно A?" Кстати, разве для чистоты эксперимента не стоило заменить знаки равенства, смысл которых нам вдалбливают с пятого класса на алгебре, на что-то нейтральное, например: >A <- 3 >B <- 4 >A <- A +B >чему равно A?
>>611263 >It seems absurd to administer a test to subjects who can have no idea what the questions mean. Humans are clever animals, though, and most of our subjects seem to have guessed, perhaps from the use of ‘new’ in the heading of the multiple choice column, that the questions were about change rather than mathematical equality, and so they answered using a variety of models. There were almost no write-in answers.
Снова прошу подсказать хорошую REPL оболочку для Схемы (или любого другого лиспа, на котором SICP пройти можно), потому что Dr. Racket пользоваться невозможно после PRY.
>>611425 Что это за пиздец у тебя на скрине? >Или надо через емакс запускать? Да. >Я с емаксом не дружу совсем. Тогда ставь spacemacs. Включаешь там слой (layer который) scheme и в путь.
>>611451 >>611451 >Подскажите, как в нём запустить geiser? https://github.com/syl20bnr/spacemacs/blob/master/layers/%2Blang/scheme/README.org Так чикен советуют ставить, но это не обязательно. С рекетом он тоже работает. Ну и хоткеи для работы с реплом не очень удобные. Как по мне, лучше дефолтные: C-c C-c, C-c C-r, C-M-x и т.д. И вместо SPC, по-моему, удобнее M-m, т.к. не нужно между режимами переключаться. В общем, сам разберешься. Благо, у спейсмакса документация хорошая. >это достойная замена Vim'у? Vim ему в подметки не годится.
>>611545 Не вижу аналогии. Москва - город, в котором живет наибольшее число пидорах. Но C и C++ не являются языками, на которых пишут большинство программистов.
>>611569 #define int YobaNumberType Можно переопределить на любой тип.
> Но не присваивание же Для классов оператор присваивания должен быть ОБЯЗАТЕЛЬНО переопределен. И еще класс должен иметь конструктор копирования и деструктор. Иначе в большом проекте память протечет на хуй.
>>611632 Clojure не больше, а ClojureScript - да, есть такое. Ну и у схемы один фатальный недостаток: она слишком минималистична, из-за этого в каждой реализации свой набор ни с чем не совместимых батареек.
>>611824 Ну, если в церне даже tcl используют, то, я думаю, и для схемы и, тем более, cl место нашлось. Точно сказать не могу, т.к. вопросом не интересовался. Знаю только, что некоторые ученые используют cl для расчетов, какой-то вьетнамский поисковик его использует и йоба от grammarly
>>611827 А вообще, что является наиболее "прикладным"? Из оп-поста понял, что на каждую специальную задачу найдется свой лисп, потому стоит знать диалекты (да и не так уж сложно это все вместить в голову), но все-таки в наболее значимых проектах какие диалекты используются?
>>611995 >Что мне в каждый обработчик пихать handler-case? Ну да. А ты что думал? В сказку попал? Хотя... поищи, быть может, в этом вашем нингле мидлварэ есть или просто :around метод можно запилить. >Алсо как отловить ваааще любую ошибку? Они все от error наследуются, поэтому (error () ...)
>>611999 Точно, жопой читал: > When using the condition system for error handling, you should define your conditions as subclasses of ERROR, a subclass of CONDITION.
Еще вопрос. Когда я через слайм делаю (ql:quickload ...) пакеты ставятся в ~/quicklisp Когда я делаю это череs roswell он кладет копию в .roswell/impls/ALL/ALL/quicklisp
Как это говно настроить чтобы оно не плодило копии?
>>612062 > Памяти этот sbcl жрет я ебал. Мож у тебя программа просто течет? >И грузится очень медленно. $ time ./test real 0m0.035s user 0m0.008s sys 0m0.016s Я бы так не сказал. Вот ява действительно медленно стартует. lein у меня выводит хелп за ~30-40 секунд.
>>613129 Спасибо, так быстро ответили. Вот в хаскелл-треде питушки на технические вопросы не отвечают, например. Приятно, в общем. >>613115 Не засирать глобальный неймспейс, если понадобится локальная динамическая привязка. Вообще, сложно придумать, конечно. Например, какая-то функция может вызывать подфункции, которые пишут в разные лог-файлы. Можно, конечно, передавать им всем параметр с именем лог-файла, но что если имя файла необходимо менять редко, а таких вызовов, идущих подряд с одинаковым файлом, много, и вообще, структура этих вызовов сложная? Можно создать локальную динамическую переменную с именем файла. Вместо этого: ... (foo x log-1) (bar y log-1) (baz z log-1) (foo y log-2) (bar z log-2) (baz x log-2) ... Можно будет писать это: ... (let ((log-file log-1)) (foo x) (bar y) (baz z)) (let ((log-file log-2)) (foo y) (bar z) (baz x)) ... Сорри, написал без всяких progn для наглядности, да и пример, наверное, не самый удачный. Плюс если функции должны будут сами решать, когда изменить лог-файл для последующих действий, эта переменная будет практически незаменима.
>>613218 >134 метра на вебсервер с минимальной логикой. Прям со старта столько жрет? Дохуя что-то. Попробуй попрофилировать или --dynamic-space-size подкрути. >хз, через ros init очень медленно. Я росвелом не пользовался, но вангую, что медленно запускается оно у тебя из-за инициализации квиклиспа.
>>613248 Я привел пример, где она будет не глобальной. Допустим, моя функция будет вызываться несколькими потоками, а ей будет передаваться путь, куда лог-файлы сохранять.
>>613605 abcl (реализация общелиспа), kawa (реализация схемы r7rs), linj (транслятор подмножества общелиспа в java-код) Существуют ещё всякие мосты между лиспом и jvm. Во всяких lispworks'ах и allegrocl даже из коробки.
Есть тут тикилеры? Какой набор виджетов до сих пор поддерживается, построен поверх ttk и наиболее удобен? И ещё, есть что-нибудь типа общелисповских gray-streams? А то в этой чатоподобной тикилевики хуй разберешься: куча однотипных статей разной степени тухлости, чатик, куски кода, ад и содомия.
>>614936 В какой-то из библиотек был, но сомневаюсь, что нужен. [code lang=common-lisp](defun yoba (&rest xs) (loop :for x :in (sort xs #'>) :repeat 2 :sum (* x x))) [/code]
>>610888 Перечитай заново часть про 'Applicative order vs normal order evaluation'. Дело в том, что когда ты реализовываешь свой оператор условия 'new-if', ты создаешь собственную процедуру, которая выполняется в аппликативном порядке, тогда как, встроенные в интерпретатор Scheme операторы условия выполняются в нормальном порядке. Это значит, что пользуясь new-if ты создаешь бесконечную рекурсию.
Лисп - семейство языков программирования. Характерные особенности лиспов: динамичность, гомоиконность (код как данные), программируемость.
Основные диалекты
— 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 сильно отразилась на дизайне языка, что многим не нравится.
— Emacs Lisp - его область применения ограничивается емаксом. Является наследником ТОГО САМОГО MacLisp'а.
— Tcl - скриптовый язык, оче удобен для написания скриптиков с окошками или edsl
— 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
Алсо, годная статья про проектирование 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 (это скорее вводные лекции по программированию, а не учебник по схеме, но тоже пойдет)
— Clojure
+ Programming Clojure, 2nd edition (для новичков)
+ The Joy Of Clojure, 2nd edition (есть есть бэкграунд в Лиспе или ФП)
— 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
Среды разработки
Одно из основных преимуществ лиспа в сравнении с языками с циклом разработки "написал → перекомпилировал → запустил в отладчике" - поддержка интерактивно-итеративного метода разработки. Но без инструментария, обеспечивающего полноценное взаимодействие с реплом, оно сводится на нет. Поэтому писать без использования нормальной среды - значит упустить важную особенность языка.
— 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 (только подсветка синтаксиса и простенькое взаимодействие с реплом, но жить можно)
Чтобы не пердолиться с емаксом, можно взять уже преднастроенный spacemacs ( https://github.com/syl20bnr/spacemacs ) или prelude ( https://github.com/bbatsov/prelude ).
Библиотеки
— 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