Haskell로 GTK 4·libadwaita 할 일 앱 만들기, haskell-gi와 Elm 아키텍처 1부
- Haskell로 GTK 4와 libadwaita를 써서 할 일 목록 앱을 만드는 연재의 1부이며, haskell-gi 툴킷이 GTK C API에서 하스켈 바인딩을 자동 생성함
- Elm 아키텍처(Model, View, Update, Message, Effect)를 따라 UI 상태와 부수 효과를 자료 구조로 모델링해 GTK의 명령형 성격을 다룸
- 모델은
Map TodoId Todo와nextId로, 메시지는Add Text와SetDoneStatus TodoId Bool로, 효과는Save [Todo]로 정의함 - update 함수는 새 모델의 todos가 이전과 같은지 비교해 달라진 경우에만 디스크 저장 Effect를 반환함
- 예제는
Adw.ApplicationWindow로 제목 Todos, 480x640 크기의 빈 창을 띄우는 코드까지 보여주고 전체 프로젝트는 GitHub의 adwaita-todo 저장소에 공개했으며, 대상 독자는 개발 경험이 있는 중급 하스켈러임
Hacker News opinions
사이트 CSS에서 .backdrop::after의 backdrop-filter를 .backdrop picture의 filter로 바꾸면 스크롤 성능이 공짜로 올라감
맞아, 스크롤이 너무 버벅여서 읽기 힘들더라. 주제가 GUI인데 아이러니함
데스크톱이든 모바일이든 브라우저 리더 모드 아이콘 누르면 됨. 이런 경우랑 페이월 팝업 뜨는 사이트에 유용함
Haskell로 GUI 몇 년째 만드는데 react-banana나 reflex 씀. gtk-gi 시그널 직접 연결하면 금방 지저분해짐. Elm 아키텍처는 종이 위에선 깔끔한데 위젯 트리에서 오는 비동기 이벤트를 콜백 지옥 없이 어떻게 처리함? GI 콜백을 전부 채널로 감싸서 update 루프에 넣나?
혹시 이거 로컬 HTTP 포트 열어서 브라우저로 접속하는 방식임? 아니면 Tauri나 Electron 같은 건가?
Haskell 쓰면 리눅스에서 패키지 지옥 생기는 거 감안해야 함. Pandoc이 그걸로 악명 높음. 그냥 C++ 쓰는 게 낫다
그건 배포판 잘못임. Arch는 패키징이 사용자 친화적이지 않은데 Fedora에선 그런 문제 못 겪음
배포판이 Haskell 라이브러리를 정적 링크 안 함? Pandoc 설치에 libgmp만 필요하던데
NixOS에서 Haskell 경험 좋음. 배포판 따라 다른 듯. Arch 같은 데선 GHCup 쓰고 시스템 패키지 매니저 밖 /home에 두는 게 나음. Pandoc 자체는 어느 배포판에서도 문제 없었음
import GI.Awd qualified as Adw 이거 오타임? 제발 오타라고 해줘
LSP가 Adw.foo 보고 GI.Awd에서 찾아서 쓰던 이름으로 임포트하라고 해주는 걸 수도 있음
아직도 GTK 쓰는 사람 있나? ruby-gtk2부터 배웠는데 GTK3는 어떤 면에서 더 나빴고 CSS 지원이 좀 나아졌음. GTK4 오면서 move(0,0) 같은 기본적인 게 다 깨졌고 이제 GNOME 툴킷이 됨. GTK5는 wayland 전용이라 더 심함. GTK 개발자랑 대화하는 건 시간 낭비임
McCLIM이 더 나음
GTK는 그냥 기본 툴킷이었음. Qt가 낫긴 한데 GTK는 어차피 깔려 있음. GTK4는 폰트 다이얼로그를 XDG 포털로 대체했는데 macOS나 Windows엔 그게 없음. 거기선 창 위치도 못 잡음. IUP 포크로 백엔드 14개 작업했는데 GTK4가 제일 최악이었음
GTK3는 보기 좋고 평범한 인터페이스 나옴. 개발은 미칠 것 같았는데 AI 덕에 마찰이 사라져서 Claude로 앱 몇 개 만들었음
쓰는 사람 많음. GTK4/Adwaita 앱 목록도 있음, arewelibadwaitayet.com
위젯은 모나드임? 아무튼 이 예제들 보면 Haskell이 최고의 명령형 언어라는 게 증명됨
진짜 명령형 언어 잘 만듦. FFI 다룰 줄 알면 IO 모나드가 C보다 나음
Widget은 모나드 아님. 포인터 뉴타입에 GTK 클래스 계층 흉내낸 클래스임