コードの形

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中で、副作用のある関数を避けろという意味で使われていました

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.