のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,062,813人
昨日: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 (+19,-17,-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 (+93,+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,-87)
    >>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,-232)
    >>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,-274)
    助言を元に調べました。
    なんとなく分かってきた気がします。(気がするだけかも…)
    (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,-278)
    苦肉の策として、「最後に押したキーで中断する」というのを考えてみました。

    (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,-110)
    なぜ 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,-36)
    あのー質問なんですが,
    あるファイルの内容を調査したい場合,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,-82)
    御回答どもです

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

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

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

    >>139
    ありがとうございます。
    info読みなおしました…
    今まで如何にイイカゲンに読んでたかを思い知りますた…
    名前付きパイプとかも読めちゃうんすねコレ…
    141 : 名無しさん@お腹 - 03/12/26 16:20 (+23,-4,-29)
    一つの関数でλを定義する数は何個ぐらい許されるんでしょうか?
    142 : 名無しさん@お腹 - 03/12/26 17:03 (+57,+29,-28)
    なにがしたいのか分からんが、とりあえず作ってみたら?
    もっと意図を明確にしたうえで、ム板のスレで質問するのがいいと思うが。
    143 : 名無しさん@お腹 - 03/12/26 22:02 (+33,-30,-271)
    (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,-189)
    具体的には、カーソルが☆にあると
    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,-37)
    なんか例示されてるのと違い、空行が入ってしまうなーと思ったら、
    transient-mark-mode かどうかで挙動が違うな。
    で、offにして試してみたけど、どちらも okっぽかったけれど。
    146 : 143 - 03/12/27 00:21 (+3,-30,-141)
    検証ありがとうございます。おっしゃるとおり、手元の 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 (+34,+6,-14)
    149が訳すことにケテーイしますた。
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / emacs スレッド一覧へ
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

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


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