
Hoot 0.10.0이 출시됐다. Guile용 Scheme-to-WebAssembly 컴파일러 백엔드이자 범용 WebAssembly 도구 모음인 Hoot의 이번 버전은 R6RS 호환 모듈과 기능을 추가하고 런타임·명령줄 오류를 수정했다.
Hoot는 Scheme 코드를 브라우저에서 실행할 수 있게 한다. 이번 릴리스에는 5월에 나온 0.9.0 이후 추가된 기능과 버그 수정이 담겼다.
Lisp 게임 잼에서 Hoot 사용하기
가을 Lisp Game Jam은 2026년 10월 30일 금요일에 시작하며, 참가자들이 좋아하는 Lisp 방언으로 게임을 만드는 10일간의 행사다. Hoot로 Scheme 기반 웹 게임을 만들려는 참가자는 Hoot 게임 잼 템플릿을 활용할 수 있다. 이 프로젝트 템플릿은 Hoot로 HTML5 게임을 빠르게 만들기 위한 구성 요소를 제공한다.
- HTML5 캔버스로 상호작용하는 게임을 만드는 데 필요한 웹 API 바인딩
- 컴파일, 개발용 웹 서버 실행, itch.io에 업로드할
.zip묶음 생성용 Makefile - 각 구성 요소를 연결하는 방법을 보여주는 간단한 Breakout 방식의 예제 게임
이전 잼에서 Hoot로 만든 게임으로는 Cirkoban, Strigoform, Shields TYVM이 있다.
컴파일러와 런타임 변경
컴파일러는 중복 가져오기 오류에 모듈 이름을 추가해 오류가 발생한 위치를 파악하기 쉽게 했다. R6RS 호환을 위해 라이브러리 버전 관리 지원도 추가했다. define-module 라이브러리의 기본 버전을 수정했으며, locate-library가 설정된 로드 확장자를 따르지 않던 문제도 고쳤다. 이전에는 Hoot 자체의 설정 대신 Guile의 로드 확장자 매개변수를 사용했다.
런타임에는 인터프리터로 정의한 레코드 형식에 접근하는 %struct-ref와 %struct-set! 프리미티브가 추가됐다. 런타임 모듈 시스템에서 정의되지 않은 심볼을 가져올 때 오류를 내지 않도록 바뀌었다. Guile은 이 경우 엄격하게 동작하지 않으며, Hoot의 엄격한 처리가 호환성 문제를 일으켰기 때문이다.
primitive-eval의 선택적 인수 파싱과 선택적 인수 및 키워드 인수를 함께 받는 프로시저의 키워드 인수 파싱을 수정했다. 런타임 모듈 레지스트리 관련 오류 메시지에는 올바른 CLI 플래그인 -fruntime-modules가 표시되도록 고쳤다.
Scheme 기능과 라이브러리
SRFI-13 문자열 라이브러리의 부분 구현을 추가했다. Guile과 비슷하게 재내보내기 집합만 제공한다. Guile의 SRFI-13 모듈은 선언형이 아니어서 Hoot 컴파일러가 거부하기 때문이다. SRFI-60 정수 비트 연산도 부분 구현했다.
(guile)에는 define-macro, defmacro, delete, list->symbol, symbol을 추가했다. 같은 모듈에서 define-syntax-parameter, syntax-parameterize, symbol-append, integer-length, gensym도 내보내도록 했다. (hoot bitvectors)에는 list->bitvector와 bitvector를 추가하고 이를 (guile)에서 재내보냈다. (rnrs io ports)에는 get-bytevector-all 구현을 추가했다. bytevector=?는 (hoot bytevectors)와 (rnrs bytevectors)에서 공개 프로시저로 내보낸다. define-syntax-parameter와 syntax-parameterize 프리미티브도 추가했다.
(ice-9 exceptions)에서 내보내는 항목을 Guile과 더 비슷하게 개선했다. 다음 R6RS 모듈을 추가했다.
(rnrs)(rnrs base)(rnrs syntax-case)(rnrs r5rs)(rnrs hashtables)(rnrs files)(rnrs enums)(rnrs exceptions)(rnrs arithmetic fixnums)(rnrs records inspection)(rnrs records procedural)(rnrs records syntactic)(rnrs io simple)(rnrs io ports)
R6RS 호환을 위해 (hoot ports)에 port-has-position?를 추가했다. (hoot numbers)에는 중심 나눗셈(현재는 스텁)을, (hoot bitwise)에는 integer-length 스텁을 추가했다. 이 기능은 향후 R6RS 호환을 위한 것이다. (rnrs bytevectors)는 버전 (6)을 사용하는 R6RS 모듈로 다시 작성했다.
수치 처리에서는 부동소수점 소수 부분을 짝수 자릿수로 반올림하도록 number->string을 수정했다. 52 <= N <= 1023인 ±2^N 부동소수점 값에 대한 처리도 고쳤으며, 부동소수점 변환 알고리즘에서 바이트벡터를 잘못 복사하던 문제를 수정했다. 인수가 0개일 때 작동하지 않던 min과 max 매크로, (guile)의 log 프로시저 인수, 완전히 잘못된 동작을 하던 Guile의 negate 구현도 수정했다.
명령줄·문서·브라우저 지원
CLI는 포트 번호가 1에서 65535 사이의 정확한 정수인지 검사한다. 이전에는 해당 검사를 수행하도록 작성한 코드에 도달할 수 없어 잘못된 옵션이나 알 수 없는 하위 명령에 실제로 오류를 알리지 못했다. hoot compile --run=node 실행 시에는 --experimental-wasm-exnref 기능 플래그를 추가한다. 이는 지원되는 NodeJS 버전에서 새로운 Wasm exnref 기능이 기본적으로 활성화되지 않은 경우에도 호환성을 유지하기 위한 조치다.
빌드 시 hoot server를 비활성화하는 기능도 수정했다. 이전 버전의 hoot CLI 스크립트는 ./configure가 선택 사항인 라이브러리를 사용할 수 없다고 판단한 뒤에도 해당 라이브러리를 불러오려 했다. 이 문제를 발견한 mcc에게 감사의 뜻을 전했다.
문서에서는 설명서의 ‘소스에서 빌드’ 절차를 개선했다. README의 ‘고급 경로’ 절에 의존성을 명시했고, 프로젝트 템플릿 README에는 Guix가 필수는 아니지만 여전히 가장 쉬운 선택지라고 적었다.
브라우저 호환 버전은 Safari 26 이상, Firefox 121 이상, Chrome 119 이상이다.
설치와 문서
Hoot는 GNU Guix에서 다음 명령으로 설치할 수 있다.
$ guix pull
$ guix install guile guile-hoot
Hoot는 Debian에서도 제공되지만, 이번 버전이 Debian에 반영되기까지는 시간이 걸릴 수 있다. 그 밖에는 릴리스 타르볼에서 소스 코드를 빌드할 수 있다. 다운로드 링크와 GPG 서명은 Hoot 홈페이지에서 확인할 수 있다. 빌드 안내를 포함한 Hoot 0.10.0 문서도 공개됐다.
버그 신고와 풀 리퀘스트 제출, 개발 진행 상황 확인은 Codeberg의 Hoot 프로젝트에서 할 수 있다. 이번 릴리스에는 Z572, stdh, 월터 루이스(Walter Lewis), 옐러 리흐트(Jelle Licht)가 기여했다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요