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

私的良スレ書庫

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

元スレEmacs Part 44

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
251 : 名無しさん@お腹 - 2014/01/14(火) 22:44:00.16 (+5,-30,-34)
手元のもろもろのパッケージでは機能の有効化/無効化時に ad-enable/disable-advice を使ってるみたいです。
enable/disable で問題ない気もするのですがちなみにどんなバグなんでしょう?
ad-activate が抜けてるとか?
252 : 名無しさん@お腹 - 2014/01/14(火) 22:52:00.69 (+10,-30,-138)
>>250
> 丁度いい機会なのでいくつか質問を.
>
> 1. 既存の函数の戻り値に一時的に少し手を加えたい場合はどうするのが良いのでしょうか.

advice 使わないなら

(defconst original-FUNC (symbol-function 'FUNC))

(defun temporary-FUNC (&rest args)
(let ((retval (apply 'original-FUNC args))
....))

みたいにして

(fset 'FUNC 'original-FUNC) と (fset 'FUNC 'temporary-FUNC)

を切り換える、とか?
253 : 名無しさん@お腹 - 2014/01/14(火) 23:04:51.41 (+4,-30,-213)
>>252
advice された関数に対してそれをするとアカンのですよ。

(defun dump-me ()
"me me")

(defadvice dump-me (after test-ad activate)
(setq ad-return-value (concat ad-return-value "??")))

(defconst original-dump-me (symbol-function 'dump-me))

(defun temporary-dump-me (&rest args)
(let ((retval (apply original-dump-me args)))
(concat retval "!!"))
)

(fset 'dump-me original-dump-me)
(fset 'dump-me 'temporary-dump-me)

(dump-me) ;; => スタック使い果たす

24.4 では fset 時に advice がついてこなくなるとかなんとか。
254 : 名無しさん@お腹 - 2014/01/14(火) 23:43:36.78 (+37,+11,-9)
どうでもいいけど、函数ってかなり古い表現だよね
フォント⇒字母
アルゴリズム⇒算法
プログラム⇒算譜
みたいな
255 : 250 - 2014/01/14(火) 23:56:40.51 (-3,-30,+0)
>>251
; あーこれdefadviceに対して debug-print-eval-last-sexp するとエラーになりますね.
単純にenable/disableするだけだとアドバイスが複数あったときに元の状態に戻せないのです.
advice.elの実装見れば対処法はわかるのかもしれませんがマニュアルしか読んでないので...
; ad-activate入れないといけないってのはわかりにくいですよね. マニュアルにもhelpにもあんまり書いてないですし.

(defmacro keu:with-advice (on-or-off func class advice &rest body)
"[internal] Evaluate BODY with ADVICE enabled/disabled.
Note that there is a bug that it cannot restore the state of ADVICE.
Any ideas?"
`(progn
,(pcase on-or-off
(`'on `(ad-enable-advice ,func ,class ,advice))
(`'off `(ad-disable-advice ,func ,class ,advice))
(_ (error "the first argument must be the symol 'on or 'off")))
(ad-activate ,func)
(let ((keu:with-advice:return-value ,@body))
,(pcase on-or-off
(`'on `(ad-disable-advice ,func ,class ,advice))
(`'off `(ad-enable-advice ,func ,class ,advice))
(_ (error "the first argument must be the symol 'on or 'off")))
(ad-activate ,func)
keu:with-advice:return-value)))

改行が多すぎるので続く.
256 : 名無しさん@お腹 - 2014/01/14(火) 23:58:06.38 (+3,-30,-168)
(defun foo (x)
(cons 'foo x))

(defadvice foo (after advice-a)
(setq ad-return-value `(advice-a ,ad-return-value)))

(defadvice foo (after advice-b)
(setq ad-return-value `(advice-b ,ad-return-value)))

(keu:with-advice 'on 'foo 'after 'advice-a
(funcall 'foo 100))
; => (advice-a
; (advice-b
; (foo . 100)))
(foo 100)
; => (advice-b
; (foo . 100))
(keu:with-advice 'on 'foo 'after 'advice-b
(funcall 'foo 100))
; => (advice-b
; (foo . 100))
(foo 100)
; => (foo . 100)
257 : 250 - 2014/01/15(水) 00:04:52.00 (+3,-30,-132)
ああ, 複数じゃなくてもいいですよね.

(ad-disable-advice 'foo 'after 'advice-a)
(ad-activate 'foo)
(foo 100)
; => (foo . 100)
(keu:with-advice 'on 'foo 'after 'advice-a
(funcall 'foo 100))
; => (advice-a (foo . 100))
(foo 100)
; => (foo . 100)

(ad-enable-advice 'foo 'after 'advice-a)
(ad-activate 'foo)
(foo 100)
; => (advice-a (foo . 100))
(keu:with-advice 'on 'foo 'after 'advice-a
(funcall 'foo 100))
; => (advice-a (foo . 100))
(foo 100)
; => (foo . 100)
258 : 名無しさん@お腹 - 2014/01/15(水) 00:33:23.13 (+20,-30,-100)
>>250
なるほど。ある advice の有効/無効状態を取得出来るオフィシャルな方法はあるのかってことですね。
もともと enable ならなにもしない、って感じで。
Info みた感じだとなさそう。

結局 advice の実装見ることになっちゃうけど、ad-get-advice-info あたりを使うしかないのかしらん。
describe-function なんかでも使ってるから準公式みたいなもんでしょうきっと。

それと skk-isearch.el なんかでも advice 済みかどうかの判断に ad-get-advice-info を使ってるみたいです。
259 : 名無しさん@お腹 - 2014/01/15(水) 01:17:18.21 (+46,-30,+0)
>>258
こういうことか? マクロ書き慣れてないから eval 沢山あってキモい
(defmacro keu:with-advice (on-or-off func class advice &rest body)
"[internal] Evaluate BODY with ADVICE enabled/disabled.
Note that there is a bug that it cannot restore the state of ADVICE.
Any ideas?"
(let ((adviced (caddr (assq (eval advice)
(assq (eval class)
(ad-get-advice-info (eval func)))))))
(if (or (and (eq (eval on-or-off) 'on) adviced)
(and (eq (eval on-or-off) 'off) (not adviced)))
`(progn
,@body)
`(progn
,(pcase on-or-off
(`'on `(ad-enable-advice ,func ,class ,advice))
(`'off `(ad-disable-advice ,func ,class ,advice))
(_ (error "the first argument must be the symol 'on or 'off")))
(ad-activate ,func)
(let ((keu:with-advice:return-value ,@body))
,(pcase on-or-off
(`'on `(ad-disable-advice ,func ,class ,advice))
(`'off `(ad-enable-advice ,func ,class ,advice))
(_ (error "the first argument must be the symol 'on or 'off")))
(ad-activate ,func)
keu:with-advice:return-value)))))
260 : 名無しさん@お腹 - 2014/01/15(水) 01:25:37.09 (+63,+29,-22)
>>259
状態チェック入るなら展開時に評価はまずいんじゃないでしょうか。
pcase のところまで含めて実行時評価になるようにしないといけないかと。
261 : 250 - 2014/01/15(水) 02:59:03.92 (+12,-30,-298)
>>258
はい! そういうことです. ありがとうございます.

>>259
一から書き直してみました.
funcallの後ろを ',(if ...) としないといけないのはわからなくはないけど納得いかない.


(defsubst keu:advice-enabled-p (func class name)
(ad-advice-enabled (ad-find-advice func class name)))

(defmacro keu:with-advice (on-or-off func class name &rest body)
"[internal] Evaluate BODY with NAME enabled/disabled."
(let ((onoff
(pcase on-or-off
(`'on t)
(`'off nil)
(_ (error "the first argument must be the symol 'on or 'off")))))
`(let ((enabled (not (not (keu:advice-enabled-p ,func ,class ,name)))))
(if (eq ,onoff enabled)
(progn ,@body)
(prog2 ; return value is that of BODY
(progn
(funcall ',(if onoff 'ad-enable-advice 'ad-disable-advice) ,func ,class ,name)
(ad-activate ,func))
(progn ,@body)
(progn
(funcall ',(if (not onoff) 'ad-enable-advice 'ad-disable-advice) ,func ,class ,name)
(ad-activate ,func)))))))
262 : 名無しさん@お腹 - 2014/01/15(水) 04:05:06.60 (+0,-29,-17)
>>261
> funcallの後ろを ',(if ...) としないといけないのはわからなくはないけど納得いかない.
funcall 使わなければいいのでは?
263 : 名無しさん@お腹 - 2014/01/15(水) 09:31:47.01 (-1,-29,-46)
ああ、マクロ展開だから素でシンボルが頭にくるようにすりゃいいんかな
re-builder みたいに書いてるはしから macroexpand-all した結果を表示し続けるやつが欲しいわ・・・
264 : 名無しさん@お腹 - 2014/01/15(水) 09:39:36.07 (+3,-29,-21)
defsubst ありなら
onoff その他を引数にとって enable と disable と activate までやってくれる toggle みたいなの書いちゃえば
progn 減ってすごく見やすくなりそうだな
265 : 名無しさん@お腹 - 2014/01/15(水) 10:07:46.31 (-1,-29,-4)
しかし advice は何度説明読んでも preactivate と compile の意味がわからんわ
266 : 名無しさん@お腹 - 2014/01/15(水) 20:04:03.59 (+50,+27,-2)
アドバイスが欲しいってか?
267 : 名無しさん@お腹 - 2014/01/16(木) 17:20:20.61 (+57,+29,-54)
emacs と vim の advent calendar 見比べてると
(少なくともあそこら辺界隈での) emacs の息切れ感が伝わってきて切なくなるな
268 : 名無しさん@お腹 - 2014/01/16(木) 18:01:53.84 (+52,+29,-2)
もう成熟してるからあとは腐るだけ
269 : 名無しさん@お腹 - 2014/01/16(木) 18:29:43.31 (+52,+29,-4)
化石化してるから腐らないんじゃない
270 : 名無しさん@お腹 - 2014/01/16(木) 18:40:25.83 (+14,-13,-6)
Mac book 使ってカフェで JavaScript 書いてる層には確実に受け悪そうだよな Emacs は。
271 : 名無しさん@お腹 - 2014/01/16(木) 18:49:00.73 (+12,-15,-37)
アイコンの可愛いAquamacsちゃんもおるんやで
272 : 名無しさん@お腹 - 2014/01/16(木) 19:30:37.12 (+2,-29,-57)
(interactive)と(interactive "p")の違いはどういうものですか?
273 : 名無しさん@お腹 - 2014/01/16(木) 19:36:16.72 (-1,-29,-47)
Mac Book とカフェで JavaScript はダサくて
型落ち ThinkPad とメイドカフェで C が最高にクールというのが
Emacser の価値観だからねえ。
274 : 名無しさん@お腹 - 2014/01/16(木) 19:45:46.24 (+32,-29,-17)
emacsってjs2-modeあるしmacとも相性良い気がするんだけど理屈じゃないのかな
275 : 名無しさん@お腹 - 2014/01/16(木) 19:50:46.22 (+32,-29,-35)
>>272
"p"だと、コマンドを実行するときに指定した前置引数の値が関数の引数になる。
276 : 名無しさん@お腹 - 2014/01/16(木) 19:57:05.49 (+62,+29,-23)
>>274
Web 界隈だと vim 使ってる人がクールってイメージなんじゃないだろうか。
自分の狭い観測範囲だとそんな感じを受ける。
277 : 名無しさん@お腹 - 2014/01/16(木) 20:01:36.29 (-1,-29,-15)
俺の .vimrc には set compatible って書いてある。
278 : 名無しさん@お腹 - 2014/01/16(木) 20:06:17.51 (+62,+29,+0)
>>275
なるほどそういうことですか
勉強になりました
279 : 名無しさん@お腹 - 2014/01/16(木) 20:10:13.80 (+42,+14,-23)
打ち合わせの時、メモを Mac Book + iTerm2 + Emacs(黒地フルスクリーン)
で書いてたら、隣の女の子にじーーーーっと見られて非常にやりづらかった
280 : 名無しさん@お腹 - 2014/01/16(木) 20:12:50.32 (+88,+29,-36)
なんでなんだろ
・Emacs が珍しかった
・黒背景ワロス
・イケメンだった
・ブサメンすぎた
・Mac Book(笑)
・別にお前を見ていたわけではない
281 : 名無しさん@お腹 - 2014/01/16(木) 20:14:28.57 (+52,+29,-2)
・実はゆたぽんフォントを使っていた
282 : 名無しさん@お腹 - 2014/01/16(木) 20:34:23.61 (+63,+28,+1)
>>280
・実はスパイだった
283 : 名無しさん@お腹 - 2014/01/16(木) 20:39:55.26 (-6,-29,+0)
・なにこれMIFES?
284 : 名無しさん@お腹 - 2014/01/16(木) 21:06:50.38 (+52,+29,+0)
・隣の女の子なんていなかった
285 : 名無しさん@お腹 - 2014/01/16(木) 21:13:22.52 (+112,+26,+0)
・女の子じゃなくて髪の長いrmsだった
286 : 名無しさん@お腹 - 2014/01/16(木) 21:28:46.61 (+64,+29,+1)
>>285
じわじわくるな。
287 : 名無しさん@お腹 - 2014/01/16(木) 21:47:50.19 (+57,+29,-3)
Emacs絡みの女子ネタとは珍しいなw
288 : 名無しさん@お腹 - 2014/01/16(木) 21:48:25.45 (+57,+19,+2)
>>285
優勝
289 : 名無しさん@お腹 - 2014/01/16(木) 21:54:24.10 (+57,+29,-16)
Emacs 使ってる女の子とか女子力強すぎんだろ
290 : 名無しさん@お腹 - 2014/01/16(木) 22:07:56.76 (+128,+29,-5)
なんで女子力って「高い」って言うんだ
291 : 名無しさん@お腹 - 2014/01/16(木) 22:08:12.20 (+52,+29,-2)
前スレには高2の女の子来てたぞ
292 : 名無しさん@お腹 - 2014/01/16(木) 22:09:22.68 (+57,+29,-18)
こんだけPCが普及してたら女子小学生Emacs使いがいても驚かない
293 : 名無しさん@お腹 - 2014/01/16(木) 22:12:59.80 (+57,+29,-40)
どういうルートを辿ったら女子小学生が Emacs にリーチするんだろう
ぶっちゃけ PC なんかよりスマホで動くかどうかだな
294 : 名無しさん@お腹 - 2014/01/16(木) 22:14:42.02 (+75,+30,-94)
>>290
「強い」って表現した時点で、たおやかな女子の魅力が損なわれるだろ?
その自己矛盾に陥ってしまうことを防ぐのが目的の一つ。
あと、「力が高い」という、ユルいけど嫌味にならない程度の
頭の悪さを匂わすフレーズを敢えて使うことで、
さらに女子としての魅力を演出している。

それはさておき、emacs 使ってたらとりあえずモテるよね。
295 : 名無しさん@お腹 - 2014/01/16(木) 22:15:53.28 (+57,+29,-1)
別のスレで女子中学生のpython使いを見た。
296 : 名無しさん@お腹 - 2014/01/16(木) 22:21:25.46 (+75,+29,-18)
>>290
能力が高いって言うだろ
つうかそれ位すぐ分かれよ
297 : 名無しさん@お腹 - 2014/01/16(木) 22:25:56.33 (+57,+29,-9)
戦闘力も「強い」より「高い」な気がするな
298 : 名無しさん@お腹 - 2014/01/16(木) 22:30:50.60 (+47,+29,+0)
腕力が高い
299 : 名無しさん@お腹 - 2014/01/16(木) 22:34:02.79 (+57,+29,-14)
そんなことよりお前ら最近 elisp かいてんの?
300 : 名無しさん@お腹 - 2014/01/16(木) 22:49:43.97 (+57,+29,-4)
毎日書いてはいるけど十数行で簡潔するような小物ばっかり
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / emacs スレッド一覧へ
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

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


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