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

Posted on Oct 11, 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 와 같이 더 보편적인 리더매크로 표현법이니까. ↩︎