Emacs Lisp

このエントリーをはてなブックマークに追加
701699
>>700
なるほど、失礼した。

ところで、なんか有名どころのパッケージ(例えば wl)をみても、下のような
コードでループしているのをよく見かけるのだが、dolist をそもそも知らな
いのか、それとも、dolist を使わない思想的な理由があるのかな?非常に読
みづらくて困る。あと、find-if の類いを使えばループが不要になる部分も多い。

(let (item)
(while list
(setq item (car list))
;; 何か
(setq list (cdr list))))
>>701
clを使わない主義かもね。infoによるとclはconfilictの原因になる
ことがあるらしい。公開するパッケージで使うときには
(eval-when-compile (require 'cl)) しろと書いてある。デバッグ
がめんどくさそう。
>>701
cl を無闇に load しないって思想じゃないの?
↑と書いたけど、今見たらwlはcl使ってた
705702=704:03/09/06 07:56
704は702のことについて書いた。703スマソ
>>701
漏れはてっきり高速化のためにがんがってるんだな〜っと思って一人納得してたんだが.
dolist つかうと catch ... の分が勿体ないとか….あと cl の find とか find-if
ってこんなんじゃん.パフォーマンスが重要なパッケージでは使い難いということなん
だと思ってたけど実は勘違いだったりする?

;; cl (emacs) の find
(defun find (cl-item cl-seq &rest cl-keys)
(let ((cl-pos (apply 'position cl-item cl-seq cl-keys)))
(and cl-pos (elt cl-seq cl-pos))))

;; CMUCL の find
(defun find (item sequence &key from-end (test #'eql) test-not (start 0)
end key)
(declare (fixnum start))
(seq-dispatch sequence
(list-find* item sequence from-end test test-not start end key)
(vector-find* item sequence from-end test test-not start end key)))
末尾再帰さえあれば・・・
708700:03/09/06 15:35
>>701
俺の場合関数型言語とやらがCommonLisp on xyzzy が初めてだったので
最初のほうは dolist とか使いまくりだった。
でも最近は繰り返しは再帰で書くのがLispらしいのかなと思って dolist を
使わずに(末尾再帰でもない)変な再帰で書いてる。
厨丸出しだな俺(w。

>>706
xyzzyのfindはどうってんだろうと思ってみたら組み込みでした。。。


xyzzyって末尾再帰の最適化してんのかなぁ。。。
>>708
xyzzy は末尾再帰の最適化はしてなかったと思う.
まぁ,それとは別に, Common Lisp の場合は dolist とかを使うのが
いいと思うけどね.意図が伝わりやすいし,コンパイラにも優しい(人間は
末尾再帰のつもりでも実は違ったりするからな…).Schemer には異論が
ありそうだけど再帰オンリーよりは,繰り返し的操作には繰り返し,
再帰的な操作には再帰,といったように使い分けるのがいいと思う.
710701:03/09/07 00:50
>>706
こんなテストしてみたが、while と dolist の違いは 10% 以下。これなら
dolist を使えと主張したい。find は position と elt で、きっちり 2 倍に
なっている。再帰は...

(test-run 100 10000) のプロファイル結果。GNU Emacs 21.3.50.1

Function Name Call Count Elapsed Time Average Time
================== ========== ============ ============
test-while 10000 0.3854069999 3.854...e-05
test-dolist 10000 0.4133820000 4.133...e-05
test-find 10000 0.7938209999 7.938...e-05
test-rec 510000 696.79132100 0.0013662574
711701:03/09/07 00:53
>>710 の続き
(defun test-while (item list)
(let (target result)
(while list
(setq target (car list))
(if (eql item target)
(setq list nil
result target)
(setq list (cdr list))))
result))
(defun test-dolist (item list)
(dolist (target list)
(when (eql item target) (return target))))
(defun test-find (item list)
(find item list))
(defun test-rec (item list)
(cond ((null list) list)
((eql item (car list)) (car list))
(t (test-rec item (cdr list)))))
(defun test-generate-list (n)
(let (result)
(dotimes (i n) (push i result))
(nreverse result)))
(defun test-run (n m)
(let ((item (/ n 2)) (list (test-generate-list n)))
(dotimes (i m)
(test-while item list)
(test-dolist item list)
(test-find item list)
(test-rec item list))))
712701:03/09/07 00:55
あ、インデントずれた。
だってdolistってlispらしくないし
while と setq 使うほうがもっと Lisp らしくないじゃん。C みたい。
つまり mapc 使えと?
dolist 便利でいいじゃん。
とても lisp らしいと思うけどなぁ。Schemer の人かな?
>>711
(defun test-while (item list)
 (let (target result)
  (while
   list
   (setq target (car list))
   (if (eql item target)
    (setq list nil result target)
    (setq list (cdr list))))
  result))
(defun test-dolist (item list)
 (dolist (target list) (when (eql item target) (return target))))
(defun test-find (item list) (find item list))
(defun test-rec (item list)
 (cond
  ((null list) list)
  ((eql item (car list)) (car list))
  (t (test-rec item (cdr list)))))
(defun test-generate-list (n)
 (let (result)
  (dotimes (i n) (push i result))
  (nreverse result)))
(defun test-run (n m)
 (let ((item (/ n 2)) (list (test-generate-list n)))
  (dotimes
   (i m)
   (test-while item list)
   (test-dolist item list)
   (test-find item list)
   (test-rec item list))))
たかがくり返しの書き方ここまでこだわってしまうのが
lisper の強みでもあり弱みでもあるな。
だれが何こだわってるの?解説キボンヌ.
俺も分からん。>>718の降臨に期待
改行位置のことか?
全角空白のインデントのこと?
722718:03/09/10 23:31
lisp らしい書き方とか、らしくない書き方とか、そういう話のこと。
美しく書けることに気付くと時間をかけてでも書き直したくなるとか、
そういう誘惑が lisp にはある。
別に >>717 について言った訳じゃないよ。
723701:03/09/11 03:53
>>722
確かに。そういう罠(?)はあるね。でも、リスト処理という Lisp にとってか
なり基本的な操作で、明白にレベルの低い(汚い?)コードは萎える。例えば、
C で繰り返しが全部 goto で書かれていたらダルいよね?
繰り返しは再帰で書けということでつか?
名有り関数の定義なしでシンプルに再帰を書く方法があれば...
lambda ... を λ... にすればよりシンプルになると思う。
726701:03/09/11 19:31
>>724
> 繰り返しは再帰で書けということでつか?

違う。繰り返しを書くときは、まず mapcar, find-if などの高階関数で書け
るかどうかを検討する。書けなければ dolist, dotimes などを使う。それで
も書けなければ、while, loop, 再帰を使う。

高階関数についてはこのへんを参照。
http://www.geocities.co.jp/SiliconValley-Oakland/1680/rakup/rakup13.html

> 名有り関数の定義なしでシンプルに再帰を書く方法があれば...

Scheme の named let が便利。
http://www.geocities.co.jp/SiliconValley-PaloAlto/7043/index.html#tips

(require 'cl)

(defmacro nlet (tag var-vals &rest body)
`(labels ((,tag ,(mapcar #'car var-vals) ,@body))
(,tag ,@(mapcar #'cadr var-vals))))

(defun fact (n)
(nlet loop ((n n) (r 1))
(if (<= n 1) r
(loop (1- n) (* n r)))))
でも nlet は末尾再帰の最適化をしない elisp にはイマイチでない?

(defun sum (n)
(nlet loop ((n n) (r 1))
(if (<= n 1) r
(loop (1- n) (+ n r)))))

(defun sum2 (n)
(do ((n n (1- n))
(a n (+ a (1- n))))
((<= n 1) a)))

(sum2 100)
=> 5050
(sum 100)
=> (error "Lisp nesting exceeds max-lisp-eval-depth")
>>727
だから elisp では再帰で繰り返しを書くのはよせと言っておろうが。

(defun sum-list (list)
(apply #'+ list))

(defun sum3 (n)
(sum-list (test-generate-list (1+ n))))
>>728 … 727 も elisp では再帰マズーと言っているように見えるのは漏れだけ?
apply とか mapcar とか
読みにくいからきらいー
まあ、世の中には読みやすい人もいるわけで。
(mapcar SEQUENCE FUNCTION)
だったら少しは読みやすかったんじゃないかと思う。
FUNCTIONが (lambda ...) のときなんかはとくに。
それじゃ mapcar* 等との整合性がなくなっちゃうし。
(defmacro 732mapcar (seq fun)
`(mapcar ,fun ,seq))

(732mapcar '(1 2 3) (lambda (x) (+ x x)))
=> (2 4 6)

読みやすいか?全然かわらん気がするけど.
マクロってのはスペシャル関数を作るためにあるって
いっていいの?
>>735
俺はそれより ``special form'' を「スペシャル関数」と訳したものをどこで見たのか気になる。
737735:03/09/15 01:00
スペシャル関数…間違えました。特別な関数というイメージがあったからつい。
ところで、elisp の info 見てみたら

"マクロ"
"マクロ"(macro)は, プログラマがLispで定義した構文である. マクロ
と関数との違いは, マクロは, 読者が書いたLisp式をもとの式のかわりに
評価される等価な式に変換する. マクロは, スペシャルフォームでできる
種類のことをLispプログラマに提供する. マクロの定義方法と使い方につ
いては, *Note Macros::.

こんな書き方してあるので、>>735 の考え方は間違いじゃなさそうですね。
構文定義
>>737
マクロが知りたいならこれを読むといいと思う。
ただ、日本語訳はいいけど、訳者の頭が変な気がする。

Paul Graham "On Lisp" Chap. 11 (out of 25) まで翻訳完了
ttp://user.ecc.u-tokyo.ac.jp/~g340299/onlisp_j.{tex,pdf}
訳はいいけど訳者の頭が変って、
その onlisp_j は ok だけど、そのサイトの文章は信用ならんって事?
これからその pdf 読んでみようかと思ってるのだが。
まぁ、ぶっちゃけそういう事だ
訳者が2chで意見を募ったときのことを指してるんだろ。
変ではないが、空気が読めないってだけ。
なるほど。該当スレ読んできた。
Lisp初心者です。
(setq a ())
(dotimes (n 5)
(setq a (cons '(lambda (x) (+ x n)) a)))
というプログラムを書きました。
a の第1要素には (lambda (x) (+ x 4)) が入っていることを期待した
のですが、そうなりません。
そうする方法はありますでしょうか?
>>744
backquote 使え。`(lambda (x) (+ x ,n)) だと、
n のとこだけ評価される。
746744:03/10/06 16:27
>>745
おお! 有難うございます。
マニュアルの該当部(逆引用符)も見付けました。
Lispは 評価するか、文字のまんまか という所が難しいですねえ。
「マクロとは何か」「何がマクロか」が分かると、やさしくなるよ。
748744:03/10/07 08:23
>>747
この場面でマクロを使うほうが良い、とまだ思い至らないんですね。
マニュアルの「逆引用符」の部分を読んで、マクロを使わないで書き直すと
(dotimes (n 5)
(setq a (cons (list 'lambda '(x) (list '+ 'x n)) a)))
ですね。この方がめんどくさいが自分では理解はしやすいです。
,@foo ってマクロ無しでは無理だよね?
>>749
いいえ
なんつーか,バッククォートとマクロがごっちゃになっていると思われ…
マクロはバッククォートを使って書かれることが多いが,

(defmacro aif (test then else)
`(let ((it ,test))
(if it ,then ,else)))

無しでも書ける.バッククォート無しでもマクロはマクロ.

(defmacro aif2 (test then else)
(list 'let (list (list 'it test))
(list 'if 'it then else)))

というわけで,用語の混乱を直しておきましょう.
753744:03/10/08 22:48
先日のアドバイスを元に
(setq a ())
(dotimes (n 5)
(setq a (cons `(lambda (x) (+ x ,n)) a)))
(funcall (car a) 10)
とやると、emacsではうまく動作するのですが、同じコードをcmucl上で行う
とエラーが出ます。
(car a) の所に#とか#'とか付けてみたのですがうまく行きません。
なぜでしょうか? 下らない質問な予感がしますが教えていただければ助かります。
CMUCL ならクロージャが使えるので↓でよい.

(setf a ())
(dotimes (n 5) (push (lambda (x) (+ x n)) a))
(funcall (car a) 10)

# もちろん,Emacs ではこれは無理.
755744:03/10/09 19:20
>>754
有難うございます、??
でも このコードをcmuclで実行すると、なんか結果が違ってるみたいです。
a の全ての要素に (lambda (x) (+ x 5)) が入ってしまうようです。
a の第1要素には (lambda (x) (+ x 4))、 第2要素には (lambda (x) (+ x 3))、...
と入るように、最初に書いたemacsで動くコードの方はなってるんですが、
cmuclでそうなるように書くにはどうすればよいのでしょうか。
>>753
ACL だとできるよ。
CL-USER(4): (funcall (car a) 10)
14
>>755
いいかげんスレ違いだが、
クロージャの場合 n を評価しないからだよ。
(mapcar #'function-lambda-expression a)
=> ((LAMBDA (X) (+ X N)) (LAMBDA (X) (+ X N)) (LAMBDA (X) (+ X N))
(LAMBDA (X) (+ X N)) (LAMBDA (X) (+ X N)))
ありゃ本当だ.
(setf a ())
(dotimes (n 5) (let ((n n)) (push (lambda (x) (+ x n)) a)))
(funcall (car a) 10)
CMUCL だとこーだな.
>>757
CMUCL の dotimes だと全てのクロージャが同じ n を参照しちゃってるから,
のほうがわかりやすくない?
>>759
そうかも。ACL でも一緒だけどね。ところで、CMUCL では
(funcall '(lambda (x) x) 1)
がエラーになるの?
CLISP では、それはエラーみたい。'(lambda ...) は関数じゃないからなー。
#'(lambda ...) とか (coerce '(lambda ...) 'function) じゃないと
だめとゆーてきますが、ACL だと大丈夫なの?
ACL だと大丈夫。Common Lisp 的にはエラーが正解なのかもしれない。
どんどん Emacs と離れていくけど、Lisp つながりだからいいか。
CMUCL でも型エラーみたいだけど、
http://www.lispworks.com/reference/HyperSpec/Body/f_funcal.htm
みてもヘタレな漏れにはよくわからん。識者の解説キボンヌ。
764744:03/10/10 14:09
みなさま有難うございます.
いろいろなヒントをいただいて大変参考になりました.コモンリスプでも
微妙に違うのも知りました.
良く分からない点もありますがもうちっと自分で勉強します.
>>764
結局 >>753 のようなことを Common Lisp でするには

(dotimes (n 5)
(push (coerce `(lambda (x) (+ x ,n)) 'function) a))

または

(dotimes (n 5)
(let ((n n))
(push (lambda (x) (+ x n)) a)))

なんだけど、下のやつは lambda が環境(変数束縛)を含むのでクロージャと呼
ばれる。elisp にはクロージャがないので下のようには書けない(上のように
は書ける)。

この辺ややこしいのでこのあたりを読んでおくとよい。
http://www.geocities.co.jp/SiliconValley-Oakland/1680/rakup/rakup21.html

ちなみに ACL では、同じ lambda でも区別しているみたい。
上の (car a) => #<Interpreted Function (unnamed) @ #x304e3b5a>
下の (car a) => #<Interpreted Closure (unnamed) @ #x304e57c2>
Common Lisp なら

(defun adder (n) (lambda (x) (+ x n)))
(dotimes (n 5)
(push (adder n) a))

とかのほうが好み.labels でも良いけど.なぜならば,

1. 関数のほうが情報がいっぱい.関数名で足りなければ document とかも書けるし.
2. 他のところで使いまわせるかも.

という点が嬉しいから.
実はEmacs使いはみんなCommon Lispユーザなのか?!
このスレの人と LISP Scheme スレの人はかなり被っていると思われるので、
「スレ違いだろ」などと誰も言わないんじゃないだろうか?
まぁ、別に他にネタもないわけで、いいんでないか?活気があったほうがイイ。
いちおついてけてないけど、参考になるような気がしてるので
スレ違いを指摘してない。
Emacs と Common Lisp と Perl を使ってるプログラマなんだけどさー Perl スレで
順列もどきを作るプログラムが〜って話があったんだけど,実は Lisp で書いたほう
が楽な気がしてならない….タイプ数は確実に Perl のが少ないんだが…

(let ((data '((1 2 3)
(4 5 6)
(A B C))))
(labels ((iter (acc data)
(if (null data)
(print (reverse acc))
(mapcar (lambda (x)
(iter (cons x acc) (cdr data)))
(car data)))))
(iter nil data)
nil))

こういうのは二つの集合の直積として考えるのが正しいんでしょうか?
たまたま lisp 向きだっただけだろう。その前の hash への要素の追加なんて
$word = "ho==ge,fu==ga,fo==oo\n"
$data->{$_->[0]} = $_->[1] for map { [ split "=="] } split "," => $word;

(let* ((word "ho==ge,fu==ga,fo==oo\n")
(lst (split-string word "[,\n]"))
(alist (mapcar (lambda (e) (split-string e "==")) lst))
(hash (make-hash-table :test 'equal)))
(dolist (elem alist hash)
(puthash (first elem) (second elem) hash)))
じゃないか。まぁ、elisp 版は lst とか変数が冗長なんでもーちょい
短くなるだろうけど、読みにくいと思うし。
たまたま lisp 向きなネタだったからでしょ。その前に出てた hash へ
の追加なんてこんな感じで、Perl に比べてかなり冗長だ。
(let* ((word "ho==ge,fu==ga,fo==oo\n")
(hash (make-hash-table :test 'equal))
(lst (split-string word "[,\n]"))
(alist (mapcar (lambda (e) (split-string e "==")) lst)))
(dolist (elem alist hash)
(puthash (first elem) (second elem) hash)))
perl読めん……。rubyか pythonがいい。
(let* ((word "ho==ge,fu==ga,fo==oo\n")
    (lst (ppcre:split "[,\n]" word))
    (alist (mapcar (lambda (e) (ppcre:split "==" e)) lst))
    (hash (make-hash-table :test #'equal)))
  (dolist (elem alist hash)
   (setf (gethash (first elem) hash) (second elem)))))
CommonLisp だとこうだな。cl-ppcre が必要だけど。elisp から
CommonLisp に移るのは簡単だな〜。
777773=774:03/10/12 20:54
ぐわぁ。2重カキコになってる…スマソ。
778デフォルトの名無しさん:03/10/13 05:32
画面の左右に、「現在の行数と先頭からの文字数」が表示されるような
メジャーモードを作ってみたいと考えているんですが、難しそうでとっ
かかりがありません。
左右の6文字分ぐらいに
1 1 | hoge hoge fuga fuga             | 1 16
2 17 | fuwa fuwa honya honya            | 2 34
3 35 | aada kouda souda               | 3 48
と、自動的に出てくるようにしたいのですがやはり、
文字を打ち込んだり、削除したり、検索したり、という命令をすべて
書き換えないと無理ですよね?1文字打ったらたちまち左右の部分が
くずれますもんね。
たとえば特定の桁を特別扱いしてくれて、中央の部分だけが文章の本
文だとみなしてくれるようなしくみってemacsにありますか?
779デフォルトの名無しさん:03/10/13 09:01
>>778
バッファを3つ使うとか。
>>771
(defun hoge (a &rest b)
(if (null b) (mapcar 'list a)
(let ((b (apply 'hoge b)))
(apply 'append (mapcar (lambda (x) (mapcar (lambda (y) (cons x y)) b)) a)))))

(apply 'hoge '((1 2 3) (4 5 6) (A B C)))
((1 4 A) (1 4 B) (1 4 C) (1 5 A) (1 5 B) (1 5 C) (1 6 A) (1 6 B) (1 6 C) (2 4 A) (2 4 B) (2 4 C) (2 5 A) (2 5 B) (2 5 C) (2 6 A) (2 6 B) (2 6 C) (3 4 A) (3 4 B) (3 4 C) (3 5 A) (3 5 B) (3 5 C) (3 6 A) (3 6 B) (3 6 C))
>>788
右の情報は冗長でしょ。左だけでも我慢できるなら、行番号表示するヤツを参考にしては。
それか、現在行だけもモードラインに表示するか。
元々は組み合わせに対してなんらかの処理をしたいって話だったんだろ?
確かに lisp の方が冗長かもしれないけど、
(defun lispy (fn lst)
(let ((result nil))
(labels ((iter (acc lst)
(if (null lst)
(push (funcall fn (reverse acc)) result)
(mapc (lambda (x)
(iter (cons x acc) (cdr lst)))
(car lst)))))
(iter nil lst)
(nreverse result))))
こんな感じの関数を作っといて、
(lispy #'print '((1 2 3) (A B C) (X Y Z)))
とかしたほうがトリッキーなコードに比べて後々楽だと思われ。
組み合わせのリストが欲しいだけの場合は
(lispy #'identity '((1 2 3) (A B C) (X Y Z)))
で OK だし。
>>782
そのコードのほうがわかりづらくない?
組み合わせのリストを返す関数とループで書いたほうがいんじゃない?
784778:03/10/13 14:08
>>779, 781
ありがとうございます。出来れば両端に出したいんです。
行番号が出るモードってどこにありますでしょうか。
バッファを3つ使うのはよいかも知れません。スクロールを完全に
同期させる方法はありますでしょうか
不勉強ですみません
また、(set-window-margins nil 6 6)とやると左右に6文字分空く
んですが、ここにはなにも書き込めないんですかねー。
ご指摘のとおり、771 さんのコード(見落としてました…)と
(defun map-hoge (fn lsts)
(mapcar fn (apply #'hoge lsts)))
のほうがよさそうですね。ユーティリティを一回書いとけば Perl のイディオムと
同じくらいに使いまわしが効くじゃんと言いたかったのです。
>>784 両端に…デカイ画面使ってるんだな。でも6文字分のスペースじゃ、行数+先頭から
の文字数を表示するには足りねーだろう。1000 行超えたあたりでファイルを編集してた
ら繋がっちゃって激しく混乱する予感。
>>786
> デカイ画面使ってるんだな。
なら highline.el あたりで幸せになれないかな。
>>784
> また、(set-window-margins nil 6 6)とやると左右に6文字分空く
> んですが、ここにはなにも書き込めないんですかねー。
(overlay-put (make-overlay 1 2)
'before-string
(propertize "_" 'display '((margin left-margin) "test")))
でいけるけど、全行これやったら遅そう。
789785:03/10/13 22:11
よっしゃ、汚名を挽回すべく http://pc2.2ch.net/test/read.cgi/tech/1063028224/565-569 にチャレンジだ。
(defun remove-1 (elem lst)
"Common Lisp's (remove ... :count 1)"
(if (null lst)
nil
(if (eql elem (car lst))
(cdr lst)
(cons (car lst) (remove-1 elem (cdr lst))))))
(defun perm (lst)
(if (null lst)
(list nil)
(mapcan (lambda (x)
(mapcar (lambda (y) (cons x y)) (perm (remove-1 x lst))))
lst)))
(defun map_perm (fn lst)
(mapcar fn (perm lst)))
どないなもんでしょ?mapcan と mapcar の組み合わせのあたりが自分としては
(define (´∀`) 'マターリ) さん風味に仕上がったと思ってるんですが。
いや、がんがってるとは思うし、リストならそれでいいと思うんだが、
元ネタは配列なので↓かなぁとか。
(defun map-vector-perm (fn vec)
(labels ((permute (end)
(if (= end 0)
(funcall fn vec)
(dotimes (i end)
(rotatef (aref vec (1- end)) (aref vec i))
(permute (1- end))
(rotatef (aref vec (1- end)) (aref vec i))))))
(permute (length vec))))
(map-vector-perm #'print (vector 1 2 3))
まぁ、Ruby にはあんまり興味ないし、読めないから外してるかも。
cl利用コードだらけ。
792778:03/10/13 22:50
>>786 ワラ) そうすね。ただそんな大きいファイルは編集しなそう
なんです。また、「先頭からの文字数」だけ表示できればそれでも
十分です。うまくいけば、必要に応じて8文字分とかに自動的にな
るようにできれば最高ですがまだ高望みですね
>>788 このoverlayって全くしりませんでした。ちょと勉強してみま
す。ありがとうございます。
>>791 何か不満でも?…って過剰反応し過ぎかな。周囲の schemer が
反復使いすぎとか副作用使いすぎとか煽ってくるので過敏になってるのか
もしれん。
>>793
うーん、なんか lispスレでやったら?みたいな。
確かに emacs上で動くんだけど、elispスレ的でないというか。
>>789
remove-1は使わないだろうなあ。
(defun rotate-list (lst)
(do ((a lst (cdr a))
(b '() (cons (car a) b))
(r '() (cons (append a (reverse b)) r)))
((null a) (reverse r))))

(defun perm (lst)
(if (null lst) '(())
(apply #'append (mapcar (lambda (x) (mapcar (lambda (y) (cons (car x) y)) (perm (cdr x))))
(rotate-list lst)))))

(rotate-list '(1 2 3 4))
((1 2 3 4) (2 3 4 1) (3 4 1 2) (4 1 2 3))

(perm '(1 2 3 4))
((1 2 3 4) (1 2 4 3) (1 3 4 2) (1 3 2 4) (1 4 2 3) (1 4 3 2) (2 3 4 1) (2 3 1 4) (2 4 1 3) (2 4 3 1) (2 1 3 4) (2 1 4 3) (3 4 1 2) (3 4 2 1) (3 1 2 4) (3 1 4 2) (3 2 4 1) (3 2 1 4) (4 1 2 3) (4 1 3 2) (4 2 3 1) (4 2 1 3) (4 3 1 2) (4 3 2 1))
796785:03/10/14 10:34
>>790
>>795
キターーーーーーーーーーーーーーーーーーーーーーー
(remove x lst :count 1) 相当のものを作ることに頭がいってしまい
ましたが、こんな手もあるんですね。すごいなぁ。

>>794
まぁ、elisp なんだから良いではないですか。cl は emacs に
標準添付なわけで dotimes, dolist, labels くらいならまだ十分 elisp でしょう。
(dotimes (i 5)
(lexical-let (n i)
(lambda (x) (+ x n))))
とかやりはじめたら流石に移動したほうが良いかもしんないですけど…。
>>794
かなりどうでもいいんだが、navi2ch で見ているので elisp で動くコードだと
C-x C-e ですぐ評価できるのがうれしい。
(defun perm (lst)
(if (null lst) '(())
(apply #'append (mapcar (lambda (x) (rotate-list (cons (car lst) x)))
(perm (cdr lst))))))
799778:03/10/15 08:39
788さま他皆様有難うございます。なんとかとっかかり位は出来ました
overlayってあまり参考文献はないですかね... 良く分からず書いています
(propertize " " ...) の " " の部分てダミーなんでしょうか。

(defun make-both-margins ()
(interactive)
(setq left-margin-width 6)
(setq right-margin-width 6)
(set-window-margins nil 6 6))
(defun show-bilateral-letternum-of-line ()
(interactive)
(let ((a nil) (b nil))
(progn
(beginning-of-line)
(setq a (make-overlay (point) (point)))
(overlay-put a
'before-string
(propertize " " 'display `((margin left-margin)
,(concat (make-string
(- 5 (length (number-to-string (point)))) 32)
(number-to-string (point)) "|"))))
(end-of-line)
(setq b (make-overlay (point) (point)))
(overlay-put b
'before-string
(propertize " " 'display `((margin right-margin)
,(concat "|" (make-string
(- 5 (length (number-to-string (point)))) 32)
(number-to-string (point)))))))
(list a b)))
>>799
要編集だと厳しいね
>>799
> (propertize " " ...) の " " の部分てダミーなんでしょうか。
です。
info の File: elisp, Node: Display Margins より。

If you put such a display specification directly on text in the
buffer, the specified margin display appears _instead of_ that buffer
text itself. To put something in the margin _in association with_
certain buffer text without preventing or altering the display of that
text, put a `before-string' property on the text and put the display
specification on the contents of the before-string.
つーか、そーゆう行番号表示は elisp でどーにかするよりも Emacs 自体を
なんとかするのが正攻法だと思われ。実際、Windows 用の xyzzy は組み込み
で行番号表示を持ってるし。
803778:03/10/15 20:58
>>801 ありがとございます。安心しました。
>>802 いやー行番号より、先頭からの文字数を表示するというミョーなことが
したいんですよ。ほんとはスペースやリターンを数えない、読める文字だけ
をカウントしたいのです
しかしoverlayというのは面白いですね。
(overlay-put (make-overlay (point) (point)) 'after-string "+"))
とかすると+の字は消えない石みたいになりますね。どうせならウィンドウ
上で位置を固定出来ればもっと使い道がありそうですが、前の文字の挿入削
除で動いちゃうんですね。なににつかうんだろ
>>803 それはモードラインじゃ駄目なのか?…ん?カーソル位置じゃなくて
ひょっとして、各行の文字数を表示したいってことか?
805778:03/10/15 21:31
799に書いたへなちょこコードを実行して戴くと分かると思うんですが、
先頭からの文字数を、各行の左右に表示したいんです(そんなやつあま
りいませんか) 799のだと編集に応じて変化してくれないので、そこを
頑張って書いてみようとおもつています
モードラインに表示するようにすれば?
モードラインに書けばいいだけの話
>>806>>807
なに連呼してんだよw

>>778
ここで叩かれて強くなってきたほうがいいんじゃないか?
http://pc.2ch.net/test/read.cgi/unix/1063880951/
そもそも、なぜ先頭からも文字数をいくつも表示したいのか語ると話が早い。
show-paren-style → expression
としてるんだけど、>>799 だと左右のエリアまで色付いちゃうね。
別に上のコード自体は欲しいと思う featureじゃないのでどーでもいいが、
技術的な問題として、ちょっと気になるかも。
気になるなら margin に表示する部分の face を指定しましょう。
視覚的な折り返しに対してマージンを仕込む方法はあるんでしょうか?


  頭ああああああああああ尻

がウィンドウ幅で折り返されたら、

  頭ああああああああ
ああ尻

じゃなくて、

  頭ああああああああ
  ああ尻

にしたいのです。
overlay等調べてみたけど今一つできなさそう。
似たようなことをしているlibraryもないし…。
Windowsの秀丸だとできて なぜEmacsでできん、と。
妙な要求があるもんだな。
  頭ああああああああ
  ああ尻

Window 幅を広げると、

  頭ああああああああああ尻

に戻るってこと?
そりゃ無理だ。
>>812 だーかーら、そゆことは lisp の範囲ではなく C のレベルでなんとか汁。
ただな、大多数の人がその機能を不要だと思ってるわけよ。だから「なぜ?」を
説明しないと食いつき悪いと思うよ。ホントに。
自前でおりかえし処理表示する mode 書けば
lisp レベルでなんとかなると思うが。
elisp だけでも不可能だとは言わないよ.でも実用性とか考えると C レベルで実装
(lisp から操作できるインターフェースも含めて)しちゃうのが ''the right thing''
じゃないかな〜と言っているわけ.でも,lisp にしろ C レベルにしろ,必要性と
いうか有効性が無いならだれもそんなことしないでしょ? だからその辺を説明して
(あるいは熱く語って)同志を募れば?と言ってるの.
実用性は全く感じないし、激しくイラネと思うが、
Cのレベルで書いたほうが何かと楽そうには感じる。
そもそもマージンって何に使うもんなの?
>>744
おいっ comp.lang.lisp でも似たような話題がでてたぞ。

http://groups.google.co.jp/groups?hl=ja&lr=&ie=UTF-8&threadm=3F857177.2F4BC9CA%40eng.cam.ac.uk&rnum=1&prev=/groups%3Fselm%3D3F857177.2F4BC9CA%2540eng.cam.ac.uk
http://www.geocities.co.jp/SiliconValley-SanJose/7474/cllMemo.html#0001

てことは c.l.l と 2ch のレベルは大して違わないってことだな。日付で見る
と 2ch のほうが先だからこの記事書いたやつは 2ch 見て書いたんだな。
>>820
おもんない && 頭悪そう
recursive-edit() すると、exit-recursive-edit()するまで自由にできますが、
再帰編集に入った直後に予め指定したコードを実行させる事ってできないものかなあ。

今思いついた変な例だけど、query-replace-regexpみたいな事してて、
カーソル位置にある関数名がふと気になったとします。
この時、置換作業はそのまま続けたいけど、その関数について調べたい場合、
あるキーを押すと、再帰編集に移行しつつカーソル位置にある関数名で
自動的にdescribe-functionしてくれて、
ついでに M-C-c するまで気の済むまで定義元ファイルを見たりできると便利かなと。
一旦終了して C-s C-s の方がよっぽど自然で使い易いが
>>823
うーむ、例が悪かったですかね。
とりあえず、なんかの対話的コマンド実行中に
別の事したいなと思う事が時々あるんですよ。
>>824
では、いい例を希望。何がしたいのか分かりません。
>>825
ではえらく具体的な例を。
SKKでミニバッファに表示された候補を見てて、
「これ何?」と思ったとき、例えば 'A'の入力で
'a'に対応した語を lookup-wordなり emacs-w3m経由で
ググッたりできたらいいな、と。
適当な変数に候補を代入して (recursive-edit)とするぐらいしか
今は思いつかないけど、辞書引きまで自動化できないものかと。

他の用例は……、前回思ったのがずいぶん前なので忘れた。
query-replace-regexp中に ? を押すと
C-r to enter recursive edit (C-M-c to get out again),
というのがありますね。
んで、replaceは操作が全て一関数にハードコードされているのでreplace.elを
書き換えるつもりじゃないと無理そうね。

それはそれとして、recursive-edit突入後にコマンド実行するちょっとした実験↓
(progn
(setq deferred-action-function
(lambda ()
(let ((f deferred-action-list))
(setq deferred-action-list nil)
(apply (car f) (cdr f)))))
(setq deferred-action-list '(call-interactively describe-function))
(recursive-edit))
なんとかなりそう? ならなさそう?
>>827
ほぉ〜、こんな仕組みがあったとは。
doc-string付いてるくせに、全然 emacsのドキュメントとかで触れられてない。
で、post-command-hookの存在を思い出したんだけど、今回はこちらで十分かな。
# ググってみたところ、deferred-action-list は
# 昔の skeleton.elで利用されてたものの、
# 手元の mule19.34附属の物では既に
# post-command-hookを利用するよう修正されているようです。
(defmacro execute-in-recursive-edit (&rest code)
(let ((hook (make-symbol "--execute-in-recursive-edit-hook--")))
`(progn
(fset ',hook
(lambda ()
,@code
(remove-hook 'post-command-hook ',hook)))
(add-hook 'post-command-hook ',hook)
(recursive-edit))))
こんなんでどお?
モードラインに桁数を表示するのに、左端を0でなく1とした
数を出したいんだけど
(setq mode-line-format '(:eval (number-to-string (+ 1 (current-column)))))
とか
(setq mode-line-format (number-to-string (+ 1 (current-column))))
とか
(setq mode-line-format (number-to-string (+ 1 (string-to-number "%c"))))
とかしても、カーソルに追従して変化してくれません
(setq mode-line-format "%c")
では、左端が0になってしまいます
これは、カーソル移動や文字入力にフックをするようにmajor modeを書かないと
むりですかね?
>>830
(add-hook 'post-command-hook 'force-mode-line-update)
832デフォルトの名無しさん:03/10/26 14:10
(add-hook 'post-command-hook (lambda () (interactive)
(setq current-column (number-to-string (+ (current-column) 1)))
(force-mode-line-update)))
(setq mode-line-format (list "" 'current-column))
mode-line-format の evalって、実際どーいう条件の時に評価されるの?
>>833
update するとき
いつupdateされるの?
836830:03/10/26 17:43
>> 832
ありがとうございます。すごいなー。
MMX Pentium 180MHzのパソコンだとカーソル動かしてから桁数がでるまで
ちょっと間があるのがかわいい。
pointが動いた時のhookにすればいいんだろうけど、よく知らない。
気休め程度に
(add-hook 'post-command-hook (lambda () (interactive)
(when (/= current-column (current-column))
(setq current-column (number-to-string (+ (current-column) 1)))
(force-mode-line-update))))
>>837
ナイスなアイデアだ。
でも、間違いが3つくらいありそうだぞ。
(add-hook 'post-command-hook (lambda () (interactive)
(let ((x (number-to-string (+ (current-column) 1))))
(when (or (not (boundp 'current-column))
(not (string= current-column x)))
(setq current-column x)
(force-mode-line-update)))))
文字列を作るのはいろいろな意味で負荷が高いので、
post-command-hook では数値のまま処理して、
mode-line の方で文字列に変換すべき
841デフォルトの名無しさん:03/10/26 19:59
Emacs Lispの初心者で、Meadow2に付いているInfoを見ながら
Emacs Lispの機能をちょこちょこと試しているところです。

ざっと目を通していてよくわからなかったのが構文テーブルの使い方です。
構文テーブルの使い方を短いサンプル付きで説明しているサイトなどを
ご存知の方はいませんか?
842830:03/10/26 20:02
質問者ですが
post-command-hook より post-command-idle-hook の方を使った方が、
なんだかカーソル移動への反応がいいみたいですね
843デフォルトの名無しさん:03/10/26 22:36
lispなんか使えても社会に貢献できねーだろクズ共が
趣味でやるLispは楽しい
会社でやるLispは現実逃避
846デフォルトの名無しさん:03/10/26 23:05
そもそも会社じゃやらねーだろ
んなこたーない。そういう仕事が取れるか取れないかというだけ。

848デフォルトの名無しさん:03/10/27 00:02
例えばどんな仕事がある?一つでいいから例教えてくれよ。
大学機関で使うとかじゃなくてな。
>841
おれもよくわかってないが、一個だけ使い方知ってる。text-mode で

aaa_bbb_

という文字列の一番最初にカーソルを置いて M-f とするとカーソルは aaa の次の _ の
ところに移動する。でもここで

(modify-syntax-entry ?_ "w" text-mode-syntax-table)

を評価すると _ で止まらず最後まで移動するようになる。上の命令は _ という文
字を単語の一部とみなせと構文テーブルで指定するということ。他にも例えば

(modify-syntax-entry ?# "<" text-mode-syntax-table)
(modify-syntax-entry ?\n ">" text-mode-syntax-table)

とすると text-mode で # から行末までをコメントを表すものと指定できる。
正規表現とかにも影響を与える
Allegro 使う仕事とかありそうだ。
(プログラマやめたので最近は知らんけど)
以前は、まじでエキパートシステムとか
スケジューリング作成システムとかの、
LISPの仕事があったよ。90年代前半
です。これはLISPで作ったスケジューリ
ング製品があったわけです。
で、それが*Emacs* Lispとどんな関係があるんですか?
そもそも843からスレ違い
855kaoru:03/10/27 18:34
>>843
ごめんな〜、クズで。
(gc)
ぎゃ〜消える、消える〜〜だれか参照をくれ〜…
(unbound >>857)
859デフォルトの名無しさん:03/10/27 20:26
エキスパートシステムはプロローグでと昔から決まってます。嘘つかないで
ください
へー。エキスパートシステム製作とかあったのか。楽しそうだなぁ。
やっぱエディタには Emacs とか使ってたんですか? elisp を駆使したりしました?

と、無理やりスレの流れに近づけてみる。
もうやめて、次行こ。次。
>>860
M-x doctor
863デフォルトの名無しさん:03/10/28 03:07
エキスパートでProlog使うとバックトラックがPrologまかせに
なるので、Lispでいろいろ制御した方が良いことが多いです。

そもそも、Lispの方が歴史が古いので、Prologよりいろいろと
ライブラリが揃っています。
まだやるんかいな。おもんな。
865psychopath:03/10/28 11:37
>>860 じゃないが、医者に行ってみた。
結構すごくてちょっとびっくり。ガイジンとチャットする練習になる。
漏れはまだそういうことはできんと分かったのはちょっとショック。

Hi,

How do you do? What brings you to see me?

ah, i have some serias problems.

Why do you say ah you have some serias problems?

yes, i have. it's so serias

Is it because of your plans that you say yes you have it's so serias?

my wife doesn't gimme blow job.

Tell me something about your family.

none of your buisiness.

...
正直,ネタ振りもなしで "おもんな" しか言わんやつより雑談のほうがよっぽどマシと思われ….
>>866
だってPrologとかエキスパートシステムとか言われてもねえ。
気持ちがわからないこともない。
serias
阪神の外人だろ
870865:03/10/28 12:39

seriousでした。キャーはずかしー。
871デフォルトの名無しさん:03/10/28 13:11
>>866
たしかに、おもんなとだけ繰りかえされてもねぇ。
気持ちがわからんこともない。
(message (mapconcat #'prin1-to-string '(キタ (゚∀゚) (∀゚ ) (゚  ) (  ) (  ゚) ( ゚∀) (゚∀゚) !!!!!) "━━"))

(mapcar (lambda (x) (message (concat "キタ━━" (prin1-to-string x) "━━!!!!!"))
(sleep-for 0.12))
'((゚∀゚) (∀゚ ) (゚  ) (  ) (  ゚) ( ゚∀) (゚∀゚)))
(animate-string "キタ━━(゚∀゚)━━!!!!!" 10)
(let ((shu '(  シ シュ シュッ)))
(setcdr (nthcdr (1- (length shu)) shu) shu)
(while shu
(message (prin1-to-string (car (setq shu (cdr shu))))) (sleep-for 0.12)))
(add-hook 'window-setup-hook (lambda ()
(mapcar (lambda (x) (message (concat "Emacs " emacs-version " キタ━━" (prin1-to-string x) "━━!!!!!")) (sleep-for 0.05))
'((゚∀゚) (∀゚ ) (゚  ) (  ) (  ゚) ( ゚∀) (゚∀゚)))
(if (fboundp 'animate-string) (animate-string "キタ━━(゚∀゚)━━!!!!!" 10))))
(let ((shu (mapcar #'prin1-to-string '(  シ シュ シュッ))))
(nconc shu shu)
(while t (message (car (setq shu (cdr shu)))) (sleep-for 0.12)))
そろそろ秋田
いまごろ青森
Emacs Lispに、コードのどの場所でどれだけ時間がかかっているかを調べる
プロファイラというものはありますか?

こういうのってどっかになかったかな?
(defmacro maplambda (lst var &rest body)
(if (null body) `(mapcar ,var ,lst)
`(mapcar (lambda (,var) ,@body) ,lst)))

(maplambda '(1 2 3 4) x (+ x 1))
(2 3 4 5)

(maplambda '(1 2 3 4) #'list)
((1) (2) (3) (4))
なにこれ?どのへんが嬉しいのか良くわからん.不明瞭な mapcar ??
lambdaと括弧が消える
ありがちなマクロの悪用例
885デフォルトの名無しさん:03/11/01 23:30
Emacs スレで嫌われまくってる cl ネタで済まんけど、 それなら
(loop for x in '(1 2 3 4)
collect (+ x 1))
(loop for x in '(1 2 3 4)
collect (list x))
のほうがマシかもよ。lisper 以外にも割と意味が通じやすい。
(Paul Graham が loop 嫌いなんで、彼の本で勉強した人には不評だったりするが)
>>885
それはゴテゴテしすぎてやだな。

あまりにも不評なんでmapcarとlambdaに戻そうかな。
>>881
CL がメインのユーザのおれから意見すると、

(maplambda '(1 2 3 4) x (+ x 1))

よりは、

(dolist* (x '(1 2 3 4))
(+ x 1))

ていうほうがしっくりくる。基本的には dolist なんだが、map したリストを
返すという仕様。

>>885
loop は Lisp っぽくないからな、そこの部分だけ異質に見える。まぁ、覚え
るのが面倒なのが本音だが。
やっぱり
(map (lambda (x) (+ x 1)) '(1 2 3 4))
が漏れには一番しっくりするなあ。
処理内容にもよるだろうけど、「写像」が目的なら尚更。
その前にletを使っていたときは
(let ((f (lambda (x) (+ x 1)))
...)
(map f '(1 2 3 4)))
とかして直にlambdaを書いて長くならないようにしている。

ところでdefsubst使わずにdefmacro使って展開させてるのってダメかな。
(defmacro (mapcon f lst)
`(apply #'append (mapcar ,f ,lst)))
890887:03/11/02 02:41
>>889
その例の場合、インライン関数に比べてマクロだと何がいいの?
元々関数のものをマクロにするのはあんまりおすすめできないと思う(高階関
数がらみでハマるから)。そういう意味で >>881 の maplambda も、マクロに
するなら mapcar よりは dolist に近い名前にしておいたほうがよいと思った。
(defmacro mapcon (f lst)
`(apply #'append (mapcar ,f ,lst)))
(defun test (x)
(mapcon #'f x))
だとこうだけど
byte code for test:
args: (x)
0constant apply
1constant append
2constant mapcar
3constant f
4varref x
5call 2
6call 2
7return

(defsubst mapcon (f lst)
(apply #'append (mapcar f lst)))
(defun test (x)
(mapcon #'f x))
だとこうなる
byte code for test:
args: (x)
0constant f
1varref x
2varbind lst
3varbind f
4constant apply
5constant append
6constant mapcar
7varref f
8varref lst
9call 2
10call 2
11unbind 2
12return
バインドが邪魔
気にするな
elispで手続き型言語っぽいと批判されないための
主なポイントは次のようなものと考えていますがあってますか?

(1)whileはなるべく使わない。
(2)setqは単に値をセットして以降変えないなら良いが、
ループ内で、ころころ値を変えるような使いかたはよくない。
lisperとしてか、elisperとしてか、どっちよ?
>>894
それなりの速度でうまく機能するなら手続き型っぽくても気にする必要はないのでは。
elispのInfoのどこかで再帰よりも反復の使用を勧めていたような気もするし(←実行速度の都合上)。
「そのコードって手続き型っぽいな」と言われたら「こう書いた方が速いんだよ」と言い返しとけば?
本当に速いのかどうかは知らないけどさ。
「手続き型っぽくない == 関数型っぽい」と仮定して、思いついたことを適当
に箇条書きにすると、
- 副作用をなくす(破壊的操作 setq や nconc などをなくす)。
- let で宣言した変数を変更しない。
- 自由変数をなくす。
- マクロでも関数でも書けるものは関数で書く。
- 新しいデータ構造を作ったらそのデータ構造を操作する高階関数を作る。

あと、elisp 特有のことだと、
- elisp は末尾再帰の最適化をしないので、再帰呼びだしを使わない。

もちろん、これらを教条的にあてはめるんじゃなくて、パフォーマンスやメン
テナンス性との兼ねあいを考えて、必要に応じて手続き型っぽい書きかたをす
ればよいと思う(そこが Lisp のいいところ?)。

関数型スタイルについて知りたければ、ML, Haskell, Clean をざっと勉強し
てみるのがよいと思う(Lisp は純粋な関数型ではないため)。
Schemerとしては末尾再帰を意識してるのは手続き型言語っぽくないと思う。
まずは再帰で書く。破壊的操作はなしで。
ちゃんと動くことを確認したら別の関数を書いてでも末尾再帰にする。

それからループにする。ループでは破壊的操作はあり。
(while lst ... (setq lst (cdr lst)))とか。
でも、setcar、setcdrはなし。nreverse、nconcはあり。

cond使って条件がいくつもあるやつはループにしづらいけどね。
>>895
んー、それはあまり意識していませんでした。
Lisperとしては○○、elisperとしては△△、みたいに書いてくれるとうれしいです。

>>896
> elispのInfoのどこかで再帰よりも反復の使用を勧めていたような気もするし(←実行速度の都合上)。
やはり、そうですか。

>>897
詳しく書いてくれてありがとうございます。

> - 副作用をなくす(破壊的操作 setq や nconc などをなくす)。

これは、関数の外に影響を与えてしまうような書き換えはダメっていう意味ですよね?
(その下に別にletのことを書いているので、そう思ったのですが)
分かります。ただ、そうなるとscheme でいうところの、
(define foo (let ((count 0)) (lambda () (set! count (+ count 1)) count)))
みたいなのはどう書くのがいいのでしょうか? >>229 でも同じことが書かれていますが、俺なら

(setq foo-count 0) ; 場合によってはdefvar
(defun foo () (setq foo-count (1+ foo-count)))
と書いてしまいます。 よくないですか?

(899 のつづき)
> - let で宣言した変数を変更しない。

(let ((x (get-x))
y)
(foo x)
(bar x)
(setq y (get-y))
(hoge x y)
(fuga x y))

のような処理はどう書けばいいんだろう、と悩みます。
(get-x はfoo,bar の前に、get-y はfoo,barの後に呼ばなければ
いけないと考えてください)

(let ((x (get-x)))
(foo x)
(bar x)
(let ((y (get-y)))
(hoge x y)
(fuga x y)))

と書くのがよさそうな気もしますが、これをやっているとletが
どんどん深くなってしまいます。
(900のつづき)
(let* ((x (get-x))
(y (progn (foo x) (bar x) (get-y))))
...)


(defun hoge-fuga (x y) (hoge x y) (fuga x y))
(let ((x ...))
...
(hoge-fuga x (get-y)))

も可能だけどよくなさそう。「パフォーマンスやメンテナンス性との兼ねあいを考え」るべき
ところなのでしょうか?それとも、いい書き方ありますか?

> - 自由変数をなくす。
これは、ちょっとびっくりしました。
(let ((coding-system-for-write 'foo))
(bar))
的な書き方は、最初とても抵抗がありましたが、今はむしろ、これがelisp的なんだと思ってます。

その他のアドバイスは非常に納得です。ありがとうございました。

>>898
> (while lst ... (setq lst (cdr lst)))とか。
これ、lisp的ではないと思うんですが、いいんですか?
>>894
while ってけっこう使う気がする。
mapc とかで済むときはそっちのほうがいいけど。


>>899
> (define foo (let ((count 0)) (lambda () (set! count (+ count 1)) count)))

そういう関数は、参照透過性がないから関数型でいう「関数」じゃないと思う。
必要なら defvar 使って書くのが elisp 的だと思うけど、
なるべくそういう関数を使わないように設計するのが関数型風かな。


>>900
呼び出し順序が重要な時点で、関数型の世界からは外れてるよね。
原理的には深くなってでも let するのがきれいだろうけど、
そういうときは素直に setq しちゃうのが一番な気がする。
903897:03/11/03 12:30
>>899
> これは、関数の外に影響を与えてしまうような書き換えはダメっていう意味ですよね?
そうです。例えば以下のような nreverse は個人的には OK。関数内の push
で作ったコンスセルだから、list には影響をおよぼさない。
(defun my-remove-if-not (func list)
(let ((result nil))
(dolist (item list)
(when (funcall func item) (push item result)))
(nreverse result)))

> (define foo (let ((count 0)) (lambda () (set! count (+ count 1)) count)))
> みたいなのはどう書くのがいいのでしょうか?
基本的には、書かない。書くとしたら elisp はクロージャがないので、
グローバル変数を使う。
904897:03/11/03 12:35
>>900
> これをやっているとletがどんどん深くなってしまいます。
おれの場合は let でどんどん書いていって、あまりにもネストが深くなった
ら、それは「関数を分割すべし」というサインだと思っているので、関数を作
るか flet, labels を使う。

let を「変数宣言」というよりは「値に名前をつける」という感覚でとらえて
みるといいと思う。

それと、この例の foo, bar, hoge, huga みたいな値を捨ててる関数呼び出し
(つまり副作用が目的)は、なるべく書かない。

>>901
> > - 自由変数をなくす。
> (let ((coding-system-for-write 'foo))
> (bar))
(foo 1) => 10 ならば、いつどこで呼びだしても結果が変らないようにするの
が関数型スタイルだから。elisp はダイナミックスコープだから、関数型にあ
わない気がする。その例の場合 optional 引数にでもしといたほうがいいと思
う(elisp 的ではないけど)。

Emacs はエディタなので、関数はほとんど副作用(カーソルを動かしたり、文
字を表示したり)のためにあるから、なかなか難しいところなんだけどね。
原理主義を貫くのも大変だな、と思った。
906897:03/11/03 13:09
>>905
そうだねw

elisp で関数型のスタイルを身につけるのはかなり難しいと思う。ML とかだ
と、例えば let で宣言した変数は変更できないようになっているので、関数
型のスタイルを身につけたいのなら Lisp よりだいぶ楽。
>> (while lst ... (setq lst (cdr lst)))とか。
>これ、lisp的ではないと思うんですが、いいんですか?
理想を貫くには手駒が少ないからやむをえない妥協だ。
末尾再帰やnamed-letがサポートされたら抹殺するよ。
その日がくるまでは dolist で我慢する。
(require 'cl)なコードは書かないって自分ルールがある。
そのわりにはmapconとか.emacsに書いてるけどね。
>>903
ああ、let で宣言した変数を変更してる。
もちろん、だからといってその書き方が良くないとは思わないけどさ。
要するに、理想像を念頭におきつつ、バランス感覚をもって
「崩す」のがベストってことだな。
>>909
ひょっとして889?
mapconは(apply #'nconc (maplist f lst))だよ。

(mapcon #'list '(1 2 3))
((1 2 3) (2 3) (3))

(defun hoge (f lst)
(apply #'append (mapcar f lst)))
(hoge #'list '(1 2 3))
(1 2 3)
'a と (make-symbol "a") の違いがわからん。
後者はどういう時に利用するもんなんでしょうか?
>>911
ちなみにmapcanが(apply #'nconc (mapcar f lst))

>>912
解釈系がもってるシンボル表に入っていない(internされていない)
シンボルが作られる。
(hoge foo)だったらシンボル表のhogeとfooを指してて
hogeの関数セル、fooの値セルを使う。
make-symbolは新しくつくってシンボル表に入れず関数セル、値セルは空いている。
この空いてるところを利用するんだろうけど、
使ったことがないので使い方はわからん。
反復を抹殺する?dolist で我慢する?おーおー再帰以外を完全に見下してやがるな。
Schemer か?はっ、笑わせるぜ。なんでも再帰でかけるから、再帰以外
は不要か?んじゃなぜ Scheme は lambda で書けるのに let とか持って
るんだ?あぁ?便利だから、という実用的な観点からじゃねーのか?あるいは、
関数呼び出しと変数のバインドを意味的に区別したいからか?どっちにしても
リスト処理や反復操作に名前がついてる do 系列を見下せる立場じゃねーだろ!
便利でかつ、読み手に意図が明確に伝わるほうがマシじゃねのか!?
named-letのおまけだ。
>>914
elisper 必死だな(藁
再帰だって便利でかつ、読み手に意図が明確に伝わるぞ
>>915 つまりは絶対必要じゃないけど、あれば便利だからついでに入れちゃったと?
   でも dolist とかはカスなわけ?基準がいまいちだなぁ…。
>>916 あんまり面白くないな。もっとオラをワクワクさせてくれ!ループ抹殺、完全再帰のすばらしさ
   に納得したら Schemer になろうかと思ってるんだから。

末尾再帰がループと等価であることくらいは理解してるます。
なんでそこまでループを見下すのか?再帰的な操作ならともかく、本質的に反復的な
操作まで再帰で書かないといけない理由は何?どう嬉しいの?そこんとこを詳しく
知りたです。elisper としては。
理屈っぽい話はしてもしょうがないとは思うが、
再帰と反復が別々よりは再帰に統一したほうが単純で美しいってことじゃないの?
といってもSchemeにはfor-eachがあるけどね。
map系のように関数を渡すやつ。
(for-each (lambda (x) ...) '(1 2 3 4))

末尾再帰させてると状態の変化を記述してるって感じがするな。
>>918
> なんでそこまでループを見下すのか?

「見下す」ようなことを誰か言った?

scheme が好きになるようなヒトは潔癖症、あるいはそれに近いってだけでしょ。
末尾再帰だとこういうふうに書くってのはある。
(defun hoge (lst)
 (cond ((null lst) 'x)
    ((a (car lst)) 'y)
    ((b (car lst)) 'z)
    (t (hoge (cdr lst)))))
これがいいスタイルだと感じるわけ。
反復の途中で脱出させるのはかっこわるい。
まあでも、好みの問題だろうけど。
言語の機能を十二分に生かして、簡潔で効率のよいコードを書けばいい。
なるほど。漏れは、リストの頭から順番に処理して、かつ返り値がリストじゃ
ないときは dolist、関数をリスト要素に適用して、結果のリストが欲しいときは mapcar
てなのが好みだ。
じゃあ、俺はfor-eachを書いて使おうかな。
リストに対して繰り返し処理をするときは dolist,mapcar など便利なのがあるけど、
バッファーに対する繰り返し処理はやっぱりwhileを使うしかないの?
例えば、search-forwardして、見つかるごとに何か処理しなければいけないときとか。
最近 Common Lisp 好きに loop を語って貰ったので↓でも良い様な気がしてる。
(loop for x in lst
when (a x) return 'y
when (b y) return 'z
finally (return 'x))
お前ら、ほんとに、そんなに loop が嫌なのかと。
>>924 while でいいんじゃねーの?なんか不満でもあるのか。どうしてもというならば、
(with-all-buffer ...)
みたいなマクロを組んで、内部で while を使うか、再帰するか、goto を使うかは、
グローバル変数の *style* で切り替えるとか。
何が悲しくてforとかinとかreturnとかfinallyを書かなきゃならんのか
俺はloop使わない方が好きだ。
>>925
このスレで loop使いたきゃ、そのまえに俺が納得いくまで
loopについて語ってくれ。
じゃないとついてけないので……。
だんだん不毛になってきたな。なんだか
「おれはラーメンが好き」
「いやいや、やっぱり僕はカレーが好き」
というのを必死に言いあってる感じ。ただの好き嫌いの問題じゃん。

>>914 は学生時代に再帰が理解できなかったコンプレックスをまだ乗り越えて
いないに一票。(と煽ってみる)
定食屋でカレーやラーメンについて語ってるような感じ。
LISP Schemeスレでさんざんやったような気がするんだけどね。
schemeや common lispやってない人間からしたら
いい迷惑って感じかもな。
威張るラストセックス プ)
>>912
make-symbol 使うのは、主に macro 書くときとかだと思う。
絶対に他と被らない symbol ができるから。
elisp info の Macros::Problems with Macros::Surprising Local Vars に例が出てるよ。
>>934 げげ!! 漏れ今迄 gensym 使ってた…まさか gensym が cl パッケージだったとは….
まいったなぁ,CL 好きだが,嫌われてるみたいだから emacs ではなるべく cl 使わない
ようにしようと思ったのだが.あぁ,xyzzy 良いなぁ.X 環境にも欲しいなぁ.
好きなら使えばいい。
でも俺は嫌いだから使用を強制しないでくれ。
いや,Emacs の cl は好き嫌いではなくランタイムには使わないほうが良いんでしょ?
今迄知らずに使ってただけで.強制する気は全く無いです.はい.
938925:03/11/04 22:36
>>927 >>928 正直、すまん。Scheme 話だったので LISP Scheme スレと
勘違いしてしました。elisper に loop を勧める気はないです。

まぁ、CL なら loop も捨てたもんじゃないんですよ。リスト中の条件に
合う要素(条件は複数ね)を数えたい場合とか(これはそのままじゃ emacs じゃ動かないけど)、
(loop for x in lst
counting (F? x) into h1
counting (G? x) into h2
finally (return (values h1 h2)))
が一番すっきりしてると思うわけ。別にこれが lisp らしいと主張する気は
さらさらないっす。ちょいと小粋で便利な別の言語を覚えるつもりでどーぞ、と。
loop に興味持つ人は少なそうだけど、居たら続きは LISP Scheme スレでやりましょう。
「ラーメン(反復)?カレー(再帰)? とろくさい、きしめん(loop)をわすれとっ
たらあかんわ」
という人がでました。
>>938
それは普通、関数書くだろ。
(defun hoge (p lst)
(let ((n 0)
(while lst
(if (funcall p (car lst)) (setq n (+ n 1)))
(setq lst (cdr lst)))
n))

(values (hoge 'F? lst) (hoge 'G? lst))
941925:03/11/05 00:31
>>940 スレ違いだから LISP スレで…と思ったら Emacs にも loop あったんですね。
cl がんがってるなぁ。loop のメリットとしては、
- 効率が良い(リストを一回走査するだけ)
- 短い
- 読めばなんとなく意味がわかる(非 lisper にも、ね)
ただ、Common Lisper でも loop は嫌って人も居る(漏れも最近までそうだった)
のも事実。でも、簡単な使い方くらいなら覚えておいても損はないと思う。
…でもまぁ、Emacs Lisp では cl パッケージなのでそんなに勧める気はないです。
リストを一回だけ走査したいんなら勝ち目ないなあ。
この関数ならloopで書いても速度はあがるまい。
(defun hogehoge (lst &rest p-lst)
(mapcar (lambda (x) (hoge x lst)) p-lst))

(apply 'values (hogehoge lst 'F? 'G?))
elispでの valuesとかの扱い知ってるのか知らないのか、
どっちなのかね?
たぶんあなたは別のスレ行ったほうがあなたにも
elisperにも幸せと思われ。
943 ではないが,values 云々はどーでもよくないか?気に入らないなら list に読
み換えればいいじゃん.943 でも結局 hoge を 2 回呼ぶからリストを 2 回なめる事
になるんじゃないのか?同等の効率を得ようと思ったら,
(let ((x nil) (v1 0) (v2 0))
(while lst
(setq x (car lst))
(when (F? x) (setq v1 (+ v1 1)))
(when (G? x) (setq v2 (+ v2 1)))
(setq lst (cdr lst)))
(list v1 v2))
と書くわけだが,これは loop マクロの展開結果とほぼ同じなんだよね….
まぁ,しかし emacs の loop には致命的な弱点がある.それは嫌われ者の cl
だという事.925 も,CL なら(これは Common Lisp ならの意味だろう) loop
も捨てたもんじゃないと言ってるだけで,elisp には勧めないと言ってるんじゃん.
興味のある香具師は LISP スレへの移動を勧める.
>>944
うすうすlistのエイリアスだろうなって思ってたけどね。

>>945
一回走査なら専用のloopには勝てないわけで、
hogehogeを書けるかって話にもっていこうとしたの。
二重ループならloopでも(length lst)×(length p-lst)だけの走査が必要で
loopにp-lstを展開するような機能はあるのかとか
p-lstを展開するマクロ書けるのかって聞きたかったの。

でも、loopの話はもういいや。
Perlやっててelisp始めたばかりです
Lispは汎関数がいかしますね。
しかし型キャストが面倒ですね(string-to-numberなど)。
自動的に型キャストするライブラリーってありますか?
また別件ですが逆行列を計算できるライブラリーもありますでしょうか
>>947
> しかし型キャストが面倒ですね(string-to-numberなど)。
Perlって文字列と数字を区別しないのかな...

> 自動的に型キャストするライブラリーってありますか?
私はGNU Emacs 20を使っているんですが、標準のライブラリには
そういうのはなかったと思います。

いろいろなライブラリを集めたEmacs Lisp Listで探してみたらどうでしょう?
http://www.anc.ed.ac.uk/~stephen/emacs/ell.html
英語ですけど。だれか短い説明だけでも日本語に翻訳してくれないかな...
rubyなら "123".tos, pythonでも string.atoi("123")
煽り覚悟で書くと、
Perlやってて汎関数がいかしてるってんなら、Rubyでもいいんじゃね。
951デフォルトの名無しさん:03/11/07 10:51
>>947
elisp で数値計算か?そんなパッケージあったかなぁ.数値計算ソフトとの
インターフェースなら一杯あるからそれを使えば?SCI-LAB と連携するのがお勧めかなぁ.
どうしても Lisp でプログラミングしたいなら Common Lisp + MATLISP とか.↓な感じ.

* (setf mat [100 1; 20 5])

#<real-matrix 2 x 2
100.00 1.0000
20.000 5.0000 >
* (m/ mat) ;; 逆行列の設定

#<real-matrix 2 x 2
1.04167E-2 -2.08333E-3
-4.16667E-2 0.20833 >
* (m* mat (m/ mat))

#<real-matrix 2 x 2
1.0000 0.0000
0.0000 1.0000 >
952947:03/11/07 13:02
> いろいろなライブラリを集めたEmacs Lisp Listで探してみたらどうでしょう?
> http://www.anc.ed.ac.uk/~stephen/emacs/ell.html

> SCI-LAB と連携するのがお勧めかなぁ.
> どうしても Lisp でプログラミングしたいなら Common Lisp + MATLISP とか.↓な感じ.

有難うございます。調べてみます。
逆行列は、実は今は R (www.r-project.org) をemacsから呼んでいるのですが、
(実は途中の文字列の parsing で Perl をかましています..ださい)
遅いし、Rをインストールしてないと使えないので、他の手段がないかなと思ってます。

> Perlやってて汎関数がいかしてるってんなら、Rubyでもいいんじゃね。

Rubyを習うとPerlと見かけが似すぎてて混乱しそうなので、習っていません...
R で遅いから elisp ってのは違う気がするな…。R より速いってこたぁないだろう。
純粋に計算速度の問題なら計算部分だけ C で書くとか。
954947:03/11/08 07:25
R は、起動に5秒ぐらいかかるんですよね
起動してからの計算は別に遅くもないんですが。
Lisp でも他の Common Lisp のアプリケーションをインストールする必要が
あるのだと結構おおがかりですね。
結局 Perl の ライブラリを使ってしまうかも知れない..
なんと「起動するまでが」遅いって話だったのか….最初に 5 秒待つのが嫌なのか.
それって一回だけじゃないの?ひょっとして,頻繁に Emacs を終了,起動とかやっ
てる人? Common Lisp 云々は「計算が」遅い場合の話なので 947 の望む話とは違う
だろう.もちっと具体的にやりたいことを書かないと他人に伝わらないと思われ.
ものによっては elisp で済むかもしれないし,Perl のがてっとりばやいかもしれない.
ファイルの読みこみ時間じゃないのか
980くらいになったら次スレ立てようか。
なんで cl って嫌われてるの?
1. ランタイムにつかうとマズーだから
2. Common Lisp より Scheme が好きな香具師が多いから
3. 再帰原理主義者は do 系列の反復用構文が嫌い
4. cl の拡張 loop マクロは文字列やハッシュをループで処理するときに便利だが、
  なんでか嫌いな人が多い。Common Lisper の中でも別れる。
  Peter Norvig 本から入門した人→ loop が作れる。使うべきときには使う。
  Paul Graham 本から入門した人 → Paul が loop 嫌いなので loop は糞だと思ってる。

…まぁ、1がもっとも大きな原因じゃないの?
cl の好悪はおいといて、スレにコードを書く時は、
> 1. ランタイムにつかうとマズーだから
なわけだし、Navi2ch で C-x C-e できるよう、cl 使わず書いて欲しい。
具体的に言うと、何が使っちゃ駄目なの? dolist, dotimes はいいよね?
駄目なのは loop だけ?
dolist, dotimesは subr.elにあるし、十分認知されたから ok.
ついでに elisp的にというよりスレ的にだが、
cl利用しまくりコードは lispスレへカエレみたいな。
>>959
> 1. ランタイムにつかうとマズーだから
具体的には何がマズいの?
教義で禁じられているからです。
http://www.gnu.org/manual/elisp-manual-21-2.8/html_node/elisp_709.html
> Please don't require the cl package of Common Lisp extensions at run
> time. Use of this package is optional, and it is not part of the
> standard Emacs namespace. If your package loads cl at run time, that
> could cause name clashes for users who don't use that package.

cl-* 以外の全ての外部名は、本来ユーザーに公開されてるはずの名前。
たとえば、.emacs で replace という俺コマンドを定義していた場合、
ランタイムで cl を要求されちゃうと動かなくなる。
966958:03/11/09 21:35
なるほど。
cl の出来そのものが悪いという訳じゃないのね。
emacs の正式パッケージじゃないから
名前がバッティングするおそれがあるということだけか。
>>959 の 2-4 は好みの問題だしね。
素人なので「run-time以外」という表現がよく理解できませんが
どういうときには使っていいのでしょうか?
多値が使えない
バイトコンパイル時
実際自分で使うものでも.emacsでもcl使ってない人って多いの?
elispまともに書かない人は別として。
俺は自分で使うものはcl使いまくりなのでcl全然構わない派なんだけど。
971958:03/11/10 01:26
おれはいきなり require してるよ。
次スレテンプレ用リンク集

* Emacsカスタマイズ入門
ttp://www.netfort.gr.jp/~kiyoka/emacs_setq/emacs_setq.html

* GNU Emacsマニュアル (Emacs20用)
ttp://www.sr3.t.u-tokyo.ac.jp/~takekawa/gnujdoc/emacs-20.6/emacs-ja_toc.html

* リファレンスマニュアルは(ちと古い)
ttp://www.fan.gr.jp/~ring/doc/elisp-manual/elisp.html

* GNU Emacsマニュアル(英語) (Emacs21用)
ttp://www.gnu.org/manual/elisp-manual-21-2.8/html_node/elisp.html

* Programming in Emacs Lisp
ttp://www.math.s.chiba-u.ac.jp/~matsu/lisp/emacs-lisp-intro-jp.html

* Emacs Lisp あれこれ
ttp://www.mew.org/~kazu/doc/elisp/

* Emacs Lisp で書かれたプログラムのバグを知らせる方法
ttp://www.jpl.org/elips/BUGS-ja.html

Emacs21用リファレンスマニュアルの和訳ってありますか?
ランタイムにclパッケージ群が必要かどうかって、cl.elとか実際に覗かないと
わからないよね? それって面倒だな。 
漏れは自分では cl 使ってる気はなかったが、cl がロードされていた…。loop 以外
に具体的に何がまずいの?具体的に言ってくれなきゃわかんねーYO!! いちいち cl
かどうか調べるのマンドクサ。cl 見たくない香具師は見ないってことでどーよ?
navi2ch のフィルタリング機能でも使えばそれくれー簡単だろう。
>>971
CLのinfoに"Some features conflict with existing things in
Emacs Lisp"と書いてあるけど実害はないの?
>>973
大体この関数が怪しいとかって予想つくでしょ?
で、それを describe-function すれば定義したファイル判明するし。
いうほどやっかいじゃないと思う。
# clが loadされると subr.elにあるのに再定義されてしまう
# dolistのような例もあるけど。
## cl が loadされた後に subr.elので再再度定義しなおしたりしちゃったら
## なんかマズいことあったりするのかな。
>>975
漏れ elisper じゃないから良くわかんないけど,拡張された cl なやつ
(素のやつでは使えない機能付き)で置きかえちゃうから、cl 無しの人で実行で
きないとかでないの?漏れ気づかずにロードされてたクチだけど、100 MB オーバー
の大量の elisp パッケージのどれも問題が出たことはないし(たぶん)。

>>973
だから、どれなんだ?具体的に言ってくれ。そしたら一応気をつけるから。
今迄の話だと,俺には loop くらいしか推測がつかない。
このスレでよく出るものでは、
mapcon, mapcan, maplist, mapcar*, flet, labelsなどなど。
* loop、do、lexical-let、labels 等のマクロ
(eval-when-compile (require 'cl)) でコンパイル時に解決できるから
他人に配布するプログラムでも使ってかまわない。
ただし、初心者の質問への答え等には向かないと思う。

* merge、union、map 等の関数
実行時に cl に依存してしまうので、他人に配布するプログラムでは
使ってはならない。自分だけのために書くならお好きに。
ド初心者で悪いんだけど、実行時に cl に依存すると何が問題なの?
cl って emacs の標準配布物だよね?
>>980 ログよめ。>>965
初心者的には俺 merge とか 俺 union とか定義するなら、素直に cl 使った方が
いいような気もするんですけど、そーゆうもんでもないんですね。よくわかんない
けど、とりあえず cl は避けておきます。なんでこんなの標準添付されてんのかな?
require したらエラーにするくらいしてくれてもいいのに。ややこしいなぁ。
>>982
Emacs part10
http://pc.2ch.net/test/read.cgi/unix/1066719492/

245 :名無しさん@お腹いっぱい。 :03/10/31 23:40
>>244
だったら使わない方がいいよ。cl は「○○もないのかよ」ってな
Common Lisp 厨房をなだめるためにあるパッケージだから。
The Emacs Lisp Reference Manual の範囲で書いとけ。
知らぬ間に cl がロードされていて困ってます。.emacs 内では require していませ
ん。どうやらなにかのパッケージが勝手にロードしちゃってるようです。このままだ
とどのような恐しい事が起るのでしょうか?また,どのように対処したらいいのでしょうか?
>>982
cl-*.el のソースをコピペして関数名を変えて使ってるよ。

>>984
他の人はどうだか知らんが、今まで cl をロードしてて変なことになったこと
はないよ。info の注意書きは「依存しないようにしておいたほうが無難」く
らいの意味あいなんじゃないの?

この問題は、そもそも elisp にパッケージ機構がないのが原因なんじゃないの?
ド初心者です。apel みたいな標準名前空間(パッケージ名の prefix 無しくらいの
意味ね)に入れちゃうパッケージはわりとメジャーなようですがどうなんでしょう?
標準で付いてくる cl はつかってはならないのなら,apel みたいな外部ライブラリ
は言語道断なんでしょーか? cl で置き換えられちゃう関数群ってアッパーコンパチ
なんでないの?なんか elisp 始める前に混乱中ですが…。
987971:03/11/10 15:24
>>975
それは
Some Common Lisp features have been omitted from this package for
various reasons:
この欄に出てくる文でしょ。emacs と conflict する feature は
別名にしてるって書いてあるよ。

lexical-let とか flet とか label とか、単純に便利だと思うんですけどね。
人にくばる可能性があるものには使わないけど。
こういうの誰か作ってくれない?

(require 'cl-cl)

(cl-union ...)
(cl-merge ...)

みたいにプレフィックスが全部ついてるの。機能は cl と全く同じで。
cl(|-(macs|extra|...)).elを読み込んで、symbolを置換してから評価するとか?
990971:03/11/10 20:35
単純に
(defun hoge
(defmacro hoge
(defalias hoge
これらを置換したら?
そろそろ次スレだね。
誰か立ててー俺立てて見たけど無理だった。
前スレ
Emacs Lisp
http://pc2.2ch.net/test/read.cgi/tech/1004551074/

関連スレ
Emacs part10
http://pc.2ch.net/test/read.cgi/unix/1066719492/
LISP Scheme Part8
http://pc2.2ch.net/test/read.cgi/tech/1058263391/
さえ入っていれば大丈夫だよ。
>>986
apel はそうでもないけど、糞flim は本家 gnus 使ってると smtpmail-send-it あたりで
emacs 標準のものと名前が衝突して、しかも微妙に仕様が違うから document 通りに
設定してるの動かない、とハマる。
しかもファイル名まで同じだから余計タチ悪い。氏ね。
995 :03/11/10 23:44

ヤフー掲示板で「学習指導」を行っていた
学習塾の名物講師・田村晋也が 【 男児ポルノ販売で逮捕 】 されたため、
塾に通っていた保護者(特に母親から)激しい罵倒をされています。

【社会】男児ポルノ画像、メール配信した疑い 教諭ら6人逮捕[10/09]
http://news5.2ch.net/test/read.cgi/newsplus/1065871362/

逮捕されたのは、
田村晋也(39)・・・・・さいたま市南区 南浦和1−20−11−201
地図:http://map.yahoo.co.jp/pl?nl=35.50.55.477&el=139.40.16.481&la=1&fi=1&sc=3

犯人の経営していた塾
『まったく新しい学習空間 TOM'Sクラブ』

埼玉県 戸田市本町4-*-*  モー****パー*戸田***F
048-4**-7***
正確な住所・電話番号等の記載:
http://www.google.co.jp/search?q=cache:dQRI_9ohaWYJ:www11.ocn.ne.jp/~juken/search/tohuken/saitama.html+%E3%81%BE%E3%81%A3%E3%81%9F%E3%81%8F%E6%96%B0%E3%81%97%E3%81%84%E5%AD%A6%E7%BF%92%E7%A9%BA%E9%96%93TOM%27S%E3%82%AF%E3%83%A9%E3%83%96&hl=ja&ie=UTF-8
現場の地図:http://map.yahoo.co.jp/pl?nl=35.48.9.882&el=139.41.7.470&la=1&fi=1&sc=3
埋め立て
Emacs Lisp 2
http://pc2.2ch.net/test/read.cgi/tech/1068467385/
□□□□■□□□□□■□□□□□□□□□□□□□□□□□□□□□
□□□■■□□□□□■□□□□□□□■■■■■■■■■■■■□□
□□■■□□□□□■■■■■■□□□□□□□□□□□□□■■□□
□■■□□■□□□■□□□□■□□□□□□□□□□□□■■□□□
□□■□■■□□■■■□□■■□□□□□□□□□□□■■□□□□
□□□■■□□■■□■■■■□□□□□□□□□□□■■□□□□□
□□■■□□□□□□□■■□□□□□□□□□□□■■□□□□□□
□□■□□□■□□□■■■■□□□□□□□□□□■□□□□□□□
□■■■■■■□□■■□□■■□□□□□□□□□■□□□□□□□
□□□□■□□□■■□□□□■■□□□□□□□□■□□□□□□□
□□■□■□■□□□□■■□□□□□□□□□□□■□□□□□□□
□□■□■□■□□□□□■■□□□□□□□□□□■□□□□□□□
□■■□■□■□□□□□□□□□□□□□□□□□■□□□□□□□
□■□□■□□□□■■■□□□□□□□□□□□□■□□□□□□□
□□□□■□□□□□□■■■□□□□□□□□□□■□□□□□□□
□□□□■□□□□□□□□■■□□□□□□■■■■□□□□□□□
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。