"One of the nice things about getting older is that you come to understand that you can integrate multiple aspects of your life together. When you're young, you think everything has to be binary, as that's exactly how you feel at that age".
- Min Jin Lee

CommonLisp (w/o LOOP-macro) / LeetCode "1614. max nesting depth of the parentheses"


어제 작성한 LOOP매크로을 이용한 구현 을 풀어서, 만약 LOOP매크로가 없었더라면 어떻게 짰을지 작성해봤다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
(defun max-nested-parentheses-raw (s)
  (declare (optimize (speed 3) (safety 0))
           (type simple-string s))
  (let ((n 0)
        (result 0))
    (declare (type fixnum n result))
    (dotimes (s--cur-idx (length s))
      (let ((ch (elt s s--cur-idx)))
        (when (member ch '(#\( #\)))
          (incf n (if (eql #\( ch) 1 -1))
          (setf result (max n result)))))
    result))

여전히 타입을 지정해서 자동으로 타입추론, 최적화 하도록 했다.

그런데 여전히 dotimes, when, incf, max 같은 커먼리습 HyperSpec에서 표준에 포함시킨 매크로 등을 사용했다. 물론 이런 것들도 다 풀어서 작성해도 되겠지만 별 의미는 없을 것 같아서.

CommonLisp / LeetCode "1614. max nesting depth of the parentheses"


작성한 코드

1
2
3
4
5
6
7
8
  (defun max-nested-parentheses (s)
    (declare (optimize (speed 3) (safety 0))
             (type simple-string s))
    (loop with n fixnum = 0
          for ch across s
          when (member ch '(#\( #\)))
          do (incf n (if (eql #\( ch) 1 -1))
             maximizing n))

코드 의도

  1. 우아한 코드보다는 공간복잡도가 O(1) 이고 싶었다.

Edit

  1. SBCL에 맞춰 코드에 타입을 지정해줘봤다.

    1. 결과 어셈블리 코드가 조금 짧아졌다.

Ping 19/Oct/2020


가을

도르트문트 집은 꽤 평화로웠다. 날씨가 좋은 날도 많고 공기도 맑았다. 한가한 주말이 되면 창문을 열고 잔디가 깔린 정원을 보며 담배를 태우고 커피를 내려 마셨다.

그리고 지하세탁장에 빨래를 돌려놓고 핑크플로이드의 다크사이드 오브 더 문 앨범을 좋은 스피커로 틀어놓았다. 잘 어울렸다.

서울의 변두리에서 맞는 이번 가을은 그런 기분이다. 조용하고 가을 햇살과 공기가 맑아졌다.

그리고 핑크플로이드를 그렇게 여유롭게 들을 수 있었다.

Ping (2nd) 17/Oct/2020


올해 초 cl-state-machine 라이브러리를 만들어 공개한 이후로 커먼리습을 쓰지는 않았다.

다른 직업상 쓰는 언어들만을 쓰고 오픈소스와 개인적으로 만들고 싶은 프로젝트를 위해서 쓰는 언어인 커먼리습은 미뤄두었었다.

다시 커먼리습을 해야겠다고 생각이 들었다. 개인적으로 만들고 싶은 프로젝트도 있고, 그 프로젝트를 위해서 프론트엔드를 만드는데 React와 Vue을 써보고 이해하고 있어도 쓰고 싶지는 않기 때문이다.

사실 커먼리습은 그렇게 문법이 예쁘지도, 멋진 React와 같은 멋진 프레임웍이나 최신의 유행하는 라이브러리들을 모두 갖고 있지도 않다.

HyperSpec을 읽다 보면 아주 쉽게 정의되어 있는 키워드들이 일관성이 있지도, 지금 시대의 관점에서 보기에 익숙한 현대적인 용어들을 사용해서 이름을 지어놓지도 않았다.

Ping 17/Oct/2020


웹프론트엔드 개발을 조금씩 해보고 있다. 처음에는 예전 방식으로만 하려고 하다가 조금씩 겨우 써보던 webpack을 다시 가이드를 차근차근 공부하고 동작하는 방식을 이해하도록 뜯어보고 돌려봤다.

생각보다 단순하게, 그리고 확장성 있게 쓸만한 빌드도구였다.

다만 문제는 설정이 복잡하고 이해하기 힘든 점보다는 빌드 시간이 너무 느린 점이었다. (내게는)

그래서 parcel bundler을 시도 했는데, 설정도 거의 필요 없이 바로 동작하고 하는 점은 좋고, 성능도 정말 빨랐다.

다만 Vim/Emacs으로 파일을 편집하고 저장할 때, parcel watch 대상인 파일들을 종종 아예 dev-server을 재시작해야만 제대로 동작하는 상태로 빠지는게 조금 짜증났다. 기본으로 webpack보다는 이런 자잘한 부분이 좀 덜 다듬어진걸까 싶다.1