Emacs Lispã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ãƒ‡ãƒãƒƒã‚¬ edebug を使ã†
edebugã¨ã¯ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ãƒ‡ãƒãƒƒã‚¬
edebugã¨ã¯ã€Emacs Lispã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ãƒ‡ãƒãƒƒã‚¬ã§ã™ã€‚ ã“れを使ã†ã¨ã€Emacs LispãŒã©ã®ã‚ˆã†ã«å®Ÿè¡Œã•ã‚Œã¦ã„ã‚‹ã®ã‹ã‚’ステップãƒã‚¤ã‚¹ãƒ†ãƒƒãƒ—ã§è¦‹ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
å‰ã®è¨˜äº‹ã§ç´¹ä»‹ã—㟠trace-function ã§ã¯ä¸å分ãªå ´åˆã¯ã€edebugã§æœ¬æ ¼çš„ã«ãƒ‡ãƒãƒƒã‚°ã—ã¾ã™ã€‚ edebugã¯çŠ¶æ…‹ãŒã“ã‚ã“ã‚変化ã™ã‚‹ã®ã§ã€å®Ÿéš›ã«æ‰‹ã‚’å‹•ã‹ã—ã¦ã¿ã¾ã—ょã†ã€‚
edebugを有効・無効ã«ã™ã‚‹
C-u C-M-xã§é–¢æ•°ã‚’edebug対象ã«ã™ã‚‹
edebugã¯åŸºæœ¬çš„ã«ã¯é–¢æ•°å˜ä½ã§edebug対象ã«ã—ã¾ã™ã€‚ 特定ã®é–¢æ•°ã‚’edebug対象ã«ã™ã‚‹ã®ã¯ç°¡å˜ã§ã™ã€‚ 通常ã€é–¢æ•°ãƒ•ã‚©ãƒ¼ãƒ を評価ã™ã‚‹ã€ã™ãªã‚ã¡é–¢æ•°ã‚’定義ã™ã‚‹ã«ã¯ã€defunä¸ã‚ã‚‹ã„ã¯ã€defunã®ç›´å¾Œã§C-M-xを使ã„ã¾ã™ã€‚ ãã‚Œã«å¯¾ã—ã€é–¢æ•°ãƒ•ã‚©ãƒ¼ãƒ ã‚’edebug対象ã«ã™ã‚‹ã«ã¯æ•°å¼•æ•°ã‚’ã¤ã‘ã€C-u C-M-xを使ã„ã¾ã™ã€‚ 以下ã®é–¢æ•°ã«C-u C-M-xを使ã†ã¨ã€ã‚¨ã‚³ãƒ¼ã‚¨ãƒªã‚¢ã«ã€Œedebug: factã€ã¨ã§ã¾ã™ã€‚
(defun fact (x)
"階乗"
(if (zerop x)
1
(* x (fact (1- x)))))
C-M-xã‚ã‚‹ã„ã¯C-c C-cã§é–¢æ•°ã‚’å†å®šç¾©ãƒ»edebugを無効ã«ã™ã‚‹
edebugを使ã‚ãªã„å ´åˆã¯ã€ãã®é–¢æ•°ã‚’å†å®šç¾©ã—ã¾ã™ã€‚ C-M-xã¯Lispã¨ã—ã¦é–¢æ•°å®šç¾©ã—ã€C-c C-cã¯é–¢æ•°å®šç¾©ã‚’ãƒã‚¤ãƒˆã‚³ãƒ³ãƒ‘イルã—ã¾ã™ã€‚ ã‚‚ã†ãƒ‡ãƒãƒƒã‚°ãŒçµ‚ã‚ã£ãŸãªã‚‰ã°C-c C-cã§ãƒã‚¤ãƒˆã‚³ãƒ³ãƒ‘イルã—ã¦ã—ã¾ã„ã¾ã—ょã†ã€‚
ã‚‚ã¡ã‚ん当該ファイルをãƒãƒ¼ãƒ‰ã—ã¦ã‚‚ã‹ã¾ã„ã¾ã›ã‚“。
edebugを使ã†
SPCã§ã‚¹ãƒ†ãƒƒãƒ—実行ã™ã‚‹
当該関数をedebug対象ã«ã—ãŸã‚‰ã€ä»Šåº¦ã¯ãã®é–¢æ•°ã‚’呼ã³å‡ºã—ã¾ã™ã€‚ 関数定義ã®ä¸‹ã«
;; (fact 2)
ã¨æ›¸ã„ã¦C-x C-eã™ã‚‹ã‹ã€ M-: (fact 2) を実行ã™ã‚‹ã‹ã§å‘¼ã³å‡ºã›ã¾ã™ã€‚
ã™ã‚‹ã¨ã€å®Ÿè¡ŒçµæžœãŒã§ã¦ãã‚‹ã®ã§ã¯ãªãã€fact関数ã®æœ€åˆã®ä½ç½®ã§ã‚«ãƒ¼ã‚½ãƒ«ãŒæ¢ã¾ã‚Šã¾ã™ã€‚ ã“ã‚Œã¯edebugãŒæœ‰åŠ¹ã«ãªã£ã¦ã„る状態ã§ã™ã€‚ モードラインã«ã€Œ*Debugging*ã€ã¨å‡ºã¦ãã¦ã„ã‚‹ã®ã§æ˜Žã‚‰ã‹ã§ã™ã€‚
ã“ã®çŠ¶æ…‹ã§ã¯ã€ã„ã‚ã„ã‚ãªã‚ーをå—ã‘付ã‘ã¾ã™ã€‚
スペースを押ã™ã¨ã€æ¬¡ã®æ‹¬å¼§ã¾ã§ã‚¹ãƒ†ãƒƒãƒ—実行ã—ã¾ã™ã€‚ カーソルä½ç½®ã®å€¤ã‚’エコーエリアã«è¡¨ç¤ºã—ã¾ã™ã€‚ 何度も押ã™ã“ã¨ã§å®Ÿè¡Œã«æ§˜åãŒã¯ã£ãã‚Šã¨ã‚ã‹ã‚Šã¾ã™ã€‚
hã§ã‚«ãƒ¼ã‚½ãƒ«ä½ç½®ã¾ã§å®Ÿè¡Œã™ã‚‹
スペースã ã‘ã ã¨ã€é•·ã„関数ã®ãƒ‡ãƒãƒƒã‚°ãŒå¤§å¤‰ã§ã™ã€‚ ãã“ã§hを使ã„ã¾ã™ã€‚ hã¯ã‚«ãƒ¼ã‚½ãƒ«ä½ç½®ã¾ã§ä¸€æ°—ã«å®Ÿè¡Œã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã§ã™ã€‚ edebugを有効ã«ã—ãŸã‚‰ã€å®Ÿè¡Œã—ã¦ã»ã—ã„ã¨ã“ã‚ã¾ã§ã‚«ãƒ¼ã‚½ãƒ«ä½ç½®ã‚’æŒã£ã¦è¡Œã£ã¦ã€ãã“ã§hを押ã™ã¨ã„ã†ä½¿ã„æ–¹ã§ã™ã€‚
ソースコードä¸ã«(edebug)を入れã¦ãŠãã¨ãƒ–レークãƒã‚¤ãƒ³ãƒˆã‚’è¨å®šã™ã‚‹
ã—ã‹ã—ã€ã„ã¡ã„ã¡ã‚«ãƒ¼ã‚½ãƒ«ã‚’移動ã™ã‚‹ã®ã¯é¢å€’ã§ã™ã€‚ ãã“ã§ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ä¸ã« (edebug) を書ãåŠ ãˆã‚‹ã“ã¨ã§ã€ãƒ–レークãƒã‚¤ãƒ³ãƒˆã‚’è¨å®šã—ã¦ã—ã¾ã„ã¾ã™ã€‚
edebugセッションã§ã‚‚ブレークãƒã‚¤ãƒ³ãƒˆãŒè¨å®šã§ãã¾ã™ã€‚ ã—ã‹ã—ã€é–¢æ•°ã‚’書ãæ›ãˆãŸå¾Œã§edebugã‚’å†ã³æœ‰åŠ¹ã«ã™ã‚‹ã¨ãƒ–レークãƒã‚¤ãƒ³ãƒˆæƒ…å ±ãŒæ¶ˆãˆã¦ã—ã¾ã†ã¨ã„ã†æ¬ 点ãŒã‚ã‚Šã¾ã™ã€‚ ãã®ãŸã‚ã€å¤šãã®å ´åˆã¯ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã«ç›´æŽ¥ãƒ–レークãƒã‚¤ãƒ³ãƒˆã‚’è¨å®šã™ã‚‹æ–¹ãŒå¬‰ã—ã„ã®ã§ã™ã€‚ ifã‚„whenã¨çµ„ã¿åˆã‚ã›ã‚‹ã¨ã€æ¡ä»¶ã¤ãブレークãƒã‚¤ãƒ³ãƒˆã‚‚è¨å®šã§ãã¾ã™ã€‚
(edebug)自体ãŒã²ã¨ã¤ã®å¼ãªã®ã§ã€å…¥ã‚Œã‚‹å ´æ‰€ã«ã‚ˆã£ãŸã‚‰ã€prognã¨çµ„ã¿åˆã‚ã›ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
(defun fact (x)
"階乗"
(if (zerop x)
1
(* x (progn (edebug) (fact (1- x))))))
gã§æ¬¡ã®ãƒ–レークãƒã‚¤ãƒ³ãƒˆã¾ã§å®Ÿè¡Œ
ブレークãƒã‚¤ãƒ³ãƒˆã‚’è¨å®šã—ãŸã‚‰ã€gを押ã™ã¨ã€ä¸€æ°—ã«ãƒ–レークãƒã‚¤ãƒ³ãƒˆã¾ã§å®Ÿè¡Œã—ã¾ã™ã€‚ ブレークãƒã‚¤ãƒ³ãƒˆã¾ã§ä¸€æ°—ã«é€²ã‚“ã§ã€ãã®å¾Œã¯ã‚¹ãƒšãƒ¼ã‚¹ã§ç¶¿å¯†ã«èª¿æŸ»ã‚’ã™ã‚‹ã®ãŒæ™®é€šã§ã™ã€‚
qã§edebugã‹ã‚‰æŠœã‘ã‚‹
edebugã§ã®å®Ÿè¡Œã‚’ã‚„ã‚ã‚‹ã«ã¯ã€qを押ã—ã¾ã™ã€‚ 実行ä¸ã®é–¢æ•°ã¯å®Ÿè¡Œã‚’ã¨ã‚Šã‚„ã‚ã¾ã™ã€‚
iã§ã‚«ãƒ¼ã‚½ãƒ«ä½ç½®ã®é–¢æ•°ã‚’edebug対象ã«ã™ã‚‹
edebug対象関数を追ã„掛ã‘ã¦ã„ã¦ã€ãã®ä¸‹ã®é–¢æ•°ã‚‚追ã„ã‹ã‘ãŸã„ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚ ãã‚Œã«ã¯ã€ã‚ã–ã‚ã–当該関数定義ã«é£›ã°ãªãã¦ã‚‚ã€iを使ãˆã°ã„ã„ã§ã™ã€‚
(defun hoge (x)
(1+ (fact x)))
;; (hoge 2)
hoge関数をedebug対象ã«ã—ã€(factã®(ã®éƒ¨åˆ†ã«ã‚«ãƒ¼ã‚½ãƒ«ãŒæ¥ãŸã¨ãã«iを押ã™ã¨ã€factã‚‚edebug対象ã«ãªã‚Šã¾ã™ã€‚
eã§å¼ã‚’評価ã™ã‚‹
ã—ã°ã—ã°ã€ãƒ‡ãƒãƒƒã‚°ä¸ã«ã¯å¤‰æ•°ã‚„å¼ã®å€¤ã‚’知りãŸã„ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚ ã“ã®ã¨ãã¯eã§å¼ã‚’評価ã—ã¦ãã ã•ã„。
Eã§è©•ä¾¡ãƒªã‚¹ãƒˆã‚’使ã„ã€å®Ÿè¡ŒãŒé€²ã‚€ã«ã¤ã‚Œã¦è‡ªå‹•æ›´æ–°ã•ã‚Œã‚‹
eã§ã¯ã€å¼ã‚’評価ã™ã‚‹ã®ã¯ä¸€åº¦ãã‚Šã§ã™ã€‚ 実行ã™ã‚‹ãŸã³ã«è©•ä¾¡ã—ã¦ã»ã—ã„å ´åˆã¯è©•ä¾¡ãƒªã‚¹ãƒˆã‚’使ã„ã¾ã™ã€‚ 評価リストã¯ã€edebug実行ã®ãŸã³ã«è©•ä¾¡ã™ã‚‹å¼ã‚’複数書ãã¨ã“ã‚ã§ã™ã€‚
評価リストを使ã†ã«ã¯ã¾ãšEを押ã—ã¾ã™ã€‚ ã™ã‚‹ã¨*edebug*ãƒãƒƒãƒ•ã‚¡ãŒå‡ºã¦ãã¾ã™ã€‚ ãã“ã§å¼ã‚’書ã„ã¦C-c C-uã§ç™»éŒ²ã—ã¾ã™ã€‚ *edebug*ãƒãƒƒãƒ•ã‚¡ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚
x
2
;-----------------------------------------------------------------------------------
複数ã®å¼ã‚’登録ã™ã‚‹å ´åˆã¯ã€æœ«å°¾ã«è¿½è¨˜ã—ã¦C-c C-uã§ã™ã€‚
評価リストã«ç™»éŒ²ã—ãŸã‚‰ã€C-x oã‚ã‚‹ã„ã¯C-c C-wã§edebug対象関数ã«ã‚‚ã©ã‚Šã¾ã™ã€‚ ã‚ã¨ã¯é€šå¸¸ã®edebugã®æ“作をã—ã¦ãã ã•ã„。 実行ãŒé€²ã‚€ãŸã³ã«è©•ä¾¡ãƒªã‚¹ãƒˆãŒæ›´æ–°ã™ã‚‹ã®ã¯ã€ã¨ã¦ã‚‚便利ãªã‚‚ã®ã§ã™ã€‚ ã—ã‹ã‚‚ã€é–¢æ•°å®šç¾©ã‚’変更ã—ã¦ã‚‚評価リストã¯ä¿æŒã•ã‚Œã¾ã™ã€‚ 評価リストã¯ã€ã¨ã¦ã‚‚便利ã§ã™ã‚ˆã€œ