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

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

    emacs覧 / PC版 /
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter

    101 = :

    包囲アドバイスって訳語は、日本語infoで使われちゃっていますけど、
    あまり良さそうに思えないですね。語感が合わなくて。

    102 = :

    >>96
    > kazuのeispは信じられない程アレなので参考にならない。

    どのへんが?

    103 = :

    ま、いろいろとね。。。

    104 = :

    >>103
    FUD?

    105 = :

    >>104
    そうとも言いきれなさそうだから困る。
    リスト遊びの評判もだが。

    106 = :

    >>105
    広瀬さんの本はどう?

    107 = :

    「リスト遊び」は純粋にとても良かったと思うが。
    mewは使ってないからコードの評価はしないけど。

    108 = :

    2章を頭からちょっと読んでみたが

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

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

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

    とか考えた漏れは逝ってよしでつか

    109 = :

    でつ

    111 = :

    >>99
    まだ理解できていないようで・・・

    112 = :

    >>111
    あのー、罵倒されても構いませんから、
    (lambda ...)

    (function (lambda ...))
    で具体的に何が変わってくるのか、
    もうちょっと詳しく教えてください。
    俺の理解では、バイトコンパイルされてしまえば同じ。
    そのままだったら、functionのほうがマクロ展開ないぶん、
    微妙に速いかもしれない(俺の勝手な推測)というところなんですが。
    # quoteの場合が違うのは分かっています。

    114 = :

    時間がかかる処理をしていて、何かキーが押されたら中断する、ということを
    考えています。試しに下のようなのを書いてみました。
    (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 = :

    >>114
    condition-case で quit 取るんじゃだめなん?

    116 = :

    >>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 = :

    全てのキーに signal発生させるよう設定したキーマップ使用すれば
    いけるかも? signalの代わりに throwでもいいけど。

    118 = :

    >>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 = :

    うーん、自分で bindした keyboard-quitと
    C-g は扱いが違うって事なのかな?

    120 = :

    >>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 = :

    助言を元に調べました。
    なんとなく分かってきた気がします。(気がするだけかも…)
    (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 = :

    ふと思い立って、
    (keyboard-translate ?b ?\C-g)
    とかやってみましたが、やはり中断してくれませんね。

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

    # emvaders.elとかどうやってるのかな。ゲームなら割り込みみたいな処理を
    してると思うんだけど。

    124 = :

    苦肉の策として、「最後に押したキーで中断する」というのを考えてみました。

    (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 = :

    unwind-protect使ったほうがいいよ。

    126 = :

    なぜ 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 = :

    >>125, 126
    助言、ありがとうございます。
    今まで、unwind-protect は実際にどういう場面で用いるのかわかりませんでしたが、
    なんかわかったような気がしますです。

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

    bf-mode.elというelispをいじくっているのですが、html をw3mで表示したと
    きに重いので、キャンセルの手段が欲しいと思ったのです。

    130 = :

    write-regionでいいじゃん…

    131 = :

    >>130
    さんくす!
    ググってもよく分らなかったもので。

    133 = :

    もはや、このスレもこれまでか…
    がんばってる同士はおらんのだろうか。

    134 = :

    2ch以外で頑張ってます。

    135 = :

    たとえば、それはどこなんでしょう?

    136 = :

    あのー質問なんですが,
    あるファイルの内容を調査したい場合,Emacs Lisp だと
    対象となるファイルを一旦 find-file とかで
    全て読み込まなくちゃ駄目なんでしょうか…?

    外部プロセスに逃げると言う手も考えましたが,
    そんなものを使うよりは,Emacs Lisp のみで完結したいので…

    137 = :

    etagsとか?
    ってか、どんな調査したいのかにもよるのでは?

    139 = :

    全部読まなくても
    (insert-file-contents FILENAME &optional VISIT BEG END REPLACE)
    でファイルの一部だけを読む事ができるよ。

    140 = :

    御回答どもです

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

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

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

    >>139
    ありがとうございます。
    info読みなおしました…
    今まで如何にイイカゲンに読んでたかを思い知りますた…
    名前付きパイプとかも読めちゃうんすねコレ…

    141 = :

    一つの関数でλを定義する数は何個ぐらい許されるんでしょうか?

    142 = :

    なにがしたいのか分からんが、とりあえず作ってみたら?
    もっと意図を明確にしたうえで、ム板のスレで質問するのがいいと思うが。

    143 = :

    (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 = :

    具体的には、カーソルが☆にあると
    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サーバ市場:ビジネス利用には課題が多い
    のようになることです。添削おねがいします。

    146 = :

    検証ありがとうございます。おっしゃるとおり、手元の Emacs 20.7.2 を
    \emacs -qで起動すると、★☆どちらにカーソルがあっても希望の結果になり
    ました(transient-mark-mode t/nil のどちらも)。
    ところが、XEmacs 21.1 を \xemacs -q で起動させて確認したところ、
    transient-mark-mode t/nil どちらの場合も 144 に書いた結果になるのです。

    常用しているのは XEmacs なので、それで希望の結果が出て欲しいのです。
    皆様のアドバイスをいただきたく思います。よろしくお願いします。

    147 = :

    replace-regexp を
    (while (re-search-forward REGEXP nil t)
    (replace-match TO-STRING nil nil))
    にすれば直るはず。
    特別な理由がない限り lisp program 中で replace-regexp は使わないほうが
    いいです。 perform-replace を参照。

    149 = :

    >>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 = :

    149が訳すことにケテーイしますた。


    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / emacs一覧へ
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

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


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