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


Practical Common Lisp (13)

| 16:59 | Practical Common Lisp (13) - わだばLisperになる を含むブックマーク はてなブックマーク - Practical Common Lisp (13) - わだばLisperになる

引き続きPractical Common Lisp 第4章4. Syntax and Semanticsを読んでメモしてみています。

Function Calls

  • 関数呼び出しのフォームは簡単で、関数名以降の残りのリストを評価して得られた値を関数に渡すだけ。
  • ということは、関数名以降も正規のLispフォームである必要があるということ。
  • 基本形 (関数名 引数*)
  • (+ 1 2)がどう評価させるかを順に辿ると
    1. 1が評価される。
    2. 2が評価される。
    3. これらを、+に渡して処理し、結果として3が返る。
  • もう少し複雑な、(* (+ 1 2) (- 3 4))の場合
    1. (+ 1 2)は、上記より3であることが分かり、(- 3 4)は、-1で、これらが*に渡り、結果として2になる。
  • というように、他の言語では、文法上、個別に特別な形をしているような処理も、Lispでは上記のようになんでも関数処理の流れとして扱い、一貫したものになっていたりする。

お題: 法演算

| 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部は自分が全体のレベルを下げておりますので、参加する際の敷居は低いと思われます。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20071223