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-10-30


Setagayaプロジェクト (1)

| 19:58 | Setagayaプロジェクト (1) - わだばLisperになる を含むブックマーク はてなブックマーク - Setagayaプロジェクト (1) - わだばLisperになる

UNIXで生活している上で初期化ファイルは非常に大事でまた愛着が湧くものでもあり、また人様の初期化ファイルは非常に勉強になったり興味深かったりします。

The very unofficial dotemacs homehttp://www.dotfiles.com/:tilte=www.dotfiles.comのようなサイトもある位ですが、Common Lispのユーティリティにも自分は同じようなものを感じます。

そういうユーティリティを集めて便利に使えたら良いなと思い、Google Codeでプロジェクトを作ってみました。

いちいち考えがまとまらず、ちぐはぐな感じで、結局ただのファイル置場な気が気がしますが、Common Lispのユーティリティを作るのが趣味でネット上にファイルを置いてみたいという方、是非一緒に遊んで下さい。

Google Code Archive - Long-term storage for Google Code Project Hosting.

今のところ自作のSRFI-1等を置いてみています。

srfi-1.setagaya

gotoを多用したふざけた作りになっていますがとりあえずで置いてみました。

Common Idioms (1)

| 19:25 | Common Idioms (1) - わだばLisperになる を含むブックマーク はてなブックマーク - Common Idioms (1) - わだばLisperになる

どういうわけかAlexandriaは自分の好みに合わずあまり読む気がしないので後回しにして他のものを物色。

Brian Mastenbrook氏(編纂?)のユーティリティ集Common Idiomsを拾い読みしてみることにしました。

Common Idioms→CLiki: common-idioms

asdf-installも可能です。

お題

fconstantly

暗記で再現

;; common-idioms.lisp
(defmacro fconstantly (function &rest arguments)
  (let ((args (gensym)))
    `#'(lambda (&rest ,args)
	 (declare (ignore ,args))
	 (funcall ,function ,@arguments))))

できた。次のreducenで必要なので先にこちらを。constantlyの関数を返す版というところでしょうか。

(mapcar (fconstantly #'gensym) '(foo bar baz))
;=>(#:G1234 #:G1235 #:G1236)

というonce-onlyのようなマクロを作るときにマクロ内部で使う位しか使い道が思い浮かばないですが、もっと強力で便利な使い道があるのかもしれません。

お題

reducen

暗記で再現

;; common-idioms.lisp
(defmacro reducen (n fn l &rest initials)
  (if (not (= (length initials) n))
      (error "initialsの長さとnの数値は一致している必要があります。")
      (let ((ilist (mapcar (fconstantly #'gensym) initials))
	    (nlist (mapcar (fconstantly #'gensym) initials)))
	(with-gensyms (fnname e)
	  `(let ((,fnname ,fn)
		 ,@(mapcar #'list ilist initials))
	     (mapc (lambda (,e)
		     (multiple-value-bind 
			   ,nlist
			 (funcall ,fnname ,@ilist ,e)
		       (psetq ,@(reduce #'append (mapcar #'list ilist nlist)))))
		   ,l)
	     (values ,@ilist))))))

できた。多値を扱えるreduceとのこと。動作が思い描けず大分試行錯誤。このマクロの使い方自体、自分にとっては複雑ですぐ忘れてしまいそうです。

エラーが日本語なのは、エラーメッセージの文言を忘れてしまったためです…。

;; 動作
(reducen 2 
	 (lambda (a b e) (values (cons (1+ e) a) (cons (1- e) b)))
	 '(1 2 3 4)
	 nil nil)
;=> (5 4 3 2),(3 2 1 0)

ゲスト



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