GN⁺: Pretty.c - Scripting on Top of C
(github.com/aartaka)- Pretty C는 C와 호환되는 새로운 스크립트 언어로, 동적 타이핑, 제네릭 반복, 리소스 추적 등의 기능을 제공
- C 및 모든 라이브러리와의 하위 호환성을 유지함
- Lua, Python, JavaScript, Lisp에서 영감을 받았음.
목표
- C 개발자에게 많은 문법적 달콤함(Sugar)을 제공하여 C를 더욱 쉽게 사용하게 함.
- Lua, Python, JavaScript, Ruby 등 여러 언어를 대체할 수 있는 궁극의 스크립트 언어로 자리매김함.
- 단 하나의 헤더 파일을 포함하여 모든 코드베이스를 초보자 친화적으로 변환함.
시작하기
- GitHub 저장소를 클론하거나
pretty.h
파일을 복사하여 사용할 수 있음.
제공되는 편의 기능
포함된 표준 헤더
-
stdbool.h
로true
,false
,bool
제공 -
stdint.h
로 고정 너비 정수 타입 제공 -
iso646.h
로 가독성 높은 연산자 대안 제공
간단한 매크로
-
max
,min
,len
,default
,limit
,between
,divisible
등의 매크로 제공
새로운 타입
-
string
,byte
,bytes
,any
등의 타입 별칭 제공 -
uchar
,ushort
,uint
,ulong
등의 정수 단축형 제공
새로운 별칭
-
eq
,is
,bitnot
,bitxor
등의 연산자 별칭 제공 -
below
,above
,upto
,downto
등의 비교 연산자 제공 -
even
,odd
,positive
,negative
,zero
,empty
등의 숫자/데이터 프레디케이트 제공 -
nil
,until
,elif
,ifnt
,repeat
,done~/~finish
,pass
등의 별칭 제공
타입 추론 (GCC, Clang, 또는 C23+)
-
var
,let
,local
키워드를 사용하여 타입 추론 가능
제네릭 출력 (C11+)
-
print
,println
으로 다양한 타입의 데이터를 출력 가능
제네릭 동등성 (C11+)
-
equal
로 다양한 타입의 데이터 비교 가능
예쁜 삼항 연산자
-
when
,then
,other
,otherwise
,only
,otherwhen
등의 키워드로 가독성 높은 삼항 연산자 사용 가능
for
매크로
-
foreach
,forthese
,fortimes
,forrange
,forrangeby
등의 매크로로 다양한 반복 패턴 제공
할당 매크로
-
new
,vector
,delete
등의 매크로로 간단한 메모리 할당 및 해제 가능
블록 유틸리티
-
lambda
,with
,defer
,try
,catch
등의 블록 유틸리티 제공
GN⁺의 정리
Pretty C는 C 언어에 다양한 문법적 설탕을 추가하여 개발자들이 더 쉽게 코드를 작성할 수 있도록 돕는 프로젝트임. 특히, C의 하위 호환성을 유지하면서도 Lua, Python, JavaScript 등의 언어에서 영감을 받아 다양한 기능을 제공함. 이러한 기능들은 C 개발자들이 더 간결하고 가독성 높은 코드를 작성하는 데 도움을 줄 수 있음. 비슷한 기능을 제공하는 프로젝트로는 Zig, Nim 등이 있음.
Hacker News 의견
- C 내에서 DSL을 만드는 전통이 오래됨. Stephen Bourne는 C의 전처리기를 사용하여 ALGOL과 유사하게 쉘을 작성하고자 했음
- 이 내용이 농담인지 아니면 저자가 혼란스러운 것인지 명확하지 않음. 스크립팅이 아니며 강한 타입을 도입한다고 주장하지만 실제로는 타입에 대해 아무것도 하지 않음. Lua와 Lisp를 모델로 한 연산자 별칭을 도입하지만 두 언어 모두에 존재하지 않음
- 스크립팅 언어라고 주장하지만 프로그램을 컴파일해야 함. CINT를 추가하면 즉각적인 실행과 REPL을 사용할 수 있음
- C 개발자에게 당뇨병 유발 심장마비를 일으킬 만큼 많은 문법 설탕을 제공함. 재미있음
- Python 2와 같은 실수를 함. 문자열과 바이트는 동일한 타입이 아니며 그렇게 취급해서는 안 됨
- 이 내용이 흥미롭다면 libcello.h도 좋아할 것임
- Java로 작성된 것처럼 보이는 C++ 코드베이스를 검사했던 기억이 남. 모든 것이 카멜케이스로 명명되고, 모든 클래스 변수에 대한 getter와 setter가 있으며, 인터페이스가 곳곳에 있음
- CNoEvil과 ogw에 추가해야 할 몇 가지가 있음. 이 프로젝트가 몇 달마다 다시 나타날 때마다 항상 더 많은 것이 있는 것 같음
- "ifnt"보다 "unless"가 더 읽기 쉬움
- Readme를 pretty.h로 엮을 수 있는지 궁금함. orgfile의 코드블록이 포괄적인지 여부. Readme에서 사고 과정을 설명한 방식이 마음에 듦