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

Posted on Oct 21, 2020

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

(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에서 표준에 포함시킨 매크로 등을 사용했다. 물론 이런 것들도 다 풀어서 작성해도 되겠지만 별 의미는 없을 것 같아서.

어제 작성한 내용이 얼마나 표현력이 좋았는지, 그리고 그 표현력을 희생하지 않고, 또 반대로 표현력을 그대로 유지하면서도 얼마나 간결하고 효율적인 코드를 생성하는 매크로인지 LOOP-macro에 대해서 생각해볼만하다.

참고로, SBCL 컴파일러에서 disassemble을 해서 보면, LOOP-macro 버젼이 어셈블리 코드가 더 짧다. (90바이트 정도. Linux/x86_64 플랫폼에서)

흥미로웠다.