LINUX.ORG.RU

Common Lisp VS Racket

 , , ,


2

7

Комрады. Очень давно тыкал в Cl/SBCL, не так давно написал пару сервисов для этого вашего web’a на Racket.

Вопрос - Common Lisp VS Racket, что более живо для написания web’a, что имеет больше батареек, какая IDE лучше (кроме Emacs), etc.

что более живо для написания web’a, что имеет больше батареек

к сожалению: Clojure > Racket >> CL

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

Тогда наверное тебе не в лиспы.

Интересно есть ли альтернативы скорее. Быть может что-то более удобное/модное/хипстерское.

А по теме Clojure

Отторгает сама JVM. Для .Net знаю, есть. Но, ЕМНИП, сыроват.

silver-bullet-bfg ★★
() автор топика
Ответ на: комментарий от kookoo

Бери CL.

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

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

Если беспокоят библиотеки - так в quicklisp в CL их полно, а если вдруг не хватает, можешь взять мою либу для интеграции с .Net Core https://github.com/Lovesan/bike/ - ее люди в том числе в продашкне используют, недавно помогал одному немцу с его вопросами, которые возникли у него в процессе работы.

IDE - Emacs без вариантов, причем для любого лиспа. Если лень настраивать - можешь взять Portacle: https://portacle.github.io/

lovesan ★★
()
Ответ на: комментарий от silver-bullet-bfg

Для .Net знаю, есть.

Clojure для CLR мертв, и развиваться, в том числе портироваться на .Net Core - не будет.

Язык прибит к JVM.

Не слушай хипстеров, в реальности Clojure куда менее удобна, чем CL.

lovesan ★★
()

Вопрос - Common Lisp VS Racket, что более живо для написания web’a

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

Virtuos86 ★★★★★
()

Вопрос - Common Lisp VS Racket, что более живо для написания web’a, что имеет больше батареек, какая IDE лучше (кроме Emacs), etc.

Смотря какого веба. У Racket уникальная система, позволяющая прозрачно передавать любое замыкание в гиперссылку или обработчик формы. У CL достаточно большое количество более традиционных каркасов: restas, dwim, caveman.

IDE у Racket стандартный DrRacket (если Emacs не рассматривать).

Батареек в целом у CL больше (в quicklisp), но они менее документированы и единообразны. Из-за этого легко можно получить программу, которая использует одновременно несколько разных библиотек для тестов, описания классов, констант и прочих базовых вещей.

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

Разве racket не чудовищно тормозной?

С clojure и common lisp производительность одного порядка. Быстрее чем python и намного быстрее чем ruby.

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

передавать любое замыкание в гиперссылку или обработчик формы.

Вот это весь ракет, нахрен не нужная наркомания, от которой даже в CL отказались много лет назад.

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

Зачем? Тесты библиотек пусть лежат в библиотеках.

Свои тесты имеет смысл делать на fiveam.

описания классов, констант

closer-mop, alexandria, и так далее. Никто не городит новые описания классов «чтобы було»(в отличие от racket видимо). Если в какой-либо библиотеке есть макрос, раскрывающийся в defclass, значит от добавляет важной функциональности.

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

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

Не надо FUD разводить.

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

Нет, там какая-то компания про разработку микроконтроллеров.

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

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

В отличие от CL в Racket нет многократной избыточности однородных велосипедов. Или что подразумеваешь под «натащили говен хуже чем в C++»?

К тому же в Racket есть нормальные модули (в которых можно гарантировать выполнение инвариантов для типа данных). Есть нормальные константы (в CL (defconstant +a+ «ok») не гарантирует, что (format t +a+) выведет «ok»). Есть нормальные зелёные потоки. В общем, много полезных вещей.

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

В отличие от CL в Racket нет многократной избыточности однородных велосипедов.

Как раз наоборот. В стандарте CL все фичи ортогональные и продуманные, и их не так много. В Racket же на уровне языка - реально C++.

Про библиотеки уже сказал - в Racket их тупо нет. А что есть как раз наркоманские велосипеды типа «замыкания сериализованные в URL».

К тому же в Racket есть нормальные модули

ASDF в CL - это нормальные модули.

(в которых можно гарантировать выполнение инвариантов для типа данных).

Очередная наркомания на пустом месте.

(в CL (defconstant +a+ «ok») не гарантирует, что (format t +a+) выведет «ok»)

С чего бы не гарантирует? Не гарантируется там порядок переопределения константы. А первичное определение - вполне. Впрочем переопределение гарантирует (define-constant с «ok» :test #’equal) из alexandria.

Есть нормальные зелёные потоки.

Абсолютно не нужная, и даже вредная вещь, если язык не Erlang, или на крайний случай, не haskell.

В общем, много полезных вещей.

s/нормальных вещей/наркоманских велосипедов/g

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

Вот это весь ракет, нахрен не нужная наркомания, от которой даже в CL отказались много лет назад.

Отказались исключительно от диких тормозов продолжений в CL. Либо необходимости держать по потоку ОС на каждое продолжение.

В результате, если в Racket у меня написано просто (for/list ([row (get-data-from db)]) … `(a ((href ,(url (detail-page row)) …), то в CL приходится вручную городить хэш, следить за временем жизни, отслеживать возможные конфликты ключей.

Свои тесты имеет смысл делать на fiveam.

Вот ты делаешь на fiveam, авторы dwim на stefil, автор caveman использует prove, …

closer-mop, alexandria, и так далее.

defstar, defclass-std, hu.dwim.def, hu.dwim.defclass-star, defpackage-plus, cl-annot, cl-mop, metatilities (кстати, потянет ещё один тестовый пакет lift), … попробуй представить их все в одной программе.

Фактически у CL та же проблема, что и у C++. Там тоже в одной системе использовать QString, TString, vtkString, ustring, … тоже достаточно неудобно.

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

Как раз наоборот. В стандарте CL все фичи ортогональные и продуманные, и их не так много. В Racket же на уровне языка - реально C++.

Только их не хватает. Многопоточности нет, слабых ссылок нет, FFI нет. На стандартном ANSI CL без расширений почти ничего не возможно написать.

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

Многопоточность везде в нормальных реализациях есть. В SBCL есть даже вещи типа compare-and-swap операций.

Есть bordeaux-threads - compatibility layer.

Для асинхронности - самое просто что можно взять это cl-async: https://github.com/orthecreedence/cl-async Есть lparallel: https://github.com/lmj/lparallel

Плюс можно взять мой bike:

(use-namespace 'System)
(use-namespace 'System.Threading.Tasks)
(use-namespace 'System.Net.Http)

(defvar *client* (new 'HttpClient))

(defun print-ip-async ()
  (invoke (invoke *client* 'GetStringAsync "https://api.ipify.org")
          'ContinueWith
          (new '(Action Task)
               (lambda (task)
                 (format t "My ip is: ~a" (property task 'Result))))))

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

ASDF в CL - это нормальные модули.

Только при компиляции в чистой системе и у разработчика разные результаты могут получиться. И регулярно на defconstant ошибки выплёвывает. А так нормальные.

С чего бы не гарантирует?

$ sbcl
This is SBCL 1.4.4.debian, an implementation of ANSI Common Lisp.
....
* (defconstant +a+ "ok")

+A+
* ...

*A*
*
#\f
* +a+

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

Отказались исключительно от диких тормозов продолжений в CL. Либо необходимости держать по потоку ОС на каждое продолжение.

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

Вот ты делаешь на fiveam, авторы dwim на stefil, автор caveman использует prove, …

И пусть делают. Мне то что с того? Мне их тестовые фреймворки никак не мешают. Более того, тесты обычно идут отдельной asd системой, и их даже загружать не надо.

попробуй представить их все в одной программе.

Во-первых, зачем? Я что, обязан все эти пакеты импортировать и использовать? Множество базовой же функциональности, расширяющей стандарт, тем более что щас в uiop и alexandria(расширенный defpackage итд). dwim же вообще довольно маргинальные ребята.

Там тоже в одной системе использовать QString, TString, vtkString, ustring,

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

lovesan ★★
()
Ответ на: комментарий от silver-bullet-bfg

А как сейчас у Common Lisp с асинхронностью? Как с параллелизмом? Я очень давно в него тыкал.

Так есть bordeaux-threads и cl-async. Достаточно неплохо.

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

С clojure и common lisp производительность одного порядка

Ну тут смотря какую реализацию рассматривать. Если sbcl, то он намного впереди clojure. И сильно впереди racket.

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

Многопоточности нет, слабых ссылок нет, FFI нет.

Все это есть в дефакто compatibility layers, которые все используют. В стандарте языка - в основном собственно язык.

На стандартном ANSI CL без расширений почти ничего не возможно написать.

На стандартном ANSI CL вообще-то написан например SBCL.

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

Есть нормальные зелёные потоки.

Собственно, только зелёные и есть. Хотя нет, там через непривычную ерунду можно задействовать и физические потоки процессорных ядер.

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

Вот ты делаешь на fiveam, авторы dwim на stefil, автор caveman использует prove, …

Так это, плюрализм. :)

Фактически у CL та же проблема, что и у C++

Вообще, да, говён в CL понапихали библиотеками. Не без этого.

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

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

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

И регулярно на defconstant ошибки выплёвывает.

Потому что стандарт надо читать и понимать что делаешь. (defconstant +foo+ 123) ничего не выплевывает.

(defconstant +a+ «ok»)

Это каким чудом такое получилось? Версия древняя, и видимо из бабуинового репозитория, т.е. забагованная.

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

Нет, не поэтому(как вообще это связано? откуда тормоза? при чем тут потоки?)

Так посмотри на реализацию хоть wevlocks хоть web4r.

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

Миллионы мух пыхомакак не могут ошибаться. Но почему же пишешь на CL, а не на пыхе?

Я что, обязан все эти пакеты импортировать и использовать?

Использовать – нет. Импортировать, если хоть одна используемая библиотека их использует – да.

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

Не все. Есть fast-io, есть flexistreams, есть big-string.

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

Но почему же пишешь на CL, а не на пыхе?

Одно дело что я пишу на CL, а другое дело что делаю наркоманию, для которой веб не предназначен, которая не масштабируется, и не дебажится.

Импортировать, если хоть одна используемая библиотека их использует – да.

Пусть импортируют, это как мешает вообще?

Не все.

Все перечисленное это не про строки. Строки и так есть.

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

Ну тут смотря какую реализацию рассматривать. Если sbcl, то он намного впереди clojure. И сильно впереди racket.

Смотря на каком примере. Например, если парсить XML, то SBCL и Racket будут использовать свои библиотеки, а clojure – Java’вскую. А Java на большинстве задач быстрее, чем SBCL (если в нём не отрубать напрочь безопасность).

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

Это каким чудом такое получилось? Версия древняя, и видимо из бабуинового репозитория, т.е. забагованная.

* (defconstant +a+ "ok")

+A+
* (defvar *a* +a+) (setf (aref *a* 0) #\f)

*A*
*
#\f
* +a+

"fk"

Запусти на своей незабагованной. Заметь, даже предупреждений нет.

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

Во-первых, в SBCL (и много где еще) как я уже выше сказал, можно с таким же успехом заюзать дотнет кор.

Во-вторых, с чего такие переобувания? Как производительность, так значит у нас джава сразу. А ничего, что код с интеропом с джавой в clojure - это сразу костыли и говно, по определению, когда придется бороться со всей тамошней чистотой, и прочим, конвертировать туда-сюда и так далее? Про идиоматичность вообще не говорю.

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

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

Да ладно. Сишный make не позволяет в выполняемой программе получить артефакты от предыдущей версии. Также как и система сборки Racket.

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

Ты объект меняешь, а не константу.

Стандарт потому что надо читать.

На изменение +a+ SBCL, внезапно, ругается.

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

Сишный make не позволяет в выполняемой программе получить артефакты от предыдущей версии.

Внезапно, не всегда, и внезапно, ASDF в таком плане - тоже позволяет.

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

Если отрубать безопаность в SBCL, то он ненамного быстрее становится. :) Говорю тебе с большим опытом. :) Иногда вообще ни разу не быстрее. Пример же надуманный. То, что SBCL быстрее, видно даже невооружённым глазом. После Clojure садишься за SBCL и у тебя даже ветром волосы сдувает.

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

Вообще, претензия исходит видимо от человека, с сишным мышлением, который не допер до того что лисп это про image-based development.

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

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

Там вся стандартная библиотека - интероп с Java. Например, clojure.xml

monk ★★★★★
()

Хочу отметить, что весеннее обострение началось ещё на той неделе.

CL я вряд ли бы взял на сегодня. Деградация сообщества продолжается прежними темпами. Вот спроси у Лавсанчика, когда был последний релиз любого его проекта на CL? Посмотри, когда был последний пост на lisper.ru? Чем сейчас занят archimag?

Сейчас вот (не дай Бог, конечно) придёт короновирус по души людей предпенсионного возраста, и лисперов сразу станет в 10 раз меньше (хм, кстати, это идея - спрос на лисперов может резко возрасти!) - и квалификация сообщества может резко рухнуть.

Мне скучно без лиспов, но и жрать тоже надо. Кактус под названием Clojure я планирую отведать в обозримом будущем.

IDE под названием clcon/яр я пилил, но она была никому не нужна (редкий лиспер её не проклял) поэтому и недопилил. Сам пользовался вместо EMACS, основное там сделано. Но для использования сторонними лицами она всё же непригодна.

Для clojure вроде что-то есть за пределами емакса, но пока не пробовал.

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

После Clojure садишься за SBCL и у тебя даже ветром волосы сдувает.

Не путай время запуска и скорость IDE со скоростью программ на языке.

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

Ты объект меняешь, а не константу.

А я что написал? Что нормальных константных объектов в CL нет.

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

Вообще, претензия исходит видимо от человека, с сишным мышлением, который не допер до того что лисп это про image-based development.

В image-based нормальные системы сборки тоже могут существовать. Например, XCVB.

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

Которой никто не пользуется, по причине неуловимости данного джо

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

Поздравляю, выстрелил себе в ногу. Нормальные люди этим не занимаются, естественно.

С таким же успехом можно сделать (setf (car '(1 2 3)) 4)

Читай стандарт дальше.

lovesan ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.