직수형 정수기를 설치하려고 아마존에서 직구하고 연결 부품은 국내 쇼핑몰에서 구입하는데 주문하는 상품 번호와 이름과 개수를 적고 총 가격을 적으란다. 그래서 이맥스 편집기를 열어서 번호와 이름을 적고 있었는데 왜인지 이렇게 하고 싶었다.
(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
도 있는데 이건 초기값을 줄 수 없는 것 같다.