rutils으로 커먼리습 확장해서 clojure 비슷하게, 더 편하게

🗓️ 11 Oct, 2019

커먼리습은 CLHS 이후로 언어 자체 정의는 변하지 않았다.

구현체마다 조금씩 확장이 있을수도 있지만 딱히 그렇게 하지도 않는거 같다. 그럴만도 하다고 생각하는게 어차피 커먼리습에서 lisp reader을 확장하는게 CLHS에서 정의해놓은 기능 중 하나이고, 구현체들도 스펙을 잘 구현해놓았으니까.

결국 커먼리습에서 문법이나 그런게 조금 마음에 안들거나 확장하고 싶으면 언제든지 매크로를 만들듯이 확장하면 되니까.

‘커먼리습 언어 자체를 커먼리습으로 프로그램 할 수 있다’

이런 커먼리습 확장 ‘라이브러리’ 들이 여러가지 있는데, 가장 요즘에 쓸만할거 같다고 생각하는건 rutils이다. https://github.com/vseloved/rutils

(eval-when (:compile-toplevel :load-toplevel :execute) ...) 같은거 매번 반복해서 쳐넣는걸 그냥 eval-always으로 바꿔준다거나. gensym하는것도 with-gensyms 제공하거나 하는 이런류의 라이브러리들에서 보통 제공하는것들부터.1

내가 제일 유용할거 같은건:

  1. Clojure 같은 Lambda 함수 표현
  2. Hashtable, Vector, Heredoc String literal 표현
  3. Clojure 같은 ->, ->> threadings macros2
  4. rutils.bind:with: destructuring 편안하게!
  5. rutils.generic:?: nested object에 대해서 편안하게 accessing

리터럴 표현들의 경우에는 sharpsign을 쓰는 문법이 기존 커먼리습 편집기들이랑 별 충돌 없이 잘 동작할듯.3

rutils의 기능들을 일일이 하나씩 소개하지는 않겠음. 그냥 tutorial 주욱 읽고 자기가 커먼리습 코드를 작성할때 참고해서 더 편안하고 깔끔한 코드를 짜는데 도움이 되었으면 좋겠다.



  1. https://common-lisp.net/project/alexandria/draft/alexandria.html ↩︎

  2. .. https://en.wikipedia.org/wiki/Thread_(computing) 이거 말고. ↩︎

  3. 왜냐하면 #... 와 같은 형태로 sharpsign은 http://clhs.lisp.se/Body/02_dh.htm 와 같이 더 보편적인 리더매크로 표현법이니까. ↩︎