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-22


Lisp関係の文献の翻訳

| 07:31 | Lisp関係の文献の翻訳 - わだばLisperになる を含むブックマーク はてなブックマーク - Lisp関係の文献の翻訳 - わだばLisperになる

このブログのテーマであるLispやレトロコンピューティング系の情報/文献というとやはり英語圏のものがほとんどで、英語が苦手な自分は文献が存在することは分かっていても内容がちっとも把握できないというもどかしさを日々感じているわけなのですが、そんなLispとレトロコンピューティング系の面白い文献を翻訳し公開されている素敵過ぎるブログ(okshiraiさんのブログ)をみつけたので何点か紹介させてもらいたいと思います!!

okshiraiさんのブログ

エラー:So-netブログ

沢山翻訳されているのですが、何点か取り上げるとすると、まずは、

Guy L. Steele Jr氏と、Richard P. Gabriel氏の

The evolution of Lispの翻訳

これは、Lispの歴史を俯瞰したもので読み応えがあります。

Peter Norvig氏とKent Pitman氏の

Tutorial on Good Lisp Programming Styleの翻訳

こっちは、以前にこのブログでも触れたLispのプログラミングにおけるスタイルについてまとめられたもの。ためになりました!

その他、Paul Graham氏のArc関連のものや、Interlisp関連のもの、Richard Greenblatt氏の2002年のObjective Lispの提案等々盛沢山。さらに、現在Computer History MuseumのGreenblattやAlan Kotok氏のインタビューも翻訳されている最中です。

自分にとってはまさにお宝の山であり、小一時間ディスプレイの前で「うぉー、すげー」と叫んでおりました。

これからもどんどん続けて行って頂きたいです。

Paul Graham氏のユーティリティ その9

| 06:43 | Paul Graham氏のユーティリティ その9 - わだばLisperになる を含むブックマーク はてなブックマーク - Paul Graham氏のユーティリティ その9 - わだばLisperになる

PG氏のユーティリティを読んでみることの9回目。

ハッシュ操作のユーティリティ編です。

Lisp utilities that were not included in On Lisp or ANSI Common Lisp

お題

nonempty-ht

暗記で再現

(defun nonempty-ht (ht)
  (maphash (lambda (k v) (declare (ignore k v)) (return-from nonempty-ht t))
	   ht)
  nil)

できた。ハッシュが空かどうかを確認するものらしい。

オリジナルだと警告が出るので(declare (ignore~))を追加しています。

;; 動作
(setq foo (make-hash-table))
(nonempty-ht foo)
;-> nil
(setf (gethash 'foo foo) "foo!")
(setf (gethash 'bar foo) "bar!")
(nonempty-ht foo)
;-> T

お題

ht-car

暗記で再現:間違い

(defun ht-car (ht)
  (maphash (lambda (k v) (declare (ignore v)) (return-from ht-car k))
	   ht))

;; 正解
(defun ht-car (ht)
  (maphash (lambda (k v) (declare (ignore k)) (return-from ht-car v))
	   ht))

間違えた。返す値はキーじゃなくて値の方でした。

最初にヒットした値を返すというものらしい。

;; 動作
(ht-car foo)
;=> "foo!"

お題

hash-keys

暗記で再現

(defun hash-keys (ht)
  (let (acc)
    (maphash (lambda (k v) (declare (ignore v)) (push k acc))
	     ht)
    acc))

できた。ハッシュのキーを集めて返すというものらしい。

これも、declareを追加しています。また、オリジナルは、(let ((acc nil))~と丁寧に書いています。

(let ((acc nil))、(let ((acc))、(let (acc))と3つ位書き方があると思いますが、自分はなんとなく、(let (acc)~)派です。

そういえば、オリジナルは、#'(lambda(x)~)ですが、自分は(lambda (x)~)と書いてます。

これは、Emacs Lisp、Scheme、Common Lispで記法が統一できるので、なんとなく…。

;; 動作
(hash-keys foo)
;=> (BAR FOO)

お題

hash-vals

暗記で再現

(defun hash-vals (ht)
  (let (acc)
    (maphash (lambda (k v) (declare (ignore k)) (push v acc))
	     ht)
    acc))

できた。hash-keysの兄弟でキーか、値かの違いだけです。

;; 動作
(hash-vals foo)
;=> ("bar!" "foo!")

お題

hash-pairs

暗記で再現

(defun hash-pairs (ht)
  (let (acc)
    (maphash (lambda (k v) (push (cons k v) acc))
	     ht)
    acc))

できた。これも上記2つと同系統で、値とキーのalistをまとめて返すというもの。

;; 動作
(hash-pairs foo)
;=> ((BAR . "bar!") (FOO . "foo!")) 

お題

somehash

暗記で再現

(defun somehash (fn ht)
  (maphash (lambda (k v) (declare (ignore k)) 
		   (when (funcall fn v)
		     (return-from somehash v)))
	   ht)
  nil)

できた。その名の通りsomeのハッシュ版といったもの。

;; 動作
(somehash #'stringp foo)
;=>"foo"
(somehash #'symbolp foo)
;=> nil

お題

key-match

暗記で再現

(defun key-match (ht1 ht2)
  (maphash (lambda (k v) (declare (ignore v))
		   (when (gethash k ht2)
		     (return-from key-match k)))
	   ht1)
  nil)

できた。二つのハッシュテーブルに同じキーが存在するかを調べるものらしい。

;; 動作
(setq foo (make-hash-table)
      bar (make-hash-table))

(setf (gethash 'foo foo) "foo2"
      (gethash 'foo bar) "foo2")

(key-match foo bar)
;=> FOO

お題

write-hash

暗記で再現

(defun write-hash (ht str)
  (maphash (lambda (k v) (print (cons k v) str))
	   ht))

できた。ハッシュテーブルの内容をprintで指定したストリームに表示するというもの

;; 動作
(write-hash foo t)
;-> FOO

お題

read-hash

暗記で再現:間違えた。

(defun read-hash (ht str)
  (do-stream pair str
    (setf (gethash (car pair) ht)
	  (cdr pair)))
  nil)					;正しくはhtを返す

間違えた。処理の後には、ハッシュテーブルを返すところをnilにしてしまった。

read-hashとはなっているが、ストリームから読み込んだ、alistをハッシュテーブルに格納する動作に思える。

;; 動作
(setq quux (make-hash-table))

(with-input-from-string (str "(foo . fooo) (bar . barr) (baz . bazz)")
  (read-hash quux str))

(hash-pairs quux)
;=>((BAZ . BAZZ) (BAR . BARR) (FOO . FOOO)) 

ゲスト



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