본문으로 건너뛰기
피드

Coalton 0.2 프리뷰: 커링을 버리고, 키워드 인자와 실수 대수적 수를 품다

backend 약 5분
vote
0
댓글
북마크

Common Lisp 안에 사는 정적 타입 함수형 언어 Coalton이 0.2에서 Haskell 스타일 커링을 버리고 고정 인자 함수로 전환. 키워드 인자, 다중 반환값, 컬렉션 리터럴, 짧은 람다, scoped 타입 변수, 실수 대수적 수(RealAlgebraic) 등 대규모 변경.

  • 1

    Haskell 스타일 커링 폐지 → 고정 인자 함수 (99% 코드가 그대로 컴파일)

  • 2

    키워드 인자와 네이티브 다중 반환값 지원

  • 3

    컬렉션/연관 리터럴 문법과 컴프리헨션 추가

  • 4

    RealAlgebraic 타입으로 정확한 대수적 수 연산 가능

  • 5

    forall로 scoped 타입 변수 도입, HM 사운드니스 문제 수정

고정 인자(fixed arity) 함수 — 커링을 버리다

  • Coalton은 Common Lisp 안에 사는 정적 타입 함수형 언어인데, 0.2 버전 프리뷰에서 꽤 큰 변화들을 공개함. 가장 큰 건 Haskell 스타일 커링을 버리고 고정 인자 함수로 전환한 것

  • 기존에는 (define (f x y z) (+ x (* y z)))의 타입이 Num :a => :a -> :a -> :a -> :a여서 (f 1)이나 (f 1 2) 같은 부분 적용이 자유롭게 가능했음. 이게 Coalton의 정체성 같은 거였는데 과감하게 바꿈

  • 바꾼 이유가 실용적임:

    • API 설계가 "부분 적용하기 편한 순서"에 끌려다니는 문제 해소
    • 클로저 할당이 암묵적으로 발생하는 문제 해결
    • 인자 수를 잘못 넣으면 타입 에러가 엉뚱한 데서 나오던 게 이제 호출 시점에서 바로 잡힘
    • 키워드 인자, 옵셔널 인자 등 풍부한 호출 규약의 기반이 됨
  • 재밌는 건 이 스위치를 켰을 때 99%의 코드가 그대로 컴파일됐고, 타입 시그니처만 깨졌다는 것. 커링 스타일이 실제로는 거의 안 쓰이고 있었다는 증거

키워드 인자와 다중 반환값

  • 고정 인자 덕에 키워드 인자가 자연스럽게 들어옴. 예: (open "data.csv" :direction Output :if-exists Supersede) — 디폴트값이 있고 호출 시 선택적으로 오버라이드 가능

  • 다중 반환값(multiple value returns)도 네이티브로 지원됨. 기존에는 Tuple을 반환하고 컴파일러가 heuristic하게 언박싱했는데, 이제 (values ...) 형태로 명시적 다중 반환을 하고 let (values a b) = ...로 받음

  • UnitVoid의 역할도 재정의됨. 이제 인자가 없는 함수는 Void -> ..., 반환값이 없는 함수는 ... -> Void 타입을 가짐

컬렉션 리터럴과 컴프리헨션

  • 드디어 [1 2 3] 같은 컬렉션 리터럴 문법이 생김. FromCollection 타입 클래스를 구현한 모든 타입에 오버로딩됨. ["hello" => 1 "world" => 2] 같은 연관 컬렉션 문법도 지원

  • 컴프리헨션도 됨: [name => i for i in (up-to 10) with name = (number-name i)] 이런 식으로 HashMap을 선언적으로 생성 가능

짧은 람다 문법과 scoped 타입 변수

  • 커링을 버린 대신 짧은 람다 문법을 도입: (fn (x) (* x x))\x.(* x x)로 쓸 수 있음. 오버헤드가 \. 단 2글자

  • forall로 스코프 있는 타입 변수 도입. declare에서 선언한 타입 변수를 define 본문에서 직접 참조 가능해져서, 타입 꼼수 없이 깔끔하게 코드를 작성할 수 있게 됨

실수 대수적 수(Real Algebraic Numbers)

  • CAD처럼 정확한 수치 비교가 필요한 분야를 위해 RealAlgebraic 타입 추가. $\sqrt{2+\sqrt{3}} = \frac{\sqrt{2}}{2}(\sqrt{3}+1)$을 부동소수점 근사 없이 정확하게 증명 가능

  • F32로는 두 값이 같아 "보이지만" 확신 못 하는 문제를, RealAlgebraic으로 바꾸면 (== a b)가 정확한 결과를 반환함. 엡실론 비교 같은 거 필요 없음

  • 이런 고급 수학 기능들은 별도 모듈 coalton/xmath로 분리됨. 이원수(dual numbers), 임의 정밀도 부동소수점, 계산 가능한 실수, FFT 등 포함

기타 변경사항

  • Hindley-Milner 타입 시스템의 가변성 관련 사운드니스(soundness) 문제를 약한 타입 변수(weak type variables) 도입으로 해결
  • 표준 라이브러리 네이밍을 coalton-library/foo에서 coalton/foo로 변경
  • Coalton 0.2는 2026년 3월 23일 출시 목표였고, 0.3에서는 선형/아핀 타입과 명시적 리소스 관리를 검토 중

실용성을 위해 '언어의 정체성'이었던 커링까지 과감히 버리는 결단이 인상적. 99% 호환성은 이 결정의 정당성을 잘 보여줌.

댓글

댓글

댓글을 불러오는 중...

backend

잘못된 추상화보다 중복이 낫다는 샌디 메츠의 고전 조언

샌디 메츠는 중복을 없애려다 잘못된 추상화를 만들면 코드가 조건문과 파라미터로 부풀어 더 위험해진다고 말한다. 이미 틀어진 추상화는 억지로 보존하지 말고, 다시 호출부에 인라인해서 중복을 되살린 뒤 현재 요구사항에 맞는 새 구조를 찾는 편이 빠르다는 주장이다.

backend

리눅스 커널, 6년·360개 넘는 패치 끝에 strncpy 제거

리눅스 커널이 오랫동안 버그의 원인이던 strncpy API 사용을 Linux 7.2에서 제거했어. NUL 종료 동작이 직관적이지 않고 불필요한 zero-fill로 성능 문제도 있던 API를 6년 동안 약 362개 커밋으로 걷어낸 작업임.

backend

덕디비는 왜 빠를까: 서버 없는 분석 엔진의 내부 구조 뜯어보기

DuckDB가 단일 바이너리, 인프로세스 실행, 컬럼형 저장, 최적화 패스, Parquet 푸시다운으로 빠른 분석 쿼리를 처리하는 방식을 깊게 설명한 글이다. 6GB Parquet 파일을 노트북에서 바로 SQL로 읽는 경험 뒤에 어떤 설계가 깔려 있는지 따라간다.

backend

피지독, 포스트그레스를 수평 확장시키겠다고 550만 달러 투자 유치

피지독은 포스트그레스 앞단에 프록시를 두고 샤딩과 라우팅을 처리해 수평 확장을 가능하게 하겠다는 오픈소스 프로젝트다. 이미 프로덕션에서 초당 200만 건이 넘는 쿼리를 처리하고, 확인된 규모만 20테라바이트 이상을 샤딩했다고 밝히며 550만 달러 투자를 공개했다.

backend

펜타시스템, EDB 포스트그레SQL로 국내 엔터프라이즈 DB 전환 시장 공략

펜타시스템테크놀러지가 EDB와 파트너 계약을 맺고 국내에 EDB 포스트그레SQL 기반 데이터 플랫폼을 공급한다. 기존 상용 DBMS 정책 변화로 비용 부담이 커진 기업들을 겨냥해, 오픈소스 기반 엔터프라이즈 데이터 플랫폼 전환 수요를 잡겠다는 전략이다. 금융, 공공, 제조, 유통, 클라우드, AI 데이터 분석 환경까지 적용 범위를 넓히려는 움직임이다.