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)
Ответ на: комментарий от Nervous

Более приближенное к оригинальному примеру (векторы в роли записей):

(def result-set** [[0 10 1]                                                                   
                   [1 100 3]                                                                  
                   [2 100 2]                                                                 
                   [3 0 4]])                                                                  
                                                                                             
(defn by-second-asc [[_ counter1] [_ counter2]]                                              
  (compare counter1 counter2))                                                                

;; sort the vector records by second element                                                                                              
(def sorted-by-second (sort by-second-asc result-set**))                                      
;; ([3 0 4] [0 10 1] [1 100 3] [2 100 2])                                                  
                                                                                              
;; transpose the result to obtain a set of columns                                                                      
(apply map vector sorted-by-second)
;; => ([3 0 1 2] [0 10 100 100] [4 1 3 2])   

Никакой магии, никаких бананов.

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

Колоночно-ориентированные данные и СУБД имеют свои применения.

Можно транспонировать множество столбцов в множество записей и свести задачу к предыдущей.

O(2n) по-прежнему O(n) %)

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

Подозреваю, что вы очередной С/С++ программист. Обычно они жалко блеят в своём бессилии реализовать подобное что это узко-специализированное и ультра-специфичное говно.

Я очередной PHP программист в эпоху 4й и 5й версий и в курсе, что в силу убогости модели исполнения и околонулевой компетенции среднестатистического пыхера, «развитый функционал» – это то, что взрослые дяди написали на C, скомпилировали и упаковали вместе с PHP. Блеяли ли они при этом, мне не известно.

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

и не располагает к реализации алгоритмов

Это сишка без типов, указатели есть, нормальные виды циклов тоже. Что там не располагает то?

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

Нужно просто в одно действие собрать из этих кирпичиков готовое решение.

А в PHP ничего изобретать не надо, и все используют знакомый каждому и проверенный способ. А в лиспе та же проблема что и со строками в С++ в 90х, у каждого свои будут.

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

Применит ключевое слово function!

У массивов в PHP есть классные свойства, они сохраняют порядок ключей, являются одновременно массивами и словарями, можно одним действием сделать transpose и ключи станут значениями а значения ключами. И все эти функции учитывают эту природу, они могут работать как с массивами которые 0...n, так и с словарями которые используют строки в качестве ключей. У массивов для всех этих действий есть оптимизации под капотом.

Есть в Clojure array_chunk(arr, chunk_size) который разбивает массив на равные части? И который работает в том числе и с словарем? Это на самом деле очень удобно, но надо понять эту структуру и научиться использовать.

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

Но конечно массивы это лишь малая часть, и просто реализуемая без оптимизаций, другое дело все эти расширения которые позволяют делать все в пару строк или одну вовсе: А что там система на PHP? (комментарий)

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

А давайте проверим. Реализуйте указанный array_multisort на PHP, заодно и по скорости можно будет сравнить с CL и closure.

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

Есть в Clojure array_chunk(arr, chunk_size) который разбивает массив на равные части?

Если пхпшник попросит кложуриста написать что-то пхп-специфичное, кложурист напишет. Если кложурист попросит в ответ реализовать нечто кложа-специфичное, пхпшник умрёт. Вы уверены, что хотите начать играть в эти игры?

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

Сначала хочу увидеть реализацию на Clojure, строковые ключи оригинальных массивов должны быть сохранены.

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

Занятно, что вы не стали спрашивать, «а почему пхпшник умрёт»? Clojure core-library велика и обильна, можете сами посмотреть. К тому ж можно прозрачно вызывать функции из Java, а уж на Java библиотек написано видимо-невидимо. Т.е. с этой стороны заведомо проблем нет. Но если нужно вдруг реализовать работу с массивом, который одновременно и словарь или ещё что-то, то тут нужно сесть и отдельно реализовывать. (Хотя зачем делать такое извращение, когда есть нормальные структуры данных?).

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

Я как раз привел array_chunk как пример функции которой мне часто не хватает в других языках, она часто где бывает нужной.

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

То что показали лисперы я могу написать, конечно

$arr = [...];

usort($arr, function ($a, $b) {
  for (array_keys($a) as $i)
    if (($cmp = ($a[$i] <=> $b[$i])) != 0) return $cmp;
  return 0;
});

// Ну или просто
sort($arr);
MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 4)
Ответ на: комментарий от ugoday

К тому ж можно прозрачно вызывать функции из Java

Ну а в PHP есть ffi. Хотя зачем это нужно если расширения уже написаны в удобной форме.

работу с массивом, который одновременно и словарь или ещё что-то
Хотя зачем делать такое извращение, когда есть нормальные структуры данных?

Потому что это очень удобная структура данных, не нужно дополнительно заводить или знать о хешах, списках, сортированных множествах, функции для работы одни, рассматривая массив можно работать с ним как с множеством, и находить xor, or, and элементов одной функцией.

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

Хотя зачем это нужно если расширения уже написаны в удобной форме.

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

Потому что это очень удобная структура данных,

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

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

А где здесь выбор по каким столбцам сортировать?

А зачем? В пыхе есть и reduce и funcall. Это какая-то специальная олимпиада по переводу с ЛИСПа в пых? Будет также, один в один, но скобочки в других местах.

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

пхп не славится своими алгоритмическими возможностями

Вообще-то наоборот, херова гора алгоритмов из коробки.

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

А зачем? В пыхе есть и reduce и funcall.

Мало ли где чего есть.

Это какая-то специальная олимпиада

Да. Как и любой другой спор про языки программирования.

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

Т.е. базовый тип данных, одновременно являющийся массивом, словарём и немножко множеством, к которому в стандартную библиотеку всосали половину движка от базы данных у пхп, а норкоманский язык это всё равно лисп? Разупоритесь!

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

Я ради смеха эти куски написал, что бы показать, что выше не реализация array_multisort а что то свое.

А где здесь выбор по каким столбцам сортировать?

- for (array_keys($a) as $i)
-   if (($cmp = ($a[$i] <=> $b[$i])) != 0) return $cmp;
+ for ($priority as $i => $order)
+   if (($cmp = ($a[$i] <=> $b[$i]) * $order) != 0) return $cmp;

Кстати, в отличие от реализации на Lisp, эта без проблем работает со словарями.

Затем что есть множество форматов данных и протоколов

Ты на то отвечаешь? Существование каких то протоколов никак не отменяет что функционал php придется велосипедить.

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

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

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

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

А чего нет — то не нужно. Знакомые песни.

Есть в Clojure array_chunk(arr, chunk_size) который разбивает массив на равные части?

(partition n coll)

И который работает в том числе и с словарем?

И не только со словарём — с любой штукой, которую можно преобразовать в последовательность.

Это на самом деле очень удобно

Пользуйтесь на здоровье %)

комбинация массивов и словарей JSON в одну прекрасную структуру

Кому прекрасную — тому прекрасную.

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

ну вот, я думал через какое-то время вернуться и итеративно начать их макать в массивы, а вы сразу всю прикормку высыпали…

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

они не могут нормально реализовать то что есть в PHP из коробки, им начинает рвать шаблон и идут отмазки (лень) и перевод стрелок (напишите как на кложе).

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

пхп не славится своими алгоритмическими возможностями

старый миф времен php 4/5, разрушение которого мы сейчас наблюдаем. Ну что же вы простейшие вещи не можете реализовать на своём ЯП?

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

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

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

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

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

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

Отклонено. Вам всем предложили простейшую функцию для работы с массивом, её накорябать на С дело 20 минут максимум, на кложе 10. И никто не справился. Вы меня удивляете.

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

они не могут нормально реализовать то что есть в PHP из коробки

Попросить бы кого нормально реализовать на похапе хотя бы половину из того, что есть в кложе из коробки — вот это было бы развлечение, я понемаю %) Волосы дыбом и пальчики оближешь.

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

зачем кому-то в мире всралась эта кложа

Ну, во-первых, это красиво.

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

partition

Хорошо что такая функция есть!

(partition n (seq m))

Не понял как работает, покажи вот этот пример пожалуйста

$arr = array_chunk([
  "a" => ["A" => 1], 
  "b" => ["B" => 2], 
  "c" => ["C" => 3]
], 2, true);

echo $arr[0]["b"]["B"], "\n";

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

Здрасьте, я тут решил полюбопытствовать, а как эта задача решена на php. Оказалось на пхп задача решена на С. Если сами пхпшники избегают реализовывать свои алгоритмы на своём языке, то о чём вообще можно дальше говорить? Давайте лучше про бананы. У нас в Германии они просто ужасные. У турков ещё более-менее нормальные бывают, а в сетевых магазинах — зелёные и недозрелые будто их прямо тут и выращивают. Причём не в тёплой Баварии, а на ледяных пустошах Померании. Кошмар, зачем они так?

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

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

clojure запускается в 40+ раз дольше, чем выполняется мой пример с сортировкой на php %)

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

Я ради смеха эти куски написал,

Смех продлевает жизнь!

Ты на то отвечаешь?

Я отвечаю на:

Хотя зачем это нужно если расширения уже написаны в удобной форме.

Сами спросили, а теперь нос воротите.

и в php алгоритмы не реализуются,

Ну, факт. Вот, напишите искомую функцию на php, тогда и поговорим.

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

clojure запускается в 40+ раз дольше

Долго запрягает, но быстро едет — слышал, наверное, поговорку. А для быстрого запрягания есть бабашка.

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

Главное в JVM не заглядывать

Заглядывайте, не стесняйтесь. Давно пора разоблачить жуликов-кложуристов!

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

Оказалось на пхп задача решена на С

именно так, именно поэтому я написал что решение на С займёт 20 минут, но никто из вас не осилил.

И да, весь PHP это C с ассемблерными вставками, что никак не помогло вам решить простейшую задачу.

Все, барыня гневается, пора кормиться.

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

Компьютер саенс, функциональные программирование, кванторный анусный дисфунктор, замыкание на комбинаторах максвелла, а тормозит хуже скриптового языка без jit (он есть у меня отключен). Как так то? А ведь мы еще типичные инструменты Clojure-программиста не запускали!

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

$arr = array_chunk([
  "a" => ["A" => 1], 
  "b" => ["B" => 2], 
  "c" => ["C" => 3]
], 2, true);

echo $arr[0]["b"]["B"], "\n";

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

Ну, факт. Вот, напишите искомую функцию на php, тогда и поговорим.

Я уже переписал пример выше, что тебе еще нужно?

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

именно так, именно поэтому я написал что решение на С займёт 20 минут,

… не мешки ворочать.

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

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

Все самые важные сайты написаны на PHP

PornHub

RuTracker

Slackware.com

А без ЛОРа уж обойдемся.

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

что тебе еще нужно?

Реализацию https://www.php.net/manual/en/function.array-multisort.php на php. Вон, Обезьян говорит, за 20 минут можно сделать (это на С, на пхп быстрее должно быть). Напишите, вам не сложно.

За сим откланиваюсь. Вернусь с тренировки, с удовольствием посмотрю на ваш код.

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

Так даже Clojure программисты не справились, тут только Сишники справляются. Не по зубам мне написать два цикла и вставить вызов сортировки, тут надо годы опыта.

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