LINUX.ORG.RU

Как выучить C# за 21 день имея только опыт Common Lisp? Надо всего лишь...

 , , , ,


1

8

Вобщем, я тут в своей библиотеке для интероперабельности Common Lisp и .NET - запилил мега-фичу - прокси-классы.

Это такие классы, лисповые, которые с помощью магии метаобъектного протокола CLOS и немного System.Reflection.Emit - прикидываются .NET классами, а их объекты, соответственно - .NET объектами.

Это позволяет бесшовно интегрироваться с .NET кодом, например реализовывать .NET интерфейсы или вон, идиоматически писать на WPF, с MVVM, биндингами, командами и всем прочим.

Вон пример приложения, это браузер пакетов(лисповых неймспейсов) CL: https://files.catbox.moe/77wdbn.png

https://github.com/Lovesan/bike/blob/master/examples/wpf.lisp (потом как-нибудь еще добавлю пример с Avalonia, чтобы было кроссплатформенно вообще).

Вот соответствующий XAML. Как видно, вьюха напрямую биндится к свойствам вью-моделей, как будто у нее под капотом C#. https://github.com/Lovesan/bike/blob/master/examples/WpfUserControl.xaml

Код в принципе там понятен, особенно тем кто имел дело с WPF/Avalonia. Но документацию надо бы написать, да, работаю над этим. Докстринги это хорошо но мало.

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

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

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

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

тройка не вида h m t

а вида равноправной тройки(как равносторонний треугольник где точки отличимы но симметричны)

ну эт эзотерика

зы.в своё время не понравилось что хотя car.cdr пара симметрична - в перволиспах S-выражения представлялись именно как скошенные в право - хотя исходно то это вполне симметричное дерево у которого оба поддерева вычисляются прежде чем вычислить всё деррево

имхо с тройкой именно нужно правильную модель найти - что бы дало преимущество в абстракнтныхФабриках :_

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

Пайтон - тормоз

Под каждую задачу хорош свой инструмент. Шоб по деревенским говнам ездить болид формулы один не подойдёт.

Профессионалы владеют широким набором узкоспециализированных инструментов. Дилетанты фапают исключительно на скорость выполнения кода.

Кстати дотнет это очередная попытка создать универсальный инструмент. Получилось как обычно.

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

дотнет это очередная попытка создать универсальный инструмент

Да там целый куст этих инструментов. С решеткой и без.

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

и игрушек для шизофреников вроде C++/Rust.

Можно сколько угодно хвалить производительность AOT кода по сравнению с JVM (в Андроиде вроде тоже AOT, хотя там и не JVM), но когда априори нужна производительность, берут C++. Достаточно посмотреть на библиотеки для perception (opencv, PCL) - это всё С++. Ну и в эмбеддед и всяких спецкомпах типа инфотейнмент (если не брать совсем тупые рекламные щиты) кругом C, C++, RTSJ, и теперь немножечко Rust, но никакого дотнета.

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

Рад что Вы осознаете ограниченность своих возможностей в понимании таких вещей.

Не теряйте самокритичности и лет через дцать возможно Вы перестанете быть дилетантом!

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

А не обязательно на плюсах, можно ведь и на… А на чём собственно? На чём ни возьми, кроме собственно, шарпа - будет какое-то головоэтосамовольство. Я не большой фанат винформочек и прочих XAMLей, но лепить на gtk ещё хуже. На qt ещё более-менее, но я когда лепил гуй к диплому на PyQt местами много ругался и такой «нiколи знову».

В какой-то момент общим мнением стало «десктоп не нужен» и начали лепить HTML5 «приложения». Типа сразу и кроссплатформенно и вообще хорошо. А теперь мы имеем электрон, стагнацию в развитии десктопных приложений и модный look’n’feel по HIG.

Dark_SavanT ★★★★★
()

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

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

и даже больше чем среди программистов на Rust

Серьёзно? Я думал рачт первый в данном вопросе.

Я тоже так думал. Но единственный мой знакомый фанат CL за пределами ЛОРа пару месяцев назад член себе отрезал. И он (она?) говорит, их там целая тусня таких. Так что если чел пишет на CL и ему меньше ~30-35, то стопудов с ним это случится, если ещё не.

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

У тебя тупо нерепрезентативная выборка. Будь у тебя в дружбанах только MакКузик с Оллманом, поливал бы ты тут Сишнегов.

Да не, сишников я тут тоже стебу регулярно. Посмотри мои треды.

Гетеросексуальных православных лисперов я тоже знаю, но им в основном за 40.

hateyoufeel ★★★★★
()

Вобщем, я тут в своей библиотеке для интероперабельности Common Lisp и .NET - запилил мега-фичу - прокси-классы.

Отличная работа. А каким образом ты отлаживаешь свои программы на функциональных языках? Насколько я понимаю, пошаговый отладчик тут не запустишь? Каким образом ты смотришь содержимое очередей сообщений в какой-либо точке программы? Какие-то инструменты существуют для этого на Лиспе? К примеру, в Эрланге какой-никакой, а просмотрщик содержимого очередей сообщений имеется. Если сравнивать средства разработки, то на чем удобнее писать, если выбирать из Лиспа, Эрланга и Скалы?

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

Отличная работа. А каким образом ты отлаживаешь свои программы на функциональных языках?

CL не совсем чтобы функциональный, это скорее метаязык.

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

Почему? https://files.catbox.moe/apbqah.png

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

Каким образом ты смотришь содержимое очередей сообщений в какой-либо точке программы?

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

Какие-то инструменты существуют для этого на Лиспе?

Куча встроенных в стандарт языка, плюс куча идет в поставке с реализациями CL - и профайлеры и все остальное, плюс Emacs + SLIME/SLY - это IDE для CL, скрин которого я скинул выше.

Если сравнивать средства разработки, то на чем удобнее писать, если выбирать из Лиспа, Эрланга и Скалы?

На CL конечно. В эрланге, как я помню с этим вообще не очень всё, а я на нем писал в проде, в Scala все еще хуже чем в эрланге, потому что она на JVM, но при этом хреново интегрирована с ней, и высирает километровые стектрейсы JVM которые отношения к коду никакого не имеют.

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

Частично - код можно отлаживать с помощью средств .NET. Так же студия видит процесс как .NET процесс, когда в него подгружена CoreCLR. Можно приаттачиться дебаггером и также расставлять брейкпоинты итд в .NET части.

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

Зачем читать книги про языки программирования, и тем более про «современное состояние», типа там про библиотеки? Книги?

Берешь и пишешь какой-нибудь код. По ходу дела разбираешься.

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

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

Ну и бумагу мне просто приятнее в руках держать.

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

Да вы оба тормоза (хотя и непонятно, при чем тут тормоз). Я вообще Python стараюсь называть по-разному каждый раз, используя всевозможные рофляные формы наподобие пайфон/пуфон/пытхон/пхитон и т.д. К питоше отношусь ровно, кстати, исключительно ненавязчивого юмора ради коверкаю его название.

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

По CL есть куча хороших старых книг: CLtL2, PAIP, AMOP, PCL, OnLisp

Начать можно с Practical Common Lisp, она хоть и подустарела, но простенькая. А вообще в нем несложно разобраться если вообще на чем-то еще писать кроме бидона. «Немного» знания схемы не особо релеватно. Это в принципе совершенно другой язык, он и Lisp-N, и макросы там другие, и нет continuations, и вообще все по другому.

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

По CL есть куча хороших старых книг: CLtL2, PAIP, AMOP, PCL, OnLisp

Начать можно с Practical Common Lisp, она хоть и подустарела, но простенькая. А вообще в нем несложно разобраться если вообще на чем-то еще писать кроме бидона.

Раст с ПХП/жс в дополнение к пхейтону в качестве необходимого бэкграунда подойдут? Уважаемые ЯП вроде 🤔

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

Только это от цирка Монти Пайтона

Да хоть от цирка имени дяди Юры Куклачёва (и Миши Вербицкого заодно), логотип у них из змей, поэтому питон (и с маленькой буквы тоже пойдёт).

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

Зато знать кто там какой белибердой вдохновлялся выдумывая очередное поделие из серии пыхопледы это во какая грамотность.

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

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

до этого лого питона хм

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

Даже если имя. По-русски Иоанн Креститель, а не Баптист. Мы говорим Лондон, Париж и Пекин, а не Ландэн, Пари и Бэйдзин.

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

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

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

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

Из попыток интеропа с джавой на самом деле идет история Clojure. Рич Хики пытался сделать для CL либу интеропа но не смог сделать нормальную. В конечном итоге сделал вообще через сокеты. Именно из-за сигналов. И в определенный момент он решил делать вообще свой язык под JVM.

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

Жалко, что Кложура это в основном про жабу. Дотнетовская реализация, насколько помню, попала в стагнацию и забылась. А именно она не имея жабоограничений и могла выстрелить.

Мне кложура нравилась, но её жирность, аппетиты к памяти и лютая замороченность поделий на её основе подтолкнули к переходу на ракетку (@monk, тебе спасибо). С CL развлекался, потом применял в работе но постепенно забил и хочу возобновить. Одно с ним погано, что после него ни на чём ином писать не хочется.

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

Для Python -> JVM есть как минимум три относительно популярных, открытых и бесплатных способов:

https://github.com/jpype-project/jpype

https://github.com/py4j/py4j

https://github.com/kivy/pyjnius

А для .NET -> JVM очень мало и в основном коммерческие либо совсем недоразвитые.

RemObjects - всё, что смог найти из более или менее интересного:

https://docs.elementscompiler.com/Iodine

Чем питон лучше .NET для создания переходника в JVM?

Впечатление, что кто-то не хочет взаимодействия .NET и JVM?

Остальные мои находки по этой теме (.NET -> JVM) IMHO так себе, намного хуже упомянутых выше питонячих :(

https://www.jcobridge.com/

https://github.com/masesgroup/JCOReflector

https://github.com/ikvmnet/ikvm

https://github.com/xafero/JNetCall/

https://www.c-sharpcorner.com/UploadFile/ajyadav123/invoking-java-code-in-C-Sharp-net/

https://docs.unity3d.com/Manual/android-plugins-java-code-from-c-sharp.html

https://www.javonet.com/about/what-is-javonet/

https://github.com/dotnet/core/issues/766

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

Для Python -> JVM есть как минимум три относительно популярных, открытых и бесплатных способов:

Python, это, как бы сказать, не то чтобы ненастоящий рантайм, но типа того. Рантайм тупенький. Без всяких хаков(потому и тормозной). Его легко встраивать, там нету продвинутого GC, и все такое. И там GIL.

А для .NET -> JVM очень мало и в основном коммерческие либо совсем недоразвитые.

А вот это вот между собой подружить, это, как я уже сказать, анрил вообще. Потому что они будут конфликтовать в GC, в сигналах и всем прочем. Особенно на Unix-like платформах. На винде то еще есть SEH, они там в принципе могут выжить вместе, а линукс - это все, тупик. Сигналы друг друга сломают.

Впечатление, что кто-то не хочет взаимодействия .NET и JVM?

Хотеть то хотят, просто это практически нереально сделать без существенных хаков и трейдоффов, на которые ни одна платформа видимо идти особо не собирается.

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

Как пример - у меня на самом деле в момент инициализации библиотеки на Linux - есть Race condition. Не особо исправимый. Но в принципе, чаще работает чем нет(процентах в 99% случаев).

Дело в том, что лиспы и .NET тоже, конечно, конфликтуют в сигналах. Что я делаю, и в чем мне помог разраб SBCL - я сохраняю лисповые сигналы, потом, при инициализации дотнета, сохраняю его сигналы, и тут же - перетираю их лисповыми. И потом уже, восстанавливаю некоторые дотнетовые сигналы, которые ему нужны.

https://github.com/Lovesan/bike/blob/a885eca126263dc3dde27150c126ef8e21c1f9a1/src/host.lisp#L235

В момент инициализации может произойти факап. Если в дотнете случится что-то, что триггернет сигнал, в то время пока я сохраняю эти сигналы и хачу их. Процесс упадет. На SBCL этот момент обрабатывается лучше чем на других реализациях, потому что функция эта встроена в рантайм и написана на сишечке, т.е. вероятность race condition меньше, скажем так.

Есть идея как это улучшить, сделать signal chaining, но это нетривиальная работа, и потребует нехило так implementation-specific кода. Но пока есть что есть.

Короче, хач что ппц. Но если брать жабу - то там таких хаков надо выше крыши. Дотнет то в какой-то степени встраиваемый, а вот жаба - в принципе считает что весь процесс принадлежит ей. Жопа короче.

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

хаков и трейдоффов

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

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

Пореалу на данный момент времени, с жабой можно общаться вот разве что через RPC из другого процесса.

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

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

Мораль короче в том, что не дотнет или жабка плохо сделаны, а в том что сигналы юникс это сраное говно. Они не работают как надо, они устаревшее говно из 60х, и при этом они являются неотъемлимой частью юниксов и юнипс-лайк систем. Поэтому современные ОС это сраное говно. Кроме винды конечно. Хотя, она тоже говно, но в другом, архитектура в целом там нормальная.

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

Ведь есть отличный Interop для .NET <-> Python, из него вероятно можно использовать любой из перечисленных выше трёх Interops Python -> JVM.

Т.е. в результате получим .NET -> Python -> JVM, вероятно, тормозная связка, но для каких-то кейсов без многозадачности вполне подходящая, когда надо сделать относительно немного вызовов, а кодить аналог JVM либы достаточно трудоёмко?

Т.е. небольшая переплата в микросекундах или миллисекундах на вызовы через такую гирлянду образно по сравнению с неделями или месяцами на разработку аналога JVM либы. При нынешних соотношениях между стоимостью квалифицированных разработчиков и оборудования, IMHO вывод очевиден?

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

Ведь есть отличный Interop для .NET <-> Python, из него вероятно можно использовать любой из перечисленных выше трёх Interops Python -> JVM.

У тебя проблемы начнутся в момент загрузки двух рантаймов в один процесс. Пофигу через Python они там общаются или нет. Долбанется что-нибудь с сегфолтом сразу же. И джава и дотнет поднимут какие-то там бэкграунд треды при инициализации - для GC, финализации итд, и тут же наступят друг другу на сигналы и привет сегфолт или чето в этом роде.

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

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

lovesan ★★★
() автор топика