CommonLisp (w/o LOOP-macro) / LeetCode "1614. max nesting depth of the parentheses"
어제 작성한 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 플랫폼에서)
흥미로웠다.