직수형 정수기를 설치하려고 아마존에서 직구하고 연결 부품은 국내 쇼핑몰에서 구입하는데 주문하는 상품 번호와 이름과 개수를 적고 총 가격을 적으란다. 그래서 이맥스 편집기를 열어서 번호와 이름을 적고 있었는데 왜인지 이렇게 하고 싶었다.

(let ((order
       '(((6 "1/4안전클립" 1000) . 1)
         ((10 "1/4체크밸브" 3000) . 1)
         ((16 "컷팅피팅분리기(고급형)" 4000) . 1)
         ((37 "1/4:3/8픽스엘보" 1000) . 2)
         ((50 "1/4호스(길이3m)" 1000) . 1)
         ((55 "호스고정부품(10세트)" 1000) . 1)
         ((57 "소형고급아답터(6mm호스용)" 5000) . 1)
         ((76 "홀커터" 3500) . 1)
         ((79 "듀얼세척솔" 3000) . 1))))
  (seq-reduce
   (lambda (l1 l2)
     (pcase `(,l1 ,l2)
       (`((,desc . ,price)
          ((,inum ,iname ,iprice) . ,num))
        (cons (concat desc (if (string= "" desc) "" ", ")
                      (number-to-string inum) "번-"
                      iname "/"
                      (number-to-string num) "개")
              (+ price (* iprice num))))))
   order '("" . 0)))

("6번-1/4안전클립/1개, 10번-1/4체크밸브/1개, 16번-컷팅피팅분리기(고급형)/1개, 37번-1/4:3/8픽스엘보/2개, 50번-1/4호스(길이3m)/1개, 55번-호스고정부품(10세트)/1개, 57번-소형고급아답터(6mm호스용)/1개, 76번-홀커터/1개, 79번-듀얼세척솔/1개" . 23500)

처음에는 장황하게 만들었다가 Emacs Lisp이 Pattern Matching을 지원하는 걸 알게 돼서 소스가 간편하게 되었다. 해스켈의 foldl과 같은 것으로는 seq-reduce가 있었다. 그냥 reduce도 있는데 이건 초기값을 줄 수 없는 것 같다.