元スレEmacs Part 44
emacs覧 / PC版 /みんなの評価 : △
251 = :
手元のもろもろのパッケージでは機能の有効化/無効化時に ad-enable/disable-advice を使ってるみたいです。
enable/disable で問題ない気もするのですがちなみにどんなバグなんでしょう?
ad-activate が抜けてるとか?
252 = :
>>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 = :
>>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 = :
どうでもいいけど、函数ってかなり古い表現だよね
フォント⇒字母
アルゴリズム⇒算法
プログラム⇒算譜
みたいな
256 = :
(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 = :
ああ, 複数じゃなくてもいいですよね.
(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 = :
>>250
なるほど。ある advice の有効/無効状態を取得出来るオフィシャルな方法はあるのかってことですね。
もともと enable ならなにもしない、って感じで。
Info みた感じだとなさそう。
結局 advice の実装見ることになっちゃうけど、ad-get-advice-info あたりを使うしかないのかしらん。
describe-function なんかでも使ってるから準公式みたいなもんでしょうきっと。
それと skk-isearch.el なんかでも advice 済みかどうかの判断に ad-get-advice-info を使ってるみたいです。
259 = :
>>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 = :
>>259
状態チェック入るなら展開時に評価はまずいんじゃないでしょうか。
pcase のところまで含めて実行時評価になるようにしないといけないかと。
261 = :
>>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)))))))
264 = :
defsubst ありなら
onoff その他を引数にとって enable と disable と activate までやってくれる toggle みたいなの書いちゃえば
progn 減ってすごく見やすくなりそうだな
266 = :
アドバイスが欲しいってか?
267 = :
emacs と vim の advent calendar 見比べてると
(少なくともあそこら辺界隈での) emacs の息切れ感が伝わってきて切なくなるな
268 = :
もう成熟してるからあとは腐るだけ
269 = :
化石化してるから腐らないんじゃない
270 = :
Mac book 使ってカフェで JavaScript 書いてる層には確実に受け悪そうだよな Emacs は。
271 = :
アイコンの可愛いAquamacsちゃんもおるんやで
272 = :
(interactive)と(interactive "p")の違いはどういうものですか?
274 = :
emacsってjs2-modeあるしmacとも相性良い気がするんだけど理屈じゃないのかな
275 = :
>>272
"p"だと、コマンドを実行するときに指定した前置引数の値が関数の引数になる。
276 = :
>>274
Web 界隈だと vim 使ってる人がクールってイメージなんじゃないだろうか。
自分の狭い観測範囲だとそんな感じを受ける。
278 = :
>>275
なるほどそういうことですか
勉強になりました
279 = :
打ち合わせの時、メモを Mac Book + iTerm2 + Emacs(黒地フルスクリーン)
で書いてたら、隣の女の子にじーーーーっと見られて非常にやりづらかった
280 = :
なんでなんだろ
・Emacs が珍しかった
・黒背景ワロス
・イケメンだった
・ブサメンすぎた
・Mac Book(笑)
・別にお前を見ていたわけではない
281 = :
・実はゆたぽんフォントを使っていた
282 = :
>>280
・実はスパイだった
284 = :
・隣の女の子なんていなかった
285 = :
・女の子じゃなくて髪の長いrmsだった
286 = :
>>285
じわじわくるな。
287 = :
Emacs絡みの女子ネタとは珍しいなw
288 = :
>>285
優勝
289 = :
Emacs 使ってる女の子とか女子力強すぎんだろ
290 = :
なんで女子力って「高い」って言うんだ
291 = :
前スレには高2の女の子来てたぞ
292 = :
こんだけPCが普及してたら女子小学生Emacs使いがいても驚かない
293 = :
どういうルートを辿ったら女子小学生が Emacs にリーチするんだろう
ぶっちゃけ PC なんかよりスマホで動くかどうかだな
294 = :
>>290
「強い」って表現した時点で、たおやかな女子の魅力が損なわれるだろ?
その自己矛盾に陥ってしまうことを防ぐのが目的の一つ。
あと、「力が高い」という、ユルいけど嫌味にならない程度の
頭の悪さを匂わすフレーズを敢えて使うことで、
さらに女子としての魅力を演出している。
それはさておき、emacs 使ってたらとりあえずモテるよね。
295 = :
別のスレで女子中学生のpython使いを見た。
296 = :
>>290
能力が高いって言うだろ
つうかそれ位すぐ分かれよ
297 = :
戦闘力も「強い」より「高い」な気がするな
298 = :
腕力が高い
299 = :
そんなことよりお前ら最近 elisp かいてんの?
300 = :
毎日書いてはいるけど十数行で簡潔するような小物ばっかり
みんなの評価 : △
類似してるかもしれないスレッド
- Emacs Part 54 (97) - [92%] - 2023/1/25 17:15
- Emacs Part 46 (984) - [92%] - 2014/12/24 14:15
- Emacs Part 34 (1001) - [92%] - 2010/6/21 19:45 ○
- Emacs Part 41 (1001) - [92%] - 2012/12/24 4:15
- Emacs Part 42 (1001) - [92%] - 2013/6/9 5:15 △
- Emacs Part 43 (1001) - [92%] - 2013/12/14 11:30
- Emacs Part 45 (1001) - [92%] - 2014/6/23 9:45
- Emacs Part 40 (1001) - [92%] - 2012/9/7 0:30
- Emacs Part 47 (995) - [92%] - 2015/4/19 13:01
- Emacs Part 49 (974) - [92%] - 2016/12/7 9:45
- Emacs Part 48 (997) - [92%] - 2015/12/9 15:15
- Emacs Part 53 (989) - [84%] - 2022/12/5 12:45
- Emacs Part 31 (1001) - [84%] - 2009/10/23 10:31 ○
- Emacs Part 32 (1001) - [84%] - 2009/12/20 2:04 ○
トップメニューへ / →のくす牧場書庫について