ãããã°ã®ç¬¬ä¸æ©!Emacs Lispé¢æ°ããã¬ã¼ã¹ããæ¹æ³
Emacs Lispã®ãããã°ããã¦ããã¨ããç¹å®ã®é¢æ°å¼ã³åºãããã¬ã¼ã¹ããããã¨ãããã¾ãã é¢æ°å¼ã³åºãã®ãã¬ã¼ã¹ã¨ã¯ãå¼ã³åºããé¢æ°ã®å¼æ°ã®å¤ã¨ãè¿ãå¤ããã§ãã¯ãããã¨ã§ãã ãã¡ãããé¢æ°ãå¼ã³åºããããã©ããããããã¾ãã
ãã¬ã¼ã¹ã®å®ç¾ã«ã¯adviceæ©è½ã使ã£ã¦ãã¾ãã
M-x trace-functionã§ãã¬ã¼ã¹ãã
M-x trace-functionã¯ãç¹å®ã®é¢æ°ããã¬ã¼ã¹ãã¾ãã
ãã®ã³ãã³ãã¯ããã¬ã¼ã¹å¯¾è±¡é¢æ°ã¨åºåãããã¡ãèãã¦ãã¾ãã åºåãããã¡ã¯ããã©ã«ãã§*trace-output*ãªã®ã§ããã®ã¾ã¾ã«ãã¦ããã®ãç¡é£ã§ãã è¤æ°ã®é¢æ°ããã¬ã¼ã¹ããéã«åºåããã¡ããã¡ãã«ãªãã®ãå«ãªãã°å¥ã®ãããã¡åã«ãã¦ããã°ããã§ãã
ãã®å¾ã§ãã¬ã¼ã¹å¯¾è±¡é¢æ°ãå¼ã³åºãããããã¬ã¼ã¹çµæã表示ãã¾ãã
M-x trace-function-backgroundã§é»ã£ã¦ãã¬ã¼ã¹ãã
M-x trace-function-backgroundã¯ãM-x trace-functionã¨åãåãã§ãããçµæã表示ãã¾ããã ã¦ã£ã³ãã¦æ§æãå¤æ´ããããªãå ´åã¯M-x trace-function-backgroundã使ãã¾ãã
M-x untrace-functionã§ç¹å®ã®é¢æ°ã®ãã¬ã¼ã¹ãç¡å¹ã«ãã
M-x untrace-functionã¯ãç¹å®ã®ãã¬ã¼ã¹å¯¾è±¡é¢æ°ã®ãã¬ã¼ã¹ãç¡å¹ã«ãã¾ãã
M-x untrace-allã§ãã¹ã¦ã®ãã¬ã¼ã¹ãç¡å¹ã«ãã
M-x untrace-allã¯ããã¹ã¦ã®ãã¬ã¼ã¹å¯¾è±¡é¢æ°ã®ãã¬ã¼ã¹ãç¡å¹ã«ãã¾ãã é¢åãªã®ã§ãM-x untrace-allã使ãæ¹ãå¤ããªãã§ãããã
ä¾
åç´ãªä¾
(defun f (x) (+ x 3)) (defun g (x) (+ (f x) 7)) (g 10) ; => 20
ãã®ä¾ã§fã«å¯¾ãã¦M-x trace-functionãå®è¡ã㦠(g 10) ãå¼ã³åºãããã以ä¸ã®åºåãå¾ããã¾ãã
======================================================================
1 -> f: x=10
1 <- f: 13
factã®ä¾
(defun fact (n) (if (= n 0) 1 (* n (fact (1- n))))) (fact 3) ; => 6
次ã¯å帰å¼ã³åºãã®ä¾ã§ããfactã«å¯¾ãã¦M-x trace-functionãå®è¡ããã¨ã以ä¸ã®åºåãå¾ããã¾ãã ãã®ããã«ãå·¦ã®æ°åã¯å帰ã¬ãã«ã表ãã¦ãããã¨ããããã¾ãã
======================================================================
1 -> fact: n=3
2 -> fact: n=2 | ||
3 -> fact: n=1 | ||
4 -> fact: n=0 | ||
4 <- fact: 1 | ||
3 <- fact: 1 | ||
2 <- fact: 2 |
1 <- fact: 6
trace-function-regexpã¨trace-function-background-regexpãå®ç¾©ãããã¨ã§ã¾ã¨ãã¦ãã¬ã¼ã¹ãã
(defun trace-function-regexp (regexp &optional buffer) (interactive (list (read-string "Trace function regexp: ") (read-buffer "Output to buffer: " trace-buffer))) (mapc 'trace-function (apropos-internal regexp 'fboundp))) (defun trace-function-background-regexp (regexp &optional buffer) (interactive (list (read-string "Trace function background regexp: ") (read-buffer "Output to buffer: " trace-buffer))) (mapc 'trace-function-background (apropos-internal regexp 'fboundp)))
ãããã®å°ããªã³ãã³ããå®ç¾©ãããã¨ã§ãã¾ã¨ãã¦é¢æ°ããã¬ã¼ã¹ãããã¨ãã§ãã¾ãã ãã°ãå¢ãã¾ãããéçºä¸ã«ã¯å½¹ç«ã¤ã§ãããã
(defun hoge-1 (x) (1+ x)) (defun hoge-2 (x) (* 2 (hoge-1 x))) (hoge-2 33) (hoge-1 4)
ãã®ä¾ã«ãã㦠M-x trace-function-regexp ^hoge- ãå®è¡ããã¨ã以ä¸ã®åºåãå¾ããã¾ãã
======================================================================
1 -> hoge-2: x=33
2 -> hoge-1: x=33 |
2 <- hoge-1: 34 |
1 <- hoge-2: 68
======================================================================
1 -> hoge-1: x=4
1 <- hoge-1: 5
å°ããé¢æ°ãæ¸ã
ããã°ã©ãã³ã°ãã¦ããã«ããã¦ã¯ããã¯ãå°ããé¢æ°ãæ¸ãã¦ãããã¨ãéè¦ã«ãªãã¾ãã
第1ã«ãé¢æ°ãå°ãããã¦ããã¨ããã¡ãããã¬ã¼ã¹ãããããªãã¾ãã ç´°ããåä½ã§å¤ã®åã渡ãããããããããã°ãè¦ã¤ãããããªããã®ã§ãã ããã¦ãããããé¢æ°ã«ç¦ç¹ããã¼ããã¨ãã§ãã¾ãã
第2ã«ãé¢æ°ãå°ããã¨ãã¹ãããããããªãã¾ãã
第3ã«ãç¹å®ã®å¦çã®ããã¾ããé¢æ°åãã¦ããã¨ãå¦çã«ååãã¤ãããã¨ãã§ãã¾ãã å¦çã表ãé©åãªé¢æ°åãã¤ãã¦ãããã¨ã§ãã³ã¼ããèªãã ã ãã§ãã®é¨åãä½ããã£ã¦ããã®ããæããã§ãã ãã®é¨åã«å¯¾ãã¦ã¯ã³ã¡ã³ããä¸è¦ã«ãªãã¾ãã
第4ã«ããã®é¢æ°ãåå©ç¨å¯è½ã«ãªãã¾ãã
ãããªãã¨ã¯å¸¸èã ã¨æãã¾ãããEmacs Lispã®ã³ã¼ããè¦ã¦ããã¨ãå®ãã¦ããªããã®ãããã«å¤ããã¨ãã 100è¡è¶ ã®é¢æ°ã¯ããã«è¦ãããããèªã¿ã«ããã«ã¯éå£ããã°ããã§ãã æ©è½æ¡å¼µãããããªã£ã¦ããé¢æ°ã大ããåºã¾ãã«ãªã£ã¦ããã®ã§ãã³ãã¼ï¼ãã¼ã¹ãããããå¾ãªããã¨ãã¾ã¾ããã¾ãã ãã®ã¨ãã®ãã©ãããã¨ãã£ããâ¦æ³£ãã¦ãã¾ãã
ã¡ãªã¿ã«åã¯1è¡ã®å¦çã§ãã£ã¦ãé¢æ°ã¨ãã¦ã¾ã¨ããã®ã好ã¿ã¾ãã å¦çã«ååãã¤ããèªã¿ãããããã®ãç®çã§ãã