Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2007-12-23

お題: 法演算

| 06:03 | お題: 法演算 - わだばLisperになる を含むブックマーク はてなブックマーク - お題: 法演算 - わだばLisperになる

一時期、集中的に熱中してどう書く.orgに参戦して、自作のうんこちゃんクオリティのプログラムを投下していましたが、アルゴリズムを捻り出すような問題が多くなってきてしまったので、元が捻り出せない自分は挫折しておりました。

でも、やっぱり勉強になるのでできそうなもの位は投稿してみることにしました。

今回は、法演算ということですが、問題を見にいった時にschemeでの解答を見てしまったため、もう、それ以外の方法の解答は考えられなくなってしまい、結局パクリになりました。

(defmacro with-mod (div &body body)
  `(%with-mod ((+ - * /) ,div) ,@body))

(defmacro %with-mod (((&rest fns) div) &body body)
  (let ((g (gensym)))
    `(let ((,g (labels ,(mapcar
                         (lambda (fn)
                           `(,fn (&rest expr) 
                                 (mod (apply (symbol-function ',fn) expr) ,div)))
                         fns)
                 ,@body)))
       (if (numberp ,g) (mod ,g ,div) ,g))))

という解答でしたが、

%with-modは、fletにするべきでした。再帰してる訳でもないしsymbol-functionもいらなくなるし…。

こういうのは大体投稿してから気付くという。

(defmacro %with-mod (((&rest fns) div) &body body)
  (let ((g (gensym)))
    `(let ((,g (flet ,(mapcar
		       (lambda (fn)
			 `(,fn (&rest expr) 
			       (mod (apply #',fn expr) ,div)))
		       fns)
                 ,@body)))
       (if (numberp ,g) (mod ,g ,div) ,g))))

どう書く.orgのCommon Lisp部は、一時賑やかだったみたいですが、自分が参加し始めた9月頃からは、常駐組は恐らく1、2名程になってしまいました。もしかしたら、どう書く.org自体への参加者が減ってるのかもしれませんが…。ちなみに、Common Lisp部は自分が全体のレベルを下げておりますので、参加する際の敷居は低いと思われます。