LINUX.ORG.RU

Не учите Common Lisp!

 ,


1

7

Хочу предостеречь форумчан от изучения Common Lisp. Возьмите самую лучшую имплементацию — SBCL и скомпилируйте следуюущие лямбды:

;; Взятие элемента по индексу x из массива x
(lambda (x) (aref x x))
;; Взятие элемента по индексу y из массива x и прибавление к x
(lambda (x y) (+ x (aref x y)))
;; Один из путей выполнения: прибавление X к NIL
(lambda (x y) (+ x (funcall (lambda (x) (if x 0 x)) y)))

Ни на одной из этих бессмысленных функций компилятор не ругнётся. Вы скажете: «А что такого? Это же язык с динамической типизацией!» А то, что если вы хотите хоть насколько нибудь быстрого кода, вам нужно делать какие-то утверждения о типах, производя только лишь статический анализ кода.

Минус коммон лиспа как языка — слишком разрешательский стандарт. Почти сплошь и рядом там фразы вроде «Эффект, производимый объявлением inline, определяется реализацией» или «Реализация вольна игнорировать то-то и вместо этого делать то-то». Из-за этого разработчики того же SBCL будут игнорировать твои баг репорты, где из-за неправильного поведения компилятора (с точки других опубликованных алгоритмов) твой код будет работать раза в 2 или 3 медленнее, чем должен бы.

Написали бы в стандарте «реализация ДОЛЖНА поступать так-то и так-то», и можно было бы тыкать разрабов носом в это место и требовать корректного поведения. А раз написали «реализация может делать, что ей захочется», то и прижучить их нельзя. В итоге все занимаются чем хотят, кроме починки багов.

Короче, учите языки с хорошей теоретической базой и статической типизацией. Байкам @lovesan не верьте ни одной.



Последнее исправление: dura4ok11 (всего исправлений: 1)
Ответ на: комментарий от MOPKOBKA

как в Lisp удобно пометить что поле в defstruct имеет специальное имя при экспорте в формате ABCD

В остальных лиспах не помню, а в кложе можно на структуру данных навесить произвольные метаданные, которые не будут влиять на обычное использование.

Nervous ★★★★★
()
Ответ на: комментарий от MOPKOBKA

теряется возможность ограничить конфиг простым языком

Используй EDN — он для кложи, как JSON для жопаскрипта, ограниченное подмножество синтаксиса.

Только, разумеется, лучше.

Nervous ★★★★★
()
Ответ на: комментарий от Pwner

До конца пробуй предложения дочитывать.

Там ничего нету кроме ворчания человека не осилившего PHP.

Помимого того, что это «фрактал плохого дизайна»?

Я про любой язык такое составлю, берем Python .join() vs len(), sum() vs statistics.mean(), изменяемые аргументы по умолчанию, возможность use-after-free во встроенном tkinter.

Намного важнее, что функции которые перечисляются в этом посте, вообще в языке есть.

Модель исполнения.

На PHP уже давно пишут долгоживущие сервисы, и есть все нужное для этого.

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)
Ответ на: комментарий от Nervous

Для него есть возможность составить схему, что бы IDE давало автокомплит? Это же важная часть распространенных форматов.

MOPKOBKA ★★★★★
()
Ответ на: комментарий от MOPKOBKA

Для него есть возможность составить схему

Возможность, конечно, есть %)

Nervous ★★★★★
()
Ответ на: комментарий от Obezyan

В итоге, там где язык заточен под задачу - даёт все из коробки или стандартной библиотеки, берёшь и делаешь. А в Лиспе эту самою библиотеку надо изобретать с нуля теряя время.

Давно ни один язык не используют исключительно со стандартной библиотекой (кроме разве PHP). И в этом проблема лиспа и прочих малых языков. Если стандартную библиотеку PHP можно переписать за месяц, буде на то появится необходимость, то какой-нибудь Gtk или Joomla переписывать заколебёшься.

monk ★★★★★
()
Ответ на: комментарий от monk

Давно ни один язык не используют исключительно со стандартной библиотекой (кроме разве PHP).

Так я и не утверждаю что нужно исключительно стандартной библиотекой пользоваться. Не так важно встроена она в сам язык или внесена в отдельный модуль, важно есть она или нет.

В большинстве языков - она есть в том или ином виде, причём настолько развитая что покрывает большое количество стандартных задач.

В Лиспе этого нет. Там философия что можно самому написать, с нуля, мол, в этом мощь языка.

А на деле «гордый лиспер робко прячет вызов функций в интеропе» буквально пытаясь паразитировать на библиотеках C, Java и .Net.

Не то чтобы я как-то был против этого, просто называю вещи своими именами.

(нормально прикормки досыпал для оживления обсуждения или ещё подбавить?)

Obezyan
()
Ответ на: комментарий от Obezyan

В Лиспе этого нет. Там философия что можно самому написать, с нуля, мол, в этом мощь языка.

https://www.quicklisp.org/beta/releases.html — уже 5 лет стандарт де-факто для установки библиотек.

А на деле «гордый лиспер робко прячет вызов функций в интеропе» буквально пытаясь паразитировать на библиотеках C, Java и .Net.

Это к любому малому языку относится. К PHP и Python тоже.

monk ★★★★★
()
Ответ на: комментарий от monk

(понял, досыпаю с горкой)

https://www.quicklisp.org/beta/releases.html — уже 5 лет стандарт де-факто для установки библиотек

Это разрозненная свалка а не стандартная библиотека.

Это к любому малому языку относится. К PHP и Python тоже.

Нет, к ним не относится, им не нужно лезть к другим.

Вообще, в этом весь лисп - громко заявлять что напишут все сами и отчаянно лезть в другие языки. И если старые ветви языка лезут в чужие стандартные библиотеки, то новые, например, Кложа, буквально живут на других языках (Java, JavaSctipt) используя их виртуальные машины.

Вполне ожидаемо, ведь так легче дергать чужие стандартные библиотеки, тк они становятся как бы нативным - своими.

«Мы можем написать все сами, но лучше дайте нам ваши либы и среды выполнения».

Современный лисп это язык паразит, язык - иждивенец, и сравнивать его с божественным PHP по меньшей мере оскорбительно для последнего.

В конце концов, на PHP используя стандартную библиотеку написали лисп ради фана, а вот на Лиспе не написали ничего подобного, только кричат что могут все написать.

А на деле идут отговорки от «это никому не надо, если надо - напишем» до «мне лень было читать два абзаца в доке потому я не смог повторить на Лиспе сортировку массивов».

Вся идеология лиспа на самом деле сводится к «есть ли у тебя уже есть написанные функции, то не можешь ли ты их дать?»

Obezyan
()
Последнее исправление: Obezyan (всего исправлений: 1)
Ответ на: комментарий от MOPKOBKA

Я про любой язык такое составлю

Не составишь.

Намного важнее, что функции которые перечисляются в этом посте, вообще в языке есть.

Намного важнее, что как раз в языке всего этого быть не должно.

Очевидно, что донести до пхп’шника мысль об убогости его шаблонизатора - всё равно, что убедить личинку говноеда в превосходстве еды свежей над переваренной.

Pwner
()
Ответ на: комментарий от Obezyan

А на деле «гордый лиспер робко прячет вызов функций в интеропе» буквально пытаясь паразитировать на библиотеках C, Java и .Net.

Два раза сверху высказывается одна и та же мысль, которую ты упорно в своём толстячном порыве игнорируешь. «Стандартная библиотека PHP» - это «паразитирование на библиотеках C». Непосредственно на самом PHP вообще библиотеки пишут? Не высокоуровневые сопли-формы-хуёрмы, а именно то, что ты тут представляешь верхом инженерной мысли? А то ведь, «громко заявлять что напишут все сами [ничего не мешает написать всё самим] и отчаянно лезть в другие языки» – это буквально позития вас пыхеров в этом треде (вот МОРКОВКА выше говорит, что не в сортировках счастье).

Pwner
()
Последнее исправление: Pwner (всего исправлений: 1)
Ответ на: комментарий от Pwner

Два раза сверху высказывается одна и та же мысль, которую ты упорно в своём толстячном порыве игнорируешь. «Стандартная библиотека PHP» - это «паразитирование на библиотеках C».

Весь PHP написан на С с ассемблерными вставками, как я могу это игнорировать если я сам об этом писал (тут или в соседней теме про Go).

Это вообще не отменяет того факта что функции стандартной библиотеки PHP написаны под интерпретатор на PHP, пусть и с использованием C и ассемблера.

Вы пытаетесь подменить понятия ведь на Java или JS не пишут библиотеки под Лисп, это Лисп паразитирует на Java библиотеках написанный под Java.

У вас очень жидкая аргументация. Обсыхайте и пробуйте снова.

А то ведь, «громко заявлять что напишут все сами [ничего не мешает написать всё самим] и отчаянно лезть в другие языки» – это буквально позития вас пыхеров в этом треде (вот МОРКОВКА выше говорит, что не в сортировках счастье).

Ну это совсем «слышал звон да не знает где он». У вас какое-то расстройство понимания прочитанного? Куда лезет PHP если он реализовывать под свой интерпретатор те концепции и подходы которые ему нравятся? Он не лезет в лисп (лезть некуда, кек) или в Java.

Obezyan
()
Ответ на: комментарий от Obezyan

Современный лисп это язык паразит, язык - иждивенец

буквально живут на других языках (Java, JavaSctipt) используя их виртуальные машины.

Так получилось, что и платформы эти сами по себе были довольно неплохи, и библиотек с приложениями для них было понаписано море, и сообщества колосились большие и активные. Всё у них было — кроме нормального языка.

Но теперь-то этот недостаток наконец исправлен.

P.S. Теперь и банановыыый! %)

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 3)
Ответ на: комментарий от Obezyan

Вы пытаетесь подменить понятия ведь на Java или JS не пишут библиотеки под Лисп, это Лисп паразитирует на Java библиотеках написанный под Java.

PHP также паразитирует. Есть php-gtk и php-dotnet. А стандартная библиотека лиспа написана для лиспа и почти вся на лиспе.

В конце концов, на PHP используя стандартную библиотеку написали лисп ради фана, а вот на Лиспе не написали ничего подобного, только кричат что могут все написать.

Если речь про lisphp или phel, то там от лиспа очень малая часть.

Что касается php на лиспе, то просто непонятно зачем. Если в лиспе есть то, чего нет в php (макросы, динамические переменные), то что есть в php, чего нет в лиспе? Ассоциоиндексный массив? Так работу с ним проще реализовать набором функций, если надо (но вот зачем надо, придумать сложнее).

monk ★★★★★
()
Ответ на: комментарий от Pwner

Непосредственно на самом PHP вообще библиотеки пишут? Не высокоуровневые сопли-формы-хуёрмы, а именно то, что ты тут представляешь верхом инженерной мысли?

Хорошая ссылка нашлась на эту тему: https://archimag-dev.blogspot.com/2009/08/common-lisp-vs-php.html

monk ★★★★★
()
Ответ на: комментарий от Nervous

Наш отец учил нас не стесняться используемых библиотек…

Obezyan
()
Ответ на: комментарий от monk

PHP также паразитирует. Есть php-gtk и php-dotnet

Это дань тому что PHP пытается быть языком общего назначения, в то время как это специализированный язык под веб. Эти расширения используются только в каких-то оч специфический случаях уровня написать свой оконный менеджер.

Так работу с ним проще реализовать набором функций, если надо (но вот зачем надо, придумать сложнее).

Это иллюзия, ни один лиспер ткут нормально работу с таким массивом не осилил. Единственную функцию не смогли реализовать.

Официальный ответ - лень. Ну что ж, не мешки ворочать.

Obezyan
()
Ответ на: комментарий от monk

Эта ссылка уже школу закончила и паспорт получила. Под актуальные версии PHP есть Что-нибудь?

Obezyan
()
Ответ на: комментарий от Obezyan

Это дань тому что PHP пытается быть языком общего назначения, в то время как это специализированный язык под веб.

Так лисп специализированный язык для обработки списков.

Слабо на PHP реализовать mapcan?

Это иллюзия, ни один лиспер ткут нормально работу с таким массивом не осилил. Единственную функцию не смогли реализовать.

Это времени требует. И имеет смысл только если реализовать весь блок, например, для переписывания кода с PHP. Цена вопроса — четверть месячной зарплаты программиста. Забесплатно действительно лень.

monk ★★★★★
()
Ответ на: комментарий от monk

PHP менялся, вдруг хуже стал, и вообще, если вы будете рассказывать достоинства PHP над лиспом дискуссия быстро закончится. Вам это надо? Мне - нет.

Obezyan
()
Ответ на: комментарий от monk

Цена вопроса — четверть месячной зарплаты программиста. Забесплатно действительно лень.

Что? Вы серьёзно? В Лиспе все настолько плохо? Я думал в худшем случае это займёт ну час.

Понятно почему на Лиспе нет ни программ толком ни работы, слишком мощный язык.

Надо будет глянуть что там такого сложного, с телефона в поездке неудобно.

Obezyan
()
Ответ на: комментарий от Obezyan

лисперы реализуются ту функцию для массивов на PHP

Так я именно это у тебя и попросил. Реализовать на PHP. Можно даже не на массивах (в PHP же есть структуры).

monk ★★★★★
()
Ответ на: комментарий от Obezyan

Там не сложно. Там много. 80 функций. Плюс вспомогательные для инициализации псевдомассивов, их чтения и вывода.

monk ★★★★★
()
Ответ на: комментарий от Obezyan

Если вопрос был про реализацию на лиспе, то как-то так:

(defun mapcan-php (f &rest php-arrays)
  (mapcar #'list->php (apply #'mapcan f (mapcar #'php->list php-arrays))))
monk ★★★★★
()
Ответ на: комментарий от monk

mapcar можно сделать на массивах, а mapcan требует списки.

То есть задача специально поставлена с говнецой. Фу таким быть.

no-such-file ★★★★★
()
Ответ на: комментарий от Obezyan

на PHP используя стандартную библиотеку написали лисп ради фана, а вот на Лиспе не написали ничего подобного

Тут два простых момента:

  1. Написать на лиспе другой лисп, конечно, можно, но большого практического смысла вроде как не видно — в учебных целях и жаст фо фан, конечно, пишут, но не более того;

  2. Писать на божественном лиспе разные убогие недоязычки иногда смысл есть (различные DSL), но в реализации большого убогого недоязыка общего назначения смысла ещё меньше, чем в лиспе на лиспе — потому что даже фан в этом найти сложновато, не то что практическую пользу.

А вот для убогих недоязычков написание на них лиспа — высшая честь и настоящий смысл существования %)

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 3)
Ответ на: комментарий от Obezyan

ни один лиспер ткут нормально работу с таким массивом не осилил

Это же надо сначала подобную же гадость своими руками реализовать, чтобы потом с ней работать — а к такому даже длинной палкой прикасаться как-то не хочется.

Свалили в одну кучу ассоциативные, последовательные и индексированные структуры данных и восхищаются получившимся уродцем. Похапешники, что с них взять %)

У меня сразу, в тот самый несчастливый день, когда я узнал о существовании этого недоразумения, возникли подозрения, что с гарантиями производительности там где-то обязательно будет просёр. Погоня за двумя (и более) зайцами ведь обычно имеет весьма предсказуемый финал.

И, похоже, оказался прав — просёр действительно имеет место быть, при доступе по индексу:

Array access in PHP can certainly be slow. PHP uses hash tables to implement arrays, i.e. in order to access an element in an array it has to calculate a hash and traverse a linked list. https://stackoverflow.com/a/4904071

Так что с дословной реализацией как в похапе — я точно пас. А как реализовать на кложе саму идею совместной сортировки столбцов, я уже описал выше — привести данные к удобному для решения поставленной задачи виду (множеству записей) и воспользоваться функциями стандартной библиотеки для работы с выбранными структурами данных (отсортировать эти записи по произвольному столбцу или нескольким столбцам).

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 3)
Ответ на: комментарий от Nervous

Свалили в одну кучу ассоциативные, последовательные и индексированные структуры данных и восхищаются получившимся уродцем. Похапешники, что с них взять %)

В этом смысл, в этом наша стратегия. Мы меняем ландшафт структуры данных, причем вручную. Лиспер теряется на незнакомой структуре и приходит в полную небоеготовность…

Obezyan
()
Ответ на: комментарий от monk

Слабо на PHP реализовать mapcan?

Ну вот простейшая реализация за 10 минут. Даем [1, 2, 3, 4, 5] на вход функции mapcan и хотим возвести каждый элемент в квадрат:

function mapcan($callback, $array) {
    return array_reduce($array, function ($carry, $item) use ($callback) {
        return array_merge($carry, call_user_func($callback, $item));
    }, array());
}

print_r(mapcan(function($x) { return [$x * $x]; }, [1, 2, 3, 4, 5]));
/**
(
    [0] => 1
    [1] => 4
    [2] => 9
    [3] => 16
    [4] => 25
)
**/

Если PHP-шный стандартный массив не устраивает хотя он полностью покрывает лисповые списки и хочется прям чтоб не массив назывался, а список, то можно взять, например SplDoublyLinkedList и обернуть выхлоп в него через

$list->push();

где $list это new SplDoublyLinkedList();

Obezyan
()
Ответ на: комментарий от monk

Он ставит задачу реализовать пэхапамассивы

А есть ещё языки, где списки и словари реализованы в рамках одной коллекции? Даже в перле это разные типы. Насколько нужно упороться, чтобы сделать как в пхп, мне трудно представить.

bread
()
Ответ на: комментарий от bread

А есть ещё языки, где списки и словари реализованы в рамках одной коллекции?

Вроде в Lua какие-то такие потуги были, но это не точно.

Nervous ★★★★★
()
Ответ на: комментарий от Obezyan

Пэхапешники умеют читать документацию ещё хуже лисперов.

mapcan function &rest lists+ => concatenated-results

(mapcan #'(lambda (x y) (if (null x) nil (list x y)))
          '(nil nil nil d e)
          '(1 2 3 4 5 6)) =>  (D 4 E 5) 
(mapcan #'(lambda (x) (and (numberp x) (list x)))
          '(a 1 b c 3 4 d 5))
monk ★★★★★
()
Ответ на: комментарий от bread

А есть ещё языки, где списки и словари реализованы в рамках одной коллекции?

Если именно в такой формулировке, то в лиспе есть alists. То есть словари в списках. И к ним в стандартной библиотеке есть функции.

PHP отличился только тем, что ввёл в качестве ключа ассоциативного массива порядковый номер аргумента.

monk ★★★★★
()
Ответ на: комментарий от MOPKOBKA

Кстати, очень жду пример на Clojure, а Stackoverflow не подсказывает!

От них не дождешься, придется php макаке писать на кожуре от банана:

(def arr (map identity {"a" {"A" 1}, "b" {"B" 2}, "c" {"C" 3}}))
(println (get-in (second arr) [1 "B"])) 

вернет 2

Obezyan
()
Ответ на: комментарий от monk

задачу реализовать пэхапамассивы

Где? Я чёт просмотрел наверное, задача была одна, сделать array_multisort, причём именно массивы никто не просил, а уж тем более пых-массивы.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от Obezyan

Ну вот простейшая реализация за 10 минут

Это не то дядя. Там есть подвох. Нужно делать это по-месту, без выделения памяти. С массивами так будет сложно.

SplDoublyLinkedList

Эта параша депрекейтед. Она дико тормозная.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Они пытаются отмазаться. То им лень, то гранаты массивы у них не той системы.

Obezyan
()
Ответ на: комментарий от no-such-file

Это не то дядя. Там есть подвох. Нужно делать это по-месту, без выделения памяти. С массивами так будет сложно.

В интепретируемом языке? Зачем? Мы же сейчас об реализации алгоритма, а не о том кто меньше памяти займет. Достаточно того что я показал. Они и подобное не осилили в ответ.

Эта параша депрекейтед.

Ага, если они хотят древнюю депрекейтед структуру данных, то кто я такой чтобы им отказать?

Она дико тормозная.

Двусвязные списки они такие.

Obezyan
()
Ответ на: комментарий от monk

return x or y на if-aх также суется в $callback и добавляется второй массив. Вы не понимаете код к которому пытаетесь предьявить претензии.

Короче, слив защитан :) Учите PHP чтобы не ловить баттхерт от обезъян.

Obezyan
()
Ответ на: комментарий от Obezyan

(map identity {«a» {«A» 1}, «b» {«B» 2}, «c» {«C» 3}})

Я бы тогда уж просто сделал (seq {...}) — который map под капотом и делает.

arr

Это не то чтобы массив, ну да ладно.

(second arr)

А вот и первый банановый питфолл: порядок ключей в хэшмапе не определён, на него нельзя рассчитывать. Хотя в кложе для небольших мапок (~10 ключей) порядок пар ключ/значение при преобразовании в последовательность на самом деле совпадает с порядком их определения, но сами понемаете.

Nervous ★★★★★
()
Ответ на: комментарий от Nervous

Я бы тогда уж просто сделал (seq {…}) — который map под капотом и делает.

Да там еще 4-5 способами можно сделать. Я оч редко когда кложурист (кложурец?).

Это не то чтобы массив, ну да ладно.

Зато как звучит!

А вот и первый банановый питфолл

Полностью согласен, тк заведомо мало элементов, то использовал first/second чтобы показать что так тоже можно.

Obezyan
()
Последнее исправление: Obezyan (всего исправлений: 1)
Ответ на: комментарий от Obezyan

Код я понимаю. Указываю, что Вы реализовали не то, что в задаче. Впрочем, согласен, что через reduce нужный алгоритм не сложнее пишется.

monk ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.