종이책으로 소장 중인데 다시 읽어봐야겠음. 당시 독특한 개성과 유익한 내용이 무척 좋았고, 배운 내용 대부분을 실제로 쓰지는 않았지만 정말 좋아한 책임.
다른 언어의 매크로 기능에는 왜 이런 과장된 찬사가 나오지 않을까요? 다른 언어의 매크로 기능이 어떤 면에서 떨어지는 건가요?
Lisp는 동형성(homoiconicity) 과 강력한 매크로 시스템을 함께 갖춰서, 매크로를 비교적 쉽게 작성할 수 있고 생성된 코드도 그럭저럭 이해하기 쉬움.
Scheme 같은 다른 Lisp 계열을 제외하면, 내가 아는 비슷한 수준의 매크로 시스템은 OCaml의 p4뿐인데 사용하기가 끔찍하게 어려움. 적어도 마지막으로 살펴봤을 때는 그랬음. REBOL도 Lisp 매크로와 매우 비슷한 일을 할 수 있었지만, 스코프 처리 방식 때문에 변수 이름 충돌을 방지하는 위생적 매크로를 만들기 어려웠음.
Prolog의 goal_expansion과 term_expansion도 흥미로움. 실행되면서 소스 코드를 수정하는 평범한 Prolog 규칙이며, Prolog 역시 동형성을 갖추고 있어 사용하기가 매우 쉬움.
다만 표준 기능이 아니라서 지원하지 않는 Prolog 시스템도 있고, 지원하더라도 구현이 미묘하게 다르기도 함.
초기의 과장된 찬사 상당수는 주된 비교 대상이 C였던 시절에 나온 것으로 봄. 둘 사이의 차이는 실제로 엄청남.
대체로 그렇고, 다른 언어에는 동형성이 없는 경우가 많기 때문임.
다른 언어에도 그런 찬사가 있음. 오늘 lobste.rs 첫 화면에 나온 글은 Verus를 Rust의 킬러 앱으로 꼽으며, 비슷한 도구 중에는 더 유망해 보이는 것도 있다고 함.
시스템 프로그래밍에서 Rust와 C++만 비교하면 복잡한 득실이 있지만, Rust + Verus와 C++를 비교하면 Rust 쪽이 압도적이라 C++는 고려할 가치조차 없다는 내용임. Verus는 Rust의 매크로로 구현돼 있음. C++에서 Verus 같은 것을 만들려면 추상 구문 트리(AST) 수준의 리플렉션이 필요할 것이라는 대목도 있음. https://lobste.rs/s/lrpb0m/for_first_time_c_standard_failed_pass