24 декабря Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!
Лисп - семейство языков программирования. Характерные особенности лиспов: динамичность, гомоиконность (код как данные), программируемость.
Основные диалекты — 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 - скриптовый язык с немного наркоманскимстранным синтаксисом. Из коробки множество батареек на любой случай жизни, среди которых неповторимый 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
— Clojure + Programming Clojure, 2nd edition (для новичков) + The Joy Of Clojure, 2nd edition (есть есть бэкграунд в Лиспе или ФП) + Попрактиковаться можно на Exercism'е http://exercism.io/languages/clojure
Среды разработки Одно из основных преимуществ лиспа в сравнении с языками с циклом разработки "написал → перекомпилировал → запустил в отладчике" - поддержка интерактивно-итеративного метода разработки. Но без инструментария, обеспечивающего полноценное взаимодействие с реплом, оно сводится на нет. Поэтому писать без использования нормальной среды - значит упустить важную особенность языка.
— Common Lisp + Emacs + SLIME - самый лучший вариант. + vim + SLIMV + LispWorks + AllegroCL IDE упаси боже + Eclipse + cusp + <Что-нибудь для сублайма/атома уже запилили, наверное?>
>>615276 Начать шапку надо с того нахуя мимокрокодилу вообще может понадобится лисп. Затем краткий обзор какие лиспы есть, и какой выбрать мимокрокодилу.
>>615276 >Это говно читать вообще невозможно. А что именно не так? >Предлагаю все нахуй выкинуть и сделать заново. Сделай так, как тебе кажется лучше. А лучше, предлагай варианты исправления текущего.
Аноны, вам тоже SICP сначала трудно давался, или я такой ТУПОЙ? Не могу до конца въехать в тему "вычисление квадратного корня по методу Ньютона", точнее я въехал, но вот с упражнениями большая проблема, пришлось гуглить ответы и понимать.
>>615316 Это нормально. Что не понятно пропускай, а потом можешь вернуться. Помню, как я изучал программирование по единственной найденной тогда книге - совковый учебник по сишке. Зачем нужны функции и почему они должны возвращать значение понял только при повторном перечитывании.
>>615316 Если не сталкивался с численными методами, то это нормально, дальше там ближе к обычному программированию а не к математике Еще можешь посмотреть htdp.org, который кстати неплохо бы добавить в шапку
>>615495 Как ты в этом пиздеце работаешь? Код же хуй прочтешь. >Почему не работает У тебя cube-iter требует два аргумента, но внутри функции ты вызываешь её с одним.
>>615677 Забавно. (setf (cdr x) x) тоже ничего. >>615676 Если серьезно, то ни одного аргумента в пользу отдельного неймспейса для функций я для себя придумать так и не смог.
>>615684 Ну единственный аргумент — переменные с именем совпадающим с именем функции. Это часто случается, но не могу сказать что это достаточная причина для разделения пространств имен.
>>615695 И что? Я видел это. Не считаю, что у пакетов, функций, переменных, неба и даже Аллаха должно быть одно пространство имен. Раздельное выглядит куда логичнее.
>>615702 Кстати, если уж пишешь на cl в функциональном стиле, то больше всего неудобств доставляет отсутствие сечений, композиции и уже упомянутого сопоставления с образцом, а не функалы.
>>615734 >Каррирование то? Нет, вот это каррирование: (lambda (x y) (f x y)) => (lambda (x) (lambda (y) (f x y))) а это сечение или частичное применение: (f x) => (lambda (y) (f x y))
>>615713 >лени, паттерн-матчинга Реализуется на макросах, как и каррирование и композиция. >вывода типов И как оно должно выглядеть, с динамической-то типизацией?
>>615747 >Реализуется на макросах Лень с ручными delay/force и без поддержки со стороны стандартной библиотеки? Костыльно и неюзабельно. Поэтому ею никто и не пользуется. С паттерн-матчингом тоже не очень: синтаксис, видимо, не слишком подходящий, слишком много скобок выходит. >как и каррирование и композиция КаррированиеЧастичное применение тоже немного через жопу, т.к. требует явного указания. А композицию - да, можно. >И как оно должно выглядеть, с динамической-то типизацией? Никак. Ну или костыльно и через жопу.
>>615747 Кстати, мне понравилось, как в cl21 сделали. Там переопределили макрос function (который #') так, что #'(and f g) => (conjoin #'f #'g) #'(or f g) => (disjoin #'f #'g) #'(f x) => (curry #'f x) #'(compose f g) => (compose #'f #'g) и т.д.
Упражнение 1.3. Определите процедуру, которая принимает в качестве аргументов три числа и возвращает сумму квадратов двух больших из них.
(define (st x b) (+ ( x x) ( b b))) (define (asd a s v) (cond ((and (> a s)(> v s)) (st a v)) ((and (> a v)(> s v)) (st s a)) (else (st a s)))) (asd 1 2 3) => 5 (asd 1 3 4) => 10 Не могу понять что не так, почему он не выдает сумму двух наибольших чисел?
>>616256 Удивил. Всегда думал, что их никто не открывает. Я и вимтутор не проходил, не то что емаксовский. >ВАНИЛЬНЫЙ, КАРЛ Будто что-то удивительное. Стартеркиты только совсем недавно начали использовать, потому что их нормальных не было.
>>616282 >C-n C-p нахуй не нужны Вот двачую, никогда этим говном не пользовался. Как и вимовскими k-l. Стрелки намного удобнее, особенно если Fn + стрелка = home, end, pgdown, pgup
Заметим, что наша модель вычислений разрешает существование комбинаций, операторы которых — составные выражения. С помощью этого наблюдения опишите, как работает следующая процедура: (define (a-plus-abs-b a b) ((if (> b 0) + -) a b)) Насколько понял если аргумент b больше нуля то меняем знак на +a -b, а если b ниже нуля, то возвращаем a b
>>616322 Ты посмотри на свою кисть когда ты мизинцем кнтрл держишь. Она пиздец как неестественно изгибается. Я 3 месяца так попользовался емаксом, рука начала болеть. Вот уже третий год с измененной раскладкой — брат жив, зависимость есть.
>>616335 >Насколько понял если аргумент b больше нуля то меняем знак на +a -b, а если b ниже нуля, то возвращаем a b Почти. Если b > 0, то возвращается функция +, а если меньше или ровно, то -. А потом уже эта функция применяется к двум аргументам: a и b
>>616290 >Вимовские хоткеи охуенны. Говно для инопланетян, у которых руки растут из сисек. >Емакс хоткеи становятся охуенными как только вы перенастроете клаву под ориганальную емаксову. Они всегда были говном. Решения, неудачнее C-n C-p сложно придумать. И дело тут вовсе не в модификаторе, а в том, что вместо нормального расположения рядом использованы зачем-то первые буквы слов next и previous. А эти буквы довольно далеко на клавиатуре.
>>616428 Хз, большую часть времени нужно "вниз", а вниз это "N" и нажимать его правым указательным вполне удобно. ОСтальные перемещения обычно совершаются другими способами.
>>616445 >Отсутствуют ли в нем какие-то фичи слайма Скорее всего да. Не знаю ни одного расширения для вима, которое было бы полноценно портировано с емакса.
>>616448 Не люблю сборочки, я у мамки минималист. Пытался неоднократно в ванильный, но для меня любой редактор с одним режимом выглядит неполноценным. >>616449 В любом случае, заново привыкать, конфиг пердолить, хотя, elisp выглядит привлекательнее, чем вим скрипты. >>616446 В slimv есть комплит, подсказки по аргументам функций, балансировка скобок, jump to definition, макроэкспандинг, describe символ под курсором, eval/compile form/definition/file, из самого используемого. Что в слайме есть сверх этого? Есть ли смысл в болезненной миграции?
>>616495 Не очень хочется заниматься сейчас формализацией. Объемом и качеством работ, может быть. Целью ещё, пожалуй. Можно провести аналогию с дистрибутивом линукса и сборочкой линукса (предыдущие стартеркиты емакса представляли из себя не более, чем ЛФС с нескучным набором пакетов)
>>616504 http://kovisoft.bitbucket.org/tutorial3.html#inspobj Глянь вон там. Сам не за пк сейчас. >>616501 Любой дистрибутив линукса и есть "сборочка", состоящая из программных продуктов, большая часть которых разработана независимо (ну, почти) друг от друга. Если слово "сборочка" имеет для тебя уничижительный оттенок, тогда ок, пусть будет дистрибутив емакса, но это не меняет сути.
Упражнение 1.6. Лиза П. Хакер не понимает, почему if должна быть особой формой. «Почему нельзя просто определить ее как обычную процедуру с помощью cond?» -спрашивает она. Лизина подруга Ева Лу Атор утверждает, что, разумеется, можно, и определяет новую версию if: (define (new-if predicate then-clause else-clause) (cond (predicate then-clause) (else else-clause))) Ева показывает Лизе новую программу: (new-if (= 2 3) 0 5) 5 (new-if (= 1 1) 0 5) 0 Обрадованная Лиза переписывает через new-if программу вычисления квадратного корня: (define (sqrt-iter guess x) (new-if (good-enough? guess x) guess (sqrt-iter (improve guess x) x))) Что получится, когда Лиза попытается использовать эту процедуру для вычисления квадратных корней? Объясните. Насколько понял разница в порядке вычисление аргументов, если представить: (define (p) (p)) (cond ((= 0 0) 0) (else p)) выдает 0 (define (p) (p)) (if (= 0 0) 0 p) выдает 0 подразумевается что при применении функции cond, интерпретатор вычисляет аппликативным порядком и должен первым делом вычислить значение аргументов а конкретно p и зациклиться, но он не зацикливается if особая форма вычисляет предикат и потом следствие или альтернативу поэтому он не зацикливается потому как предикат истина а значит просто не вычисляет альтернативу, ничего не понятно
>>616907 Отличное упражнение на понимание того, как происходит выполнение процедур.
Вспомним прошлое упражнение и тот факт, что Scheme при интерпретации использует аппликативный порядок вычислений. Итак, как же будет вычисляться фунция Лизы?
(define (sqrt-iter guess x) (new-if (good-enough? guess x) guess (sqrt-iter (improve guess x) x))) При вычислении new-if сначала должны быть вычислены все ее аргументы. С первыми двумя из них проблем нет, а вот при вычислении третьего new-if снова обращается к sqrt-iter, которая затем опять вызовет new-if… и так до бесконечности. Ограничивающего условия, обеспечивающего выход из этого порочного круга, нет. Таким образом программа Лизы, переписанная в таком виде, зациклится.
Почему же такой проблемы не возникает при использовании нормального if вместо new-if? Все просто. Обычный if является особой формой, он вычисляется не так, как стандартные процедуры. Для вычисления его значения не обязательно будут вычислены все операнды (более того, гарантированно будут вычислены только два из трех). Таким образом sqrt-iter будет вычисляться только в случае, когда решение еще не достаточно хорошее, а в противном случае вычисляться не будет, что и гарантирует выход из цикла.
>>616921 Помню когда первый раз читал SICP, эта простейшая, элементарная и понятная на уровне подсознания концепция, выраженная словами уровня "аппликативный порядок вычисления", взрывала мозг почище матана студенту троешнику.
Отсюда вывод? Любую хуйню можно приподнести катастрафически сложно, какой-бы просто она на самом деле не была. А на самом деле, формализация даже простейших понятий штука нетривиальная, да.
>>616954 проблема в том что проверяя эту догадку написал (define (p) (p)) (cond ((= 0 0) 0) (else p)) выдает 0 (define (p) (p)) (if (= 0 0) 0 p) выдает 0 подразумевается что при применении функции cond, интерпретатор вычисляет аппликативным порядком и должен первым делом вычислить значение аргументов а конкретно p и зациклиться, но он не зацикливается if особая форма вычисляет предикат и потом следствие или альтернативу поэтому он не зацикливается потому как предикат истина а значит просто не вычисляет альтернативу, ничего не понятно
>>617042 Синтаксический сахарок - слишком нечеткое понятие. У меня, например, ассоциируется больше с введенными конструкциями (типа do-нотации в хаскеле), чем с макросами. Лисповые макросы всё-таки синтаксис не меняют, они меняют семантику вычисления.
Анон, подскажи редактор или IDE для Scheme (Guile). Сейчас пользую gVim, хотелось бы более лучшей подсветки хотя бы, да и прочих удобств. Об Emacs сломал 7 пальцев.
>>616991 Упражнение 1.6. Лиза П. Хакер не понимает, почему if должна быть особой формой. «Почему нельзя просто определить ее как обычную процедуру с помощью cond?» -спрашивает она. Лизина подруга Ева Лу Атор утверждает, что, разумеется, можно, и определяет новую версию if: (define (new-if predicate then-clause else-clause) (cond (predicate then-clause) (else else-clause))) Ева показывает Лизе новую программу: (new-if (= 2 3) 0 5) 5 (new-if (= 1 1) 0 5) 0 Обрадованная Лиза переписывает через new-if программу вычисления квадратного корня: (define (sqrt-iter guess x) (new-if (good-enough? guess x) guess (sqrt-iter (improve guess x) x))) Что получится, когда Лиза попытается использовать эту процедуру для вычисления квадратных корней? Объясните.
>>617420 Преимуществ емакса при использовании в качестве swank клиента (о чем, конкретно, и шла речь) мы найти не смогли, а значит, можно отказаться от позиционирования его как единственной легитимной лишп-IDE и избавить от триггеров людей, уже успевших травмироваться этим чудом инженерной мысли.
>>617504 Помимо сванкаслайма есть ещё helm'ы, projetctile, отсутствие режимов и прочие. Кроме того, у вима заметные проблемы с производительностью. Работает он шустро только без расширений. >можно отказаться от позиционирования его как единственной легитимной лишп-IDE Не стоит. Пусть уж лучше люди воспользуются более полноценным спейсмаксом, чем nodepad++ на стероидах и с режимами.
>>617522 >helm'ы, projetctile Думаешь, для вима расширений с таким функционалом нет? Серьезно? >у вима заметные проблемы с производительностью Как там в 2010? Еeasytags (единственное, в прошлом, тормозящее расширение) уже научился в фоне обновлять базу, всякие движки для семантического автодополнения дополняют чуть ли не вперед вводящих код пальцев, за слаймом тормозов не замечал. >>617523 Да ну, там senior java developers обсуждают новые плагины к нетбинс, куда мне с вимом со своим.
>>617639 аппликативный и нормальный порядок? Да, если new-if определить через процедуру cond то в момент вычисление значений аргументов процедура должна зациклиться? Но этого не происходит вот пример: (define (new-if predicate then-clause else-clause) (cond (predicate then-clause) (else else-clause))) (define (p) (p)) (new-if (= 0 0) 0 p) выдает ноль, хотя при вычислении значения p она должна зациклиться
>>617686 > (new-if (= 0 0) 0 (p)) На это. Ты же определил (p) а не p. Можешь ничего не менять, а определить p, например (define p (p)) - тогда тоже зациклится. р и (p) это разные вещи.
>>618852 Охуенно велик. Велосипедил парсер json, при использовании displaced тупил сильнее в разы, аж что-то вроде пары секунд против 0.1 на двухметровый файл.
>>618893 >:start :end? Это. С displaced чисто для теста производительности и делал, они там и не нужны, хуле, прошелся по строке, сгенерировал список атомов, вот и весь лексический анализ. А тебе они зачем понадобились? Или сугубо академический интерес?
Начал учить sicp в качестве основы для себя. Заодно учу дискретку по лекциям из интуита. Потом хочу взяться за алгоритмы макконелла, что еще посоветует?
>>619741 Тогда осилил до циклического метаинтерпретатора, потом как обычно накатились жизненные обстоятельства и стало не до этого. К тому моменту когда я читал сисп, я уже сидел в офисе за зарплату писал говнокод, так что я просто продолжил писать говнокод, обмазываясь по возможности функциональщиной.
Анон, я что-то не понимаю вообще ничего. (define (sqrt-iter guess x) (if (good-enough? guess x) guess (sqrt-iter (improve guess x) x))) Значение приближения улучшается с помощью взятия среднего между ним и частным подкоренного числа и старого значения приближения: (define (improve guess x) (average guess (/ x guess))) где (define (average x y) (/ (+ x y) 2))
Что здесь под guess? Что за sqr-iter? Я вообще ничего не пойму, помогите разобраться с этим.
>>620016 https://vseloved.github.io/ Вот чувак в grammarly работает. Они там йобу для обнаружения и исправления ошибок в текстах на инглише пилят. А из местных врядли кто лиспером устроился. Одни нюфаги же.
Печально, лиспаны. Мне нравится это семейство и программирование на нём доставляет мне много радости, но практически полное отсутствие работы-сильный демотиватор. Его даже на голом энтузиазме невозможно протащить в продакшен. А на человека, который пишет на лиспе, аж ссылки кидают, как на диковинку.
>>620164 >программирование на нём доставляет мне много радости, но практически полное отсутствие работы-сильный демотиватор Не вижу связи. Нравится что-то делать — делай. Нет — нет. Чай не в тайге живешь, чтоб проблемами выживания перечеркивать любимое занятие. >Его даже на голом энтузиазме невозможно протащить в продакшен. Технических преград нет. Тем более, что для особо интерпрайзных случаев существуют качественные коммерческие реализации с платной поддержкой. А нетехнические при желании преодолеваются: кто-то стартупы организовывает, кто-то начальников переубеждает, а кто-то и уже существующую вакансию находит. >А на человека, который пишет на лиспе, аж ссылки кидают, как на диковинку. Я кинул ссылку, потому что у них действительно интересный проект. Такой и на популярном языке днем с огнем не сыщешь. Тем более в странах бывшего СССР.
>>620085 >ues sqr-iter? - функция для поиска квадратного корня из х. У нее два аргумента: guess - предполагаемый ответ, при самом первом вызове берется абсолютно любое число, и потом оно постепенно приближается к нужно числу, квадратно корню из х которое является вторым аргументом. Функция sqr-iter? получает два числа guess и x. Сначала проверяется не является ли guess достаточно хорошим ответом (вызывается good-enough?), если достаточно хороший то просто возвращается guess. Если нет, то значение guess улучшается с помощью вызова improve и в sqr-iter? передается улучшеный вариант guess, и дальше все с начала - проверяется достаточно ли он хорош, если нет то еще раз улучшается и так пока не найдется достаточно хороший вариант.
рассмотрим следующую задачу: сколькими способами можно разменять сумму в 1 доллар, если имеются монеты по 50, 25, 10, 5 и 1 цент? В более общем случае, можно ли написать процедуру подсчета способов размена для произвольной суммы денег?
Число способов разменять сумму a с помощью n типов монет равняется • числу способов разменять сумму a с помощью всех типов монет, кроме первого, плюс • число способов разменять сумму a − d с использованием всех n типов монет, где d — достоинство монет первого типа.
какой-то абсурд число способов размена равняется числу способов размена без 50 + число способов разменять 100 - 50??? бред
>>620867 Тут существует лиспотред только из-за SICP'a. Ну, есть еще всякие диалекты, с помощью которых реально быстро можно написать всякие утилитки для себя.
>>620968 Разве? А чем можно объяснить популярность сикпа? Вот лично я тут и сижу из-за сикпа. Но он не понятный очень, много нелогичных вещей и неявных решений.
>>620960 объясните на конкретном примере допустим число комбинаций 100 то следуя этому определения 100=(+(- 100 кроме первого) (- 100 достоинство монет первого типа)) Что значит "кроме первого", "достоинство монет первого типа" это 50?
>>621069 Я имею ввиду не столько функциональщину уровня хачкеля, сколько то, что первые несколько глав программирование преподносится как функциональная, математическая дисциплина. За счет модели подстановок и отсутствия присвоений.
Число способов разменять сумму a с помощью n типов монет равняется • числу способов разменять сумму a с помощью всех типов монет, кроме первого, плюс • число способов разменять сумму a − d с использованием всех n типов монет, где d — достоинство монет первого типа.
на конкретном примере допустим число комбинаций 100 то следуя этому определения 100=(+(- 100 кроме первого) (- 100 достоинство монет первого типа)) Что значит "кроме первого", "достоинство монет первого типа" это 50?
>>621154 Я не тралил, т.к. ответил раньше, чем ты написал. Ты же программист, должен понять, что я отвечал на тот пост, который был. А он был с ошибками. Конкретно на это: >>621146 ничего не скажу, сам только обучаюсь.
Число способов разменять сумму a с помощью n типов монет равняется • числу способов разменять сумму a с помощью всех типов монет, кроме первого, плюс • число способов разменять сумму a − d с использованием всех n типов монет, где d — достоинство монет первого типа. Приведите конкретный пример этого типа, в виде формулы
Листаю сравнение кложуроскриптоты с жсом: https://github.com/clojure/clojurescript Почему мне хочется блевать от жабоговна проступающего через слой разномастных скобок?
>>622362 По-моему, я тебе уже 2-3 раза в разных тредах объяснял за Кложу. Но мне не лень, объясню ещё раз: В языке программирования важно то, какие вещи он делает удобными и идиоматичным. То есть, какой код будет писать программист, если он будет идти по пути наименьшего сопротивления относительно языка. Кложа делает удобным и идоматичным использование иммутабельных данных и использование явной модели времени для описания изменяющихся данных. Именно такой код пишется, когда тупо используешь стандартную библиотеку. Интероп с хост-платформой (типа использования js-объектов) нужен для использования существующих библиотек, когда это необходимо.
>>622614 У кофескрипта тоже другая семантика: объектная система не прототипная, а классовая. Кстати, вот его-то, в отличие от кложуры, можно с небольшой натяжкой назвать полноценным языком, т.к. в нем нет той неидиоматичной неоднородности низлежащего языка, которая проглядывается в любой кложуре.
>>622621 Если в JS система прототипная, а в Кофескрипте классовая, то как использовать JS библиотеки, API которых основаны на прототипах? Не будет ли это выглядеть точно так же неиодамтично?
очень странные у вас треды вы бросаетесь от реализации к реализации, читаете какие-то книжки и прочее а попробуйте просто сделать одно реальное приложение
>>623963 >>624022 Ну, там особо и бросаться-то нечему. Отрисовку, кстати, удобнее вынести в отдельную функцию, чтобы можно было легко менять код налету.
>>624755 Если макрос и функция в твоем случае взаимозаменяемы, то нужно использовать функцию. А в случае необходимости оптимизации вызова функции использовать compiler macro. Но такое случается редко. Вообще, макросами без надобности лучше не злоупотреблять. Советую тебе почитать onlisp. Этот момент там хорошо описан.
>>624922 Всякие with-* штуки часто делают через макросы. Но ведь их можно сделать и через обычную функцию, но тогда придется передавать туда лямбду, что не очень удобно. Хотя в статье >>624719 давали ссылку на call-with- макросы. Да и в слайме макросы не удобны, потому что приходится компилить все функции которые их используют.
>>624971 >Но ведь их можно сделать и через обычную функцию, но тогда придется передавать туда лямбду, что не очень удобно. Ну, само собой, что не стоит изъёбываться, всеми силами игнорируя макросы в тех случаях, когда их использование целесообразно. Под взаимозаменяемыми я имел в виду что-то вроде этого: [code lang=common-lisp] (defun foo (x y) (bar x y)) (defmacro foo (x y) `(bar ,x ,y)) [/code] потому что многие поначалу начинают их активно использовать как аналог инлайновым функциям.
>>621440 Предположим ты помогаешь дяде в каком-нибудь небольшом магазинчике, заменяя его его иногда, но при этом любишь программировать. Однажды ты на автомате даешь сдачу очередному покупателю, а вечером тебе приходит идея посчитать все возможные пути размена какой-то суммы. Так как ты программист по своей сути, то ты этому делу тут же хочешь научить своего лучшего электронного друга. Все начинается с разборов считаемых нетрудно примеров: сколькими способами можно разменять сумму в 11 центов? Ответ: 4. Почему так? Потому что группа монет, которыми ты можешь произвести размен это: 10, 5 и 1. Ты человек, и видишь ответ насквозь: (5 + 5 + 1), (1 11), (5 + 6 1), (10 + 1). Но нужен алгоритм. Пусть есть А) число способов разменять сумму, с применением всех номиналов, кроме максимального для данной группы - 10 центов, т.е. (5 + 5 + 1), (1 11), (5 + 6 1). Б) число способов разменять сумму, оставшуюся после отнятия монетой высшего номинала для данной группы. Т.е. 11 - 10 = 1. В итоге получается 4 случая.
>>625030 Кстати, нужно быть аккуратным с рекурсивными инлайновыми функциями. SBCL их пытается бесконечно подставлять, поэтому нужно использовать maybe-inline
>>625758 Да, я твой код смотрел, но в ракете вроде бы немного по другому. Там в sdlвской функции в качестве аргумента принимается указатель на структуру. Вот я не могу разобраться как его сделать.
>>625709 Ну, не удивительно, ведь он довольно сырой. Поэтому многие до сих пор пользуются lispbuilder-sdl. >>625770 Попробуй make-_SDL-Event. А лучше найди нормальную библиотеку
>>625697 Я вот думаю, туториал туториалом, но тем кому нужен этот туториал надо сначала рассказать как поставить emacs spacemacs, sbcl, quicklisp. Это ж пиздец.
А те кто могут это все поставить сами, нужен ли им туториал?
Да и винды у меня нет вообще ни в каком виде, а это основная платформа аудитории как мне кажется.
>>625828 Ну, найти и поставить sdl2, sdl2-mixer, sdl2-image на шиндошс, потом ещё настроить IDE - тоже задача не из простых. Но, тем не менее, туториал на сишке существует.
>>625855 Кстати, не знаю как сейчас, но когда я изучал сишечку по книжкам уровня с++ за 21 день, самой сложной для меня ступенькой было начать пилить GUI софт. Тогда мне почему-то очень хотелось пилить гуй, и все консольные проекты уровня laba1.cpp вызывали острую резь в анусе. Обмазался Qt, сделал пару тулзовин для работы и охладел к этому делу, потому что погрузился во влажный и уютный мир консольки, вима и вообще линупса для жизни, а не для СМОТРИТЕ ПОСОНЫ, Я ПОСТАВИЛ ЛИНУПС,
Так вот, это я к чему все, начинающий анон, терзают ли тебя эти же вопросы или в 21 веке всем уже похуй?
>>615102 (OP) Анончики помогите долбоебу! Clojure. Суть такова, надо нааписать функцию, которая возвращает map вида {число :keyword} но количество чисел неизвестно, известно что их 3 + некое рандомное количество (скажем до 3), то есть в одном случае ф-ция должна вернуть {4 :X 7 :Y 12 :L 3 :Y } а в другом может {7 :X 7 :Y 2 :L} или даже {9 :Y 7 :Z 1 :L 3 :Y }
Cуть тут в том, что я не знаю, как правильно собрать такой map ведь он всегда разной длины.
>>626229 Ты хоть бы посмотрел что к чему. Crossover это американская шарага занимающаяся подбором удаленных сотрудников. Акцент у чувака который звонил был явно не русским.
>>626596 Правила настраиваешь для дефолтной конфигурации и все. Пока сидел на i3 почти не пользовался автотайлингом. Окно на весь экран, вот что нужно 99% времени.
>>626957 Различий намного больше, чем может сначала показаться. Фактически, это два разных языка с разными идеологиями. Если оценивать с точки зрения практичности, то, как по мне, схема в виду своей минималистичности годится только как язык для обучения или как встраиваемая скриптота, а для чего-то большего непригодна из-за разрозненности реализаций, несовместимости и без того немногочисленных библиотек, отсутствия эффективных реализаций (сталин умер; рэкет слишком жирный и тормозной; чикен не тестировал, но сомневаюсь, что компилирование через сишку может дать приемлемый результат).
Вопрос об оверхеде кложе. Если мне надо написать приложение, где генерятся массивы длинной более 10000, куча деревьев, множества, списки. И память будет этим забита полностью. Кложе тут норм выбор? Или можно упереться в JVM и в частности сборщик мусора?
>>627398 Точно сказать не могу, но думаю, что большого оверхеда быть не должно если при кодировании учитывать боксинги/анбоксинги, ленивость и т.д., всё-таки кложура довольно тесно интегрируется с жавой. Так что, скорее всего, всё будет упираться в jvm. Попробуй запилить бенчмарки.
>>627424 >почему c SBCL такой медленный код? Где распараллелено хуёво, где библиотека тормозная (cl-ppcre), а где и просто написано неэффективно. Одно время этот тип http://swizard.livejournal.com/158763.html их переписывал, но потом забил. Вроде из-за того, что его код не приняли.
>>628435 Ничего не вышло. Код оказался и без меня нормально заоптимизирован: к полям структуры обращение прямое, даблы боксятся только в одном некритичном месте. Но код для FPU, который мне сгенерировал sbcl на x86, выглядит немного туповато. Видимо, sbcl не слишком хорошо умеет оптимизировать использование стек регистров. В этот >>628192 листинг пока ещё не вникал, но, кажется, выглядит чуть получше. Сегодня попробую сравнить с вариантами на ocaml и rust.
>>625697 Если что, я не дропнул, а продолжаю потихоньку пилить туториалы и саму библиотеку. Мне, кстати, дали доступ пушить прямо в мастер ветку cl-sdl2, так что теперь могу нужные мне фиксы сразу заливать, а не ждать мержа пр.
>>629387 Это отдельная библиотека. Если ты про мой макро, то заталкивается, да. Я код постоянно рефакторю по мере написания, так что это все еще 100 раз поменяется.
Пиздец, костыли на костылях. И зачем тогда надо было брать динамически типизированный язык, в котором ничего нет? Что-то странный какой-то курс, не могу понять, нравится он мне или нет.
>>631899 Курс по хтдп. Пока кажется, что эта книжка - такой же форс, как и сикп. >>631981 Я хотел, чтобы меня обучили систематическому программному дизайну, а мне вместо этого рассказывают про тдд и как сымитировать строками и интами нормальные типы данных. А дальше там ещё веселее - делают адт через cond по типу. Жаль, не заскринил, теперь только до понедельника.
>>632114 Я не знаю, что ты там за гайд читаешь. В ракете есть специальные макры для паттерн матчинга, а хуйню с твоего скрина какой-то джапидор писал походу.
>>634717 То что ввод спрашивают в минибуфере это ок. То что варианты открываются в соседнем буфере (обычно еще и поверх нужного мне буфера), не ок. >>634716 Поподробней можно?
>>635419 >Prelude щупал? Да, на него сначала и пытался перелезть. Сейчас уже не помню, что именно в нем хуже, чем в спейсмаксе. >Почему именно на спейсмакс пересел? Понравилась организация в виде слоев, однородность и гм.. древо-образность клавиатурных сочетаний и активное развитие. В общем, совсем другой уровень, уже не просто набор конфигов, а полноценная целостная надстройка над емаксом.
>>638536 хз. Если вдруг соверешенно случайно придет в голову хорошая идея которую я смогу сделать за неделю, то наверное да. Но я безыдейное говно, поэтому вряд ли.
>>638544 Если быть точным, то идею худо можно высратьспиздить, но временное ограничение в неделю на реализацию означает что нужно сделать просто. А просто и интересно это дохуя сложно. Увы.
(define (: a b c) (b a c)) Удивительно, как простая функция может сделать из ЭТОГО язык программирования. >>638550 Две. За две недели даже я успеваю говна наваять.
>>641143 Ладно. Тогда такой вопрос: у кого из более-менее известных Схем удобнее всего FFI к C? И сразу еще один: стоит ли сейчас страдать хуйней со Схемой, или лучше сразу переползать на КЛ или Clojure? Я интересуюсь, потому что Схему знаю, даже в передачу продолжений могу, а КЛ/Clojure - нет.
>>641221 > у кого из более-менее известных Схем удобнее всего FFI к C? Я не схемер, но, думаю, у chicken должно быть хорошо с FFI. Всё-таки он через сишку компилируется. Для сравнения могу посоветовать поглядеть общелисповский CFFI. >стоит ли сейчас страдать хуйней со Схемой, или лучше сразу переползать на КЛ или Clojure? Зависит от того, что ты собираешься писать. Возможно, общелисп и правда окажется более подходящим.
>>615102 (OP) Скрипты: (применяются для обучения, администрирования и лепки гостевух, но есть и единичные примеры использования не по назначению, для написания программ. Вместо программы, впрочем, получается гигантский скрипт на выброс)
LISP (скобочное говно) — один из самых старых скриптов, до начала семидесятых даже использовавшийся в качестве эрзац-ЯП, за неимением ничего лучшего. На заре его существования был игровой площадкой для монстров CS, которые вскоре положили на него хуй и пошли лепить алгол. Последний крупный проект (то, что сейчас называется Axiom/Open CAS) стартовал в 70-ом году. В настоящее время форсед-мем школьников и первокурсников. Типичный скобкошлеп берет деньги у мамы. Scheme — скобочное говно, сделаное правильно. К алголу приделали скобки и получился лучший скрипт для обучения первокурсников и, возможно, лучший скрипт вообще, но в этом имеет сильного соперника. Типичный схемоеб получает стипендию и денежные переводы от мамы из Крыжополя. * SmallTalk — скрипт, придуманый для обучения программированию детей-дибилов и лучший скрипт всех времен и народов. IBM решили, что для индустрии это как раз то, что надо и пытались его пропихнуть. FIAL. Тем не менее, индустрия таки заразилась от него всеми спидами. Баззворды «ООП», «паттерны проектирования», «юнит-тесты», «рефакторинг», «MVC», да и все остальные пришли в мейнстрим из смолтока. Типичный смолтокоеб на работе пишет на жабе.
Не смотря на то, что схемка и смолток делают остальные скрипты совершено ненужными, массы динамических петушков выбирают ПЫХОПЛЕЯДУ (Perl, PHP, Python, Ruby). ПЫХОПЛЕЯДА — это высеры ГСМ-ов и неграмотных долбоебов, которые проделали большую работу изобретя колесо (квадратное) — чукча не читатель, блеать. Пыхоплеяда состоит из протопыха (слишком приподвыподвернут для петушков, известно, что новейшую версию первоначально удалось реализовать только на хаскеле), пыха — классика гостевушного жанра, гвидопыха и джапопыха. При этом, если гвидопых отличается от пыха только ЧСВ гвидопыхеров, упивающихся своей невъебенной илитностью, и наличием у хуесосов харизматичного фюрерка, то джапопых действительно несколько более продвинут, и в мокрых фантазиях джапопыхеров является смолтоком. Знатоки пыхоплеяды лепят гостевухи за доширак и заправляют картриджи.
>>641236 >общелисповский CFFI А он стандартизирован? >что ты собираешься Минимум - это бизнес-логику, которая должна одинаково работать одинаково везде: на сервере, на стационарных клиентах и на мобильных устройствах. Поэтому нужен простой и портативный язык. Остальное можно писать и не на нем, но, конечно, хотелось бы.
>>641252 >А он стандартизирован? Де-факто. Поддерживаются все основные реализации, за исключением, может быть, ABCL. >Минимум - это бизнес-логику >простой и портативный язык. На роль простого и встраиваемого языка больше подходит схема (chicken или guile, например, две последние буквы которого расшифровываются как Language for Extensions). У CL же большинство реализаций вообще не встраиваются. Исключение - ECL, который компилирует в сишку и который менее совместим с остальными реализациями, и некоторые коммерческие реализации.
>>641419 >выразительность С этим согласен. Но! Очень много языков компилится в Java 7-совместимый байт-код, даже Clojure. Правда, на мобилках он запускается и работает медленно. Лучше Kotlin.
>>641564 Странные эти люди. С одной стороны пытаются всё сделать, лишь бы на явоскрипте не писать (изобретают кофе-, кложуроскрипты, елмы), а с другой стороны пихают этот недоязычок во все щели без разбору.
>>642295 >>642306 Если что я делаю это в прямом эфире: http://www.twitch.tv/tatrics Щас правда уже закончил, потому что нужно работу работать, а то и так уже сижу бомж пакет жру.
>>642306 Сука, это просто невозможный пиздец. Пол дня, блять, пытался завести это говно на злоебучей винде. Нихуя. Вообще по нулям. КАЖДАЯ сука операция завершается миллиардом ошибок. Говно гроб гроб кладбище пидор. Я уж не говорю что в саомй винде любое действие заставляет себя чувствовать кастрированным одноглазым одноногим одноруким крабоговнообсоском.
>>644269 >>644273 С горем пополам собрал. Так теперь эта блядина в рантайме сразу валится без стектрейса с ошибкой уровня "Unknown alien function call"
>>644786 Так ты забросил игру что ли? Я тут на семерочке cl-sdl2 из гита попробовал: всё само собралось и даже запустилось без всяких проблем (basic-test запускал). Ты уверен, что у тебя версии sdl совпадают?
>>646662 Проблема в sdl-ttf который тупо не работает. Если осилишь собрать, я может даже успею до 10 числа демку доделать. Я и так уже три дня проебал на попытки заставить это дерьмо работать, собрал все библиотеки руками и хуй. Была последняя надежда на 64 битную винду, но пошла она в пизду.
>>646937 Точнее он собирается, но в рантайме вылетает с "unknown alien function" на sdl-ttf:init Автор либы в чатике меня игнорит, а самому ковырятся с этим дерьмом у меня времени нет, проект еще сдавать сегодня.
>>646939 >но в рантайме вылетает с "unknown alien function" на sdl-ttf:init https://github.com/Failproofshark/cl-sdl2-ttf/blob/master/src/library.lisp#L3 Имя dll-ки для шиндошса не определено, поэтому ничего не подгружается. В остальном всё работает, хоть и пришлось немного поебаться с установкой mingw для гровела и, внезапно, с поиском собранной libffi. Ещё оказалось, что окно не создается, если запускать sbcl изпод емакса.
>>647080 Ну, например, поддержкой т.н. интерактивной разработки, когда ты можешь писать код и сразу же его компилировать прямо в рантайме работающей программы.
>>647845 Блять, злоебучая винда 1) Запускает sbchost который грузит систему на 100% 2) Запускает TrustedInstaler.exe который грузит систему на 100% и НЕ УБИВАЕТСЯ 3) Говорит что если я её не ребутну для накатывания апдейтов, она сделает это сама.
>>648112 У тебя и пример из sdl-ttf тоже только без accelerated завелся? Если да, то видимо драйвера виноваты, а не винда, потому что у меня он работал.
>>648128 И ещё, проверь у себя пути к ресурсам. Вайн на них ругался: >#<THREAD "SDL2 Main Thread" RUNNING {254D2F29}>: > SDL Error (#<TTF-FONT {#X00000000}>): Couldn't open Z://assets>/DejaVuSans.ttf Хотя возможно, это его баг.
>>648153 Это баг. Образ лиспа запомнил путь полученный через (asdf/system:system-source-directory :twg) Переделала на относительный путь, должно прокатить.
Сложно ли выучить и понять лисп? Если я сделаю это, изменит ли он мои взгляжы на программирование в целом? Поможет ли улучшить подход к использованию других ЯП?
>>648454 хз, заебывает делать руками то, что комп по идее должен делать сам. Как оно с глобом разрулит порядок загрузки? Что кстати тоже заебывает. Не хочу думать о порядке функций в файлике. А точнее обычно хочу сделать его обратным, чтобы используемая функция шла после использвания.
>>648517 >хз, заебывает делать руками то, что комп по идее должен делать сам. Прикрути к емаксу такую функцию. К какому-нибудь projectile. Хотя по-моему нет никакой сложности добавить (:file "file") руками. >Как оно с глобом разрулит порядок загрузки? Никак. >Не хочу думать о порядке функций в файлике. А разве нужно? В любом случае, в такой сортировке нет ничего плохого, т.к. она упрощает отслеживание зависимостей.
Основные диалекты
— 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 - скриптовый язык с немного наркоманскимстранным синтаксисом. Из коробки множество батареек на любой случай жизни, среди которых неповторимый 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
— 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
Текущая версия шапки: http://pastebin.com/NQcjG6Kp