のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,541,524人
昨日:no data人
今日:
最近の注目
人気の最安値情報

私的良スレ書庫

不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitter
ログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。

【叩かれて】Emacs Lisp道場【強くなれ】

emacs スレッド一覧へ / emacs とは? / 携帯版 / dat(gz)で取得 / トップメニュー
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
レスフィルター : (試験中)
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter
101 : 名無しさん@お腹 - 03/10/23 14:51 (+57,+29,-23)
包囲アドバイスって訳語は、日本語infoで使われちゃっていますけど、
あまり良さそうに思えないですね。語感が合わなくて。
102 : 名無しさん@お腹 - 03/10/24 06:20 (+21,-15,-7)
>>96
> kazuのeispは信じられない程アレなので参考にならない。

どのへんが?
103 : ◆kXMewI - 03/10/24 06:28 (+51,+27,+0)
ま、いろいろとね。。。
104 : 名無しさん@お腹 - 03/10/24 08:30 (+34,-29,+0)
>>103
FUD?
105 : 名無しさん@お腹 - 03/10/24 12:41 (+94,+29,-12)
>>104
そうとも言いきれなさそうだから困る。
リスト遊びの評判もだが。
106 : 名無しさん@お腹 - 03/10/24 14:45 (+65,+29,-1)
>>105
広瀬さんの本はどう?
107 : 名無しさん@お腹 - 03/10/24 17:10 (+57,+29,-40)
「リスト遊び」は純粋にとても良かったと思うが。
mewは使ってないからコードの評価はしないけど。
108 : 名無しさん@お腹 - 03/10/24 20:33 (+7,-29,-101)
2章を頭からちょっと読んでみたが

- nil を偽値として紹介した直後に not でなく null を紹介。
その後で空リスト。
偽値と空リストがごっちゃになってる taste がしてイヤでつ。
同じ lisp ばかりじゃねえんだぞと。

- predicate は「述語」でなしに「断言する」でよかったんだっけか?

- "\n" が改行文字にすりかわるのは評価じゃなくてリーダーの問題だろ
\n ならいいけど \\ が出てきたらこんな理解で困るんじゃないか。
regexp を扱うようになったらパニックだろ。

とか考えた漏れは逝ってよしでつか
109 : 名無しさん@お腹 - 03/10/24 20:50 (+30,+12,+0)
でつ
110 : 名無しさん@お腹 - 03/10/24 20:54 (-1,-29,-13)
>>108
> 同じ lisp ばかりじゃねえんだぞと。
違う Lisp 知らない。教えて。
Scheme は Lisp じゃないし。
111 : 名無しさん@お腹 - 03/10/25 09:12 (+68,+29,-2)
>>99
まだ理解できていないようで・・・
112 : 名無しさん@お腹 - 03/10/25 09:30 (+12,-30,-88)
>>111
あのー、罵倒されても構いませんから、
(lambda ...)

(function (lambda ...))
で具体的に何が変わってくるのか、
もうちょっと詳しく教えてください。
俺の理解では、バイトコンパイルされてしまえば同じ。
そのままだったら、functionのほうがマクロ展開ないぶん、
微妙に速いかもしれない(俺の勝手な推測)というところなんですが。
# quoteの場合が違うのは分かっています。
113 : 名無しさん@お腹 - 03/10/25 14:44 (-2,-30,-37)
それでいいんじゃないの? 個人的には (lambda ...) よりも #'(lambda ...)
のほうがパッと見たときにわかりやすいので好み。
114 : 名無しさん@お腹 - 03/10/26 10:49 (+87,-30,-218)
時間がかかる処理をしていて、何かキーが押されたら中断する、ということを
考えています。試しに下のようなのを書いてみました。
(defun g ()
(interactive)
(let ((i 0))
(while t
(setq i (1+ i))
(when (input-pending-p)
(keyboard-quit)))))

これはうまくいきました。

今、やりたいのは 上記のwhile部分がブラックボックス扱いのときで、
(defun heavy-proc ()
(let ((i 0))
(while t
(setq i (1+ i)))
i))

という関数の中身を変更せずに、呼び出した後でキー入力があれば中断して戻
るということがしたいのです。割り込みのような感じです。
(defun f2 ()
(interactive)
(condition-case nil
(heavy-proc)
.....

とやればいいのかなと思ったのですが、肝心のキーが押されたらエラーを発生
するやり方がさっぱり見当がつかないのです。
なにか良い方法を知っておられましたら、教えてやってくださいまし。
115 : 名無しさん@お腹 - 03/10/26 11:42 (+5,-29,-8)
>>114
condition-case で quit 取るんじゃだめなん?
116 : 114 - 03/10/26 18:05 (+3,-30,-88)
>>115
アドバイスありがとうございます。

(defun heavy-proc ()
(let ((i 0))
(while t
(setq i (1+ i)))
i))

(defun f2 ()
(interactive)
(condition-case nil
(heavy-proc)
((quit)
(message "aborted."))))

こういうことでしょうか。
これだと、C-g以外のキーを押したときは中断できません。
もうちょっと練ってみます。
117 : 名無しさん@お腹 - 03/10/27 01:23 (+4,-29,-14)
全てのキーに signal発生させるよう設定したキーマップ使用すれば
いけるかも? signalの代わりに throwでもいいけど。
118 : 114 - 03/10/27 09:49 (+3,-30,-231)
>>117
試しにこうしてみましたが…

(defvar tmp-map nil
"temporary key map for aborting.")
(defun f2 ()
(interactive)
(let ((previous-keymap (copy-keymap (current-local-map))))
(if tmp-map
nil
(setq tmp-map (make-sparse-keymap))
(define-key tmp-map "a" 'keyboard-quit)
(define-key tmp-map "b" 'keyboard-quit)
(define-key tmp-map "c" 'keyboard-quit))
(use-local-map tmp-map)
(condition-case nil
(heavy-proc)
((quit)
(message "aborted.")))
(use-local-map previous-keymap)))

中断してくれない(^^;
119 : 名無しさん@お腹 - 03/10/27 10:25 (+4,-29,-10)
うーん、自分で bindした keyboard-quitと
C-g は扱いが違うって事なのかな?
120 : 114 - 03/10/27 11:47 (+3,-30,-226)
>>119
今度は以下のようにsignalを使ってみましたが…
(defvar tmp-map nil
"temporary key map for aborting.")
(defun my-quit ()
(interactive)
(signal 'quit nil))
(defun f2 ()
(interactive)
(let ((previous-keymap (copy-keymap (current-local-map))))
(if tmp-map
nil
(setq tmp-map (make-sparse-keymap))
(define-key tmp-map "a" 'my-quit))
(use-local-map tmp-map)
(condition-case nil
(heavy-proc)
((quit)
(message "aborted.")))
(use-local-map previous-keymap)))

相変わらず、中断せずでした。

edebugで追いかけてみると、キーマップ自体は変わってくれているのですが、
heavy-procを呼び出したらC-g以外をセンスしてくれないような感じがします
です。
121 : 114 - 03/10/27 12:30 (+3,-30,-273)
助言を元に調べました。
なんとなく分かってきた気がします。(気がするだけかも…)
(defun heavy-proc ()
(let ((i 0))
(while t
(setq i (1+ i)))
i))

(defun f3 ()
(interactive)
(let ((previous-keymap (copy-keymap (current-local-map)))
(previous-input-mode (current-input-mode)))
(set-input-mode t nil 0 ?a)
(condition-case nil
(heavy-proc)
((quit)
(message "aborted.")))
(use-local-map previous-keymap)
(set-input-mode (car previous-input-mode)
(nth 1 previous-input-mode)
(nth 2 previous-input-mode)
(nth 3 previous-input-mode))))

キーマップ再定義はせずに、上記のようにすると aキーで中断できるようにな
りますた。あとはこれを全部のキー文字に割り当てれば、と考えたのですが…

(set-input-mode t nil 0 '(?a ?b)) のような複数指定は不可
(set-input-mode t nil 0 nil) ではデフォルトのC-gになる

の様です。…もはや手詰まりか…
122 : 114 - 03/10/28 10:24 (+3,-29,-43)
ふと思い立って、
(keyboard-translate ?b ?\C-g)
とかやってみましたが、やはり中断してくれませんね。

コマンドループ内でC-gというのはかなりの特別扱いの感じがします。
こんなローレベルな関数が効かないなんて…。

# emvaders.elとかどうやってるのかな。ゲームなら割り込みみたいな処理を
してると思うんだけど。
123 : 114 - 03/10/28 10:53 (-1,-29,-47)
emvaders.elでは input-pending-pで処理してますた。
ゲーム的にはこのやり方は納得です。
にしても、ハマりすぎです。
誰かお願いです。ひとつ叩いてやってください。ガツンと。
124 : 114 - 03/10/29 15:54 (+3,-30,-277)
苦肉の策として、「最後に押したキーで中断する」というのを考えてみました。

(defadvice heavy-proc (before input-set disable)
(set-input-mode t nil 0 last-input-event))

(defun heavy-proc ()
(interactive)
(let ((i 0))
(while t
(setq i (1+ i)))
i))

(defun f3 ()
(interactive)
(let ((previous-input-mode (current-input-mode)))
;; enable advice
(ad-enable-advice 'heavy-proc 'before 'input-set)
(ad-activate 'heavy-proc)
(condition-case nil
(heavy-proc)
((quit)
(message "aborted.")))
;; disable advice
(ad-disable-advice 'heavy-proc 'before 'input-set)
(ad-activate 'heavy-proc)
(set-input-mode (car previous-input-mode)
(nth 1 previous-input-mode)
(nth 2 previous-input-mode)
(nth 3 previous-input-mode))))

ややこしいやり方になってしまいました。
125 : 名無しさん@お腹 - 03/10/29 16:16 (+4,-29,-1)
unwind-protect使ったほうがいいよ。
126 : 名無しさん@お腹 - 03/10/29 16:46 (+3,-30,-109)
なぜ C-g で quit がいやなのかようわからんが、アドバイスせんでも
(let ((previous-input-mode (current-input-mode)))
(unwind-protect
(progn
(apply #'set-input-mode
`(,@(butlast previous-input-mode) ,last-input-event))
(heavy-proc))
(apply #'set-input-mode previous-input-mode)))
でいいような。
127 : 114 - 03/10/29 17:56 (+3,-29,-75)
>>125, 126
助言、ありがとうございます。
今まで、unwind-protect は実際にどういう場面で用いるのかわかりませんでしたが、
なんかわかったような気がしますです。

> なぜ C-g で quit がいやなのかようわからんが、

bf-mode.elというelispをいじくっているのですが、html をw3mで表示したと
きに重いので、キャンセルの手段が欲しいと思ったのです。
128 : 名無しさん@お腹 - 03/10/30 01:09 (-6,-29,-2)
C-gでいいじゃん…
129 : 名無しさん@お腹 - 03/10/30 21:47 (-1,-29,-15)
ファイルへの出力ってどうやってするんですか?
とりあえずhoge.txtに"hoge\n"と書いて出力する程度でいいんですが。
130 : 名無しさん@お腹 - 03/10/30 21:53 (+31,-29,-3)
write-regionでいいじゃん…
131 : 名無しさん@お腹 - 03/10/30 21:58 (+62,+29,-2)
>>130
さんくす!
ググってもよく分らなかったもので。
133 : 名無しさん@お腹 - 03/12/06 19:06 (+57,+29,-8)
もはや、このスレもこれまでか…
がんばってる同士はおらんのだろうか。
134 : 名無しさん@お腹 - 03/12/06 22:27 (+41,+18,+1)
2ch以外で頑張ってます。
135 : 名無しさん@お腹 - 03/12/07 17:16 (+52,+29,-3)
たとえば、それはどこなんでしょう?
136 : 名無しさん@お腹 - 03/12/10 02:40 (+13,-29,-37)
あのー質問なんですが,
あるファイルの内容を調査したい場合,Emacs Lisp だと
対象となるファイルを一旦 find-file とかで
全て読み込まなくちゃ駄目なんでしょうか…?

外部プロセスに逃げると言う手も考えましたが,
そんなものを使うよりは,Emacs Lisp のみで完結したいので…
137 : 名無しさん@お腹 - 03/12/10 03:10 (+47,-17,-7)
etagsとか?
ってか、どんな調査したいのかにもよるのでは?
138 : 名無しさん@お腹 - 03/12/10 10:17 (-6,-29,+0)
dired で % g
139 : 名無しさん@お腹 - 03/12/10 10:30 (+36,-30,-56)
全部読まなくても
(insert-file-contents FILENAME &optional VISIT BEG END REPLACE)
でファイルの一部だけを読む事ができるよ。
140 : 136 - 03/12/11 23:27 (+69,+29,-83)
御回答どもです

>>137
どんな調査ってのはイロイロあるものの,
コレさえ解決できればってのは無くて,
要は,

open→無視して良いデータは破棄しつつ満足するまでread→close

ってのをやりたいだけでして…

>>139
ありがとうございます。
info読みなおしました…
今まで如何にイイカゲンに読んでたかを思い知りますた…
名前付きパイプとかも読めちゃうんすねコレ…
141 : 名無しさん@お腹 - 03/12/26 16:20 (+24,-3,-30)
一つの関数でλを定義する数は何個ぐらい許されるんでしょうか?
142 : 名無しさん@お腹 - 03/12/26 17:03 (+57,+29,-28)
なにがしたいのか分からんが、とりあえず作ってみたら?
もっと意図を明確にしたうえで、ム板のスレで質問するのがいいと思うが。
143 : 名無しさん@お腹 - 03/12/26 22:02 (+33,-30,-268)
(defun newschangelog (start end)
"ChangeLog中の不必要な部分を削除"
(interactive "r")
(save-excursion
(save-restriction
(narrow-to-region start end)
(goto-char start)
(replace-regexp "^[ \t]*.*STRONG.*" "")
(goto-char start)
(replace-regexp "^ *<A HREF.*" "")
(goto-char start)
(replace-regexp "</A></DT>" "")
(goto-char start)
(delete-matching-lines "^$")

(goto-char start)
(replace-regexp "^[ \t]*" "\t")
)))

* news/index.html: 記事追加
★ PTCジャパン、Linux対応Pro/EをLinux World Expoに参考出品</A></DT>
<DT><STRONG>日経BizTech</STRONG>
<A HREF="http://biztech.nikkeibp.co.jp/wcs/show/leaf/CID/onair/biztech/comp/247927">
日本SGI、Linux向けのシステム構築支援サービス</A></DT>
<DT><STRONG>c|net</STRONG>
<A HREF="http://japan.cnet.com/svc/rss?id=1261.47623.54525">
日本国内のLinuxサーバ市場:ビジネス利用には課題が多い</A></DT>


上記★から☆までがリージョンに指定されている状態だとします。このとき、
カーソルが★にあるのか☆にあるのかで、M-x newschangelog の結果が異なり
ます。
144 : 143の続き - 03/12/26 22:03 (+3,-30,-181)
具体的には、カーソルが☆にあると
PTCジャパン、Linux対応Pro/EをLinux World Expoに参考出品
<DT><STRONG>日経BizTech</STRONG>
日本SGI、Linux向けのシステム構築支援サービス
<DT><STRONG>c|net</STRONG>
日本国内のLinuxサーバ市場:ビジネス利用には課題が多い
となり、カーソルが★にあると
PTCジャパン、Linux対応Pro/EをLinux World Expoに参考出品
日本SGI、Linux向けのシステム構築支援サービス
日本国内のLinuxサーバ市場:ビジネス利用には課題が多い

となります。
希望する結果は、カーソルが★☆のどちらにあっても
PTCジャパン、Linux対応Pro/EをLinux World Expoに参考出品
日本SGI、Linux向けのシステム構築支援サービス
日本国内のLinuxサーバ市場:ビジネス利用には課題が多い
のようになることです。添削おねがいします。
145 : 名無しさん@お腹 - 03/12/26 23:41 (-1,-29,-38)
なんか例示されてるのと違い、空行が入ってしまうなーと思ったら、
transient-mark-mode かどうかで挙動が違うな。
で、offにして試してみたけど、どちらも okっぽかったけれど。
146 : 143 - 03/12/27 00:21 (+3,-30,-139)
検証ありがとうございます。おっしゃるとおり、手元の Emacs 20.7.2 を
\emacs -qで起動すると、★☆どちらにカーソルがあっても希望の結果になり
ました(transient-mark-mode t/nil のどちらも)。
ところが、XEmacs 21.1 を \xemacs -q で起動させて確認したところ、
transient-mark-mode t/nil どちらの場合も 144 に書いた結果になるのです。

常用しているのは XEmacs なので、それで希望の結果が出て欲しいのです。
皆様のアドバイスをいただきたく思います。よろしくお願いします。
147 : 名無しさん@お腹 - 03/12/27 05:08 (+3,-30,-84)
replace-regexp を
(while (re-search-forward REGEXP nil t)
(replace-match TO-STRING nil nil))
にすれば直るはず。
特別な理由がない限り lisp program 中で replace-regexp は使わないほうが
いいです。 perform-replace を参照。
148 : 143 - 03/12/27 22:46 (-1,-29,-35)
147氏のおっしゃるように修正したところ、XEmacs, Emacs の両者で
希望の動作をしてくれるようになりました。ありがとうございます。
149 : 名無しさん@お腹 - 04/01/04 14:13 (+3,-30,-194)
>>1 のelispリファレンス-ja
http://www.fan.gr.jp/~ring/doc/elisp-manual/elisp.html

は 27章 ウィンドウ がまるごと抜けてるからちょっと不便ですた。

ちょっと探したら、
http://www.i.kyushu-u.ac.jp/~s-fusa/doc/elisp-manual-20-2.5-jp/elisp-ja.html

を発見。こっちはちゃんと27章があるじょ。
スタイルシートでカラフルで見やすいなり。

にしても、emacs21版のelispリファ-ja は まだどこにもないんでしょか。
150 : 名無しさん@お腹 - 04/01/04 14:43 (+36,+8,-14)
149が訳すことにケテーイしますた。
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / emacs スレッド一覧へ
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

類似してるかもしれないスレッド


トップメニューへ / →のくす牧場書庫について