コードの形
2007/07/23
On Lispで読んだんですが、「コードの見た目がきれいなコードは良いコード」というような話がありました。
最初にOn Lispを読んだときは、lispのコードはどれも同じで奇妙なものに見えていたんですが、好奇心からLispを弄って数ヶ月、言われていたことがわかってきたような気がします。
下は、どう書くに投稿したコードなんですが、税金のかかっている*1関数を使いまくっている関数(selection)は、不恰好に見えます。なんか、あるべき形ではないような歯痒い感じです。気のせいかな?
http://ja.doukaku.org/comment/1369/
(defstruct party vote (seat 0)) (defun max-index (lst) (let ((max 0) (max-index 0)) (loop for x in lst for i from 0 when (< max x) do (setf max-index i) (setf max x)) max-index)) (defun selection (parties) (let* ((selected (max-index (mapcar #'(lambda (x) (/ (party-vote x) (1+ (party-seat x)))) parties))) (selected-party (nth selected parties))) (setf (party-seat selected-party) (1+ (party-seat selected-party))) (loop for p in parties for i from 0 collect (if (eql i selected) selected-party p)))) (defun dhondt (n votes) (labels ((rec (n ps) (if (zerop n) ps (rec (1- n) (selection ps))))) (mapcar #'party-seat (rec n (mapcar #'(lambda (v) (make-party :vote v)) votes)))))
*1:On Lisp中で、副作用のある関数を避けろという意味で使われていました