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에서 사고 과정을 설명한 방식이 마음에 듦