|
Модератор
|
||||||
Делаю GUI на Haskell01.04.2017, 00:07. Показов 7814. Ответов 77
Метки нет (Все метки)
Предпосылки
Нормального, кроссплатформенного, графического интерфейса в настоящий момент для Haskell нет. Имеющиеся обёртки к сишным либам (GTK+, WxWidgets) оставляют желать лучшего, мягко говоря. С каждой новой версией и сишной библиотеки, и обёртки вылезают баги их совместимости. Особенно это заметно под Windows, т.к. под этой ОС авторы обёрток не привыкли их проверять. Проблемы кросс-языковой совместимости, в принципе, это проблемы человеческого фактора. Но они реально достают.
Выбор
И так, я стал выбирать как можно более низкоуровневую кроссплатформенную библиотеку с тем, что бы она наименее мешалась, а практический весь GUI реализовать на Haskell. Такой подход, как я предполагаю, максимально снизит «обёрточные» проблемы, или, если угодно, они будут сосредоточены в одном Haskell пакете (или нескольких взаимосвязанных) где фиксить их будет куда проще. Кроме того, разработка новых компонент GUI-я, так же будет происходить в рамках одного языка, что, очевидно, удобнее.
Из рассматриваемых кандидатов я отклонил OpenGL как очень избыточную для целей обычного (2D) интерфейса. К тому же она медленна под Windows. От использования браузера через JavaScript я отказался на основании некоторых, накладываемых на такой интерфейс ограничений. Выбор я остановил на библиотеке SDL2. И, хотя это мультимедийная библиотека, якобы заточенная под геймдев, мне в ней понравился простой API для работы с окнами, мышью и клавиатурой. Под винду она использует DirectX (хотя может и OpenGL), под другие ОС только OpenGL. Допускается создание любого числа окон операционной системы, получение сообщений от устройств ввода через очередь сообщений. Возможность создавать свои сообщения (нужны для обновления интерфейса из потоков), возможность работать с весьма ограниченным набором примитивов и текстурами. Рендеринг текста и загрузка изображений из многих графических форматов реализована сопутствующими сишными библиотеками SDL_ttf и SDL2_image. В принципе, возможно подключить более «навороченную» библиотеку cairo в качестве дополнения, Haskell обёртки к которой есть, при чём даже специально к SDL, но я пока cairo в сам проектируемый GUI не заложил. Для GUI хватает и графических примитивов SDL2. Упрощённо иерархия выглядит так. Нудное описание
Базовый слой GUI поддерживает дерево Widget-ов общего назначения. Алгоритмы последовательности их отрисовки, доставку событий (в виде вызовов функций Widget-а) от мыши и клавиатуры, учёт наложений, скроллирования, взаимодействия между окнами приложения и прочие «общие» моменты. Базовый Widget представляет собой фиксированную запись с полями – свойствами Widget-а и набором полей – функций, создаваемых, предположительно, только при (даже перед) созданием самого виджета. Набор функций напоминает набор обработчиков событий в распространённых, ООП-ешных GUI. Конкретные виджеты (виджеты компоновок – layout-ы, надписи, кнопки и пр. представляют собой (на уровне данных) объединение в одном типе типа базового виджета и типа уникального для конкретного виджета. Т.е. данные описывающие более высокоуровневые виджеты имеют в качестве одного из полей запись виджета более низкоуровневого. Базовый виджет всегда хранится по ссылке (IORef). Так же, через
IORef он доступен в дереве виджетов базового слоя. В известном чате мне советовали использовать FRP, но если посмотреть исходники FRP пакетов, то внутри там IORef-ы и есть. Пока воздержусь от использования в GUI. Может потом поумнею? Про исходники (нет, я не копира...)
Исходники, к сожалению, я пока не готов выложить по следующим причинам:
- Ещё мало чего можно показать. Не хотелось бы что бы скачали, посмотрели и сказали «фи, опять какая то недоделка». Да, пока весьма недоделка, даже на базовом уровне по которой надо ходить опасно. Вторая причина – нет комментариев. Да, надо бы их сразу писать, я знаю. Но я себе установил для начального этапа некоторые сроки, а дело двигается медленно, и времени нет, и редизайнил уже много раз. Так что, как только хоть что то будет – так сразу. Ну и зачем?
Зачем я это делаю? Ну, во первых «Мужик что бык: втемяшится В башку какая блажь — Колом ее оттудова
Не выбьешь» (с) Н. А. Некрасов. Потом, это, потенциально бесконечная работа. Если (а что крайне врят ли) кто не подключится, она меня переживёт. Чем то этот момент меня привлекает. (Видимо, тоже весеннее обострение. Кодить начал, аккурат 1 марта, хотя задумывался об этом давно). Что бы было хоть ну на что то посмотреть приведу код (без import-ов) которым создаётся верхняя картинка.
И наконец. Радужные перспективы.
Сделать более менее нормальный GUI со своей изюминкой, полностью типобезопасный, а потом, на нём сотворить, наконец, нормальное IDE для Haskell.
7
|
||||||
| 01.04.2017, 00:07 | |
|
Ответы с готовыми решениями:
77
Место ФП и Haskell в компьютерной индустрии (Для чего он нужен, этот Haskell?)
|
| 01.04.2017, 09:07 | |
|
0
|
|
| 01.04.2017, 13:42 | |
|
Я довольно много на хаскелле писал гуи приложений, и, в результате всех трудов, пришел к выводу - гуи не нужно. Возможно, я ошибаюсь. Возможно, я не в тех кругах общаюсь и работаю. Но по тенденции развития, приходишь к выводу за вебом будущее. И, что самое приятное, на хаскеле можно писать гуевые приложения в браузере. Данное чудо зовется https://wiki.haskell.org/Threepenny-gui. Не поймите не правильно - это не реклама и не критика, просто если вдруг окажется что я прав, то гуи станет не нужен, посему проект с гуи будет не очень пользоваться спросом. А если это все будет в вебе(опять же, в случае моей правоты), то пример, который вы задумали будет очень пользоваться спросом и в будущем. Пока проект на начальном этапе, пишу об этом, пока не стало поздно переводить его, если совет покажется интересным.
0
|
|
|
Заблокирован
|
|
| 01.04.2017, 13:57 | |
|
loothood, Вы абсолютно правы, ни гуй ни хаскель не нужны. Все плавно переходит в веб, на облака и тп., а факториалы успешно реализованы на фортране и более индустрия в них не нуждается
0
|
|
|
Супер-модератор
|
|
| 01.04.2017, 14:13 | |
|
agregationcompo, в подобных прогнозах часто ошибаются даже великие. Примеров масса. К счастью, мир оказывается сложнее. Если бы человечество следовало вашей логике, мы бы жили в пещерах.
1
|
|
|
Модератор
|
||
| 01.04.2017, 14:13 [ТС] | ||
|
2
|
||
| 01.04.2017, 14:25 | ||
|
Не по теме:
0
|
||
|
Заблокирован
|
||
| 01.04.2017, 14:26 | ||
|
0
|
||
|
14126 / 9345 / 1350
Регистрация: 21.01.2016
Сообщений: 35,110
|
|
| 01.04.2017, 15:22 | |
|
0
|
|
|
Модератор
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
|
|
| 05.04.2017, 22:52 | |
|
KolodeznyDiver,
Декларативный подход к созданию гуи не рассматривали?
0
|
|
|
Модератор
|
||
| 05.04.2017, 23:46 [ТС] | ||
|
Добавлено через 45 минут Shamil1, если же вы имеете ввиду использование декларативных языков типа xaml,qml то была мысль в очень дальнейшем их использовать в графическом конструкторе интерфейса, и потом по ним генерить код на Haskell (в рантайме такие форматы читать меня не привлекает совсем). В самих этих форматах лицензии не свободные... ну и я так глубоко в лицензии не закапывался.
0
|
||
|
Модератор
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
|
||
| 06.04.2017, 09:53 | ||
|
использование декларативных языков типа xaml,qml без графического конструктора интерфейса и потом по ним генерить код на Haskell
0
|
||
|
Модератор
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
|
||
| 06.04.2017, 13:15 | ||
|
Возьмём, к примеру, HTML. Мало кто из программистов использует графический интерфейс для создания/редактирования HTML-разметки. При этом создание/изменение HTML в текстовом файле гораздо удобнее/производительнее, чем создание/изменение структуры DOM в коде.
0
|
||
|
Модератор
|
|
| 06.04.2017, 13:56 [ТС] | |
|
Shamil1, я вас понял, но я пока , как свободное время появляется, ядро GUI делаю. Вопрос об использовании разметочных языков пока несколько преждевременный. Про HTML весьма оффтопично. Я воздержусь. По крайней мере в этой теме.
0
|
|
|
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
|
||
| 07.04.2017, 08:45 | ||
|
в принципе от хаскеля почти не отличается
2
|
||
|
Модератор
|
|
| 07.04.2017, 10:05 [ТС] | |
|
pycture, "Не вырисовывается" я написал в контексте декларативного описания GUI. Так то вырисовывается. Ещё бы время было. За ссылку спасибо. При беглом просмотре не вижу там большей декларативности чем у меня. Зато настораживает "Programming of GUI elements in an object oriented style". По хорошему, надо бы и эту либу изучить, но я даже сам clean не знаю. Может как ни будь.
0
|
|
|
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
|
||
| 07.04.2017, 10:20 | ||
|
Добавлено через 3 минуты хе https://www.microsoft.com/en-u... jectio.pdf
0
|
||
| 07.04.2017, 10:20 | |
|
Помогаю со студенческими работами здесь
20
[ubuntu] Как запустить qt-gui программу без gui-интерфейся из консоли? Как запустить GUI приложение (например, notepad.exe) без отображения GUI? LWJGL+ GUI - Выход из рендерного цикла для работы в GUI без потери окна LWJGL и GUI - Выход из рендерного цикла для роботы в GUI без потери окна Как лучше и быстрее из SQL в QVector и в GUI или сразу из SQL в GUI Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|