関数によって返されたラムダをedebugすることは可能ですか?


7

例えば、

(defun create-function (number)
  `(lambda () (* ,number ,number)))

(defalias 'square-two (create-function 2) "adds two")

(square-two)

回答:


6

Edebugは、実行時に構築されるインストルメンテーションコードをサポートしていません。インストルメントしようとするとcreate-function(create-function 2)実行時ではなく評価時にステッピングが発生しますsquare-two

Edebugはlambdaフォームのインストゥルメンテーションをサポートしていますが、字句バインディングを使用して例を書き換えることができます。

;;; -*- lexical-binding: t -*-
(defun get-lexical-function (number)
  (lambda () (* number number)))

(defalias 'square-two (get-lexical-function 2) "adds two")

次に、フォームを評価するget-lexical-function 前にインストルメントする場合defaliaslambdaを評価するときにステップスルーできますsquare-two


2

はい。

M-x debug-on-entry RET square-two RET

M-: (square-two) RET

Debugger entered--entering a function:
* square-two()
  eval((square-two) nil)
  eval-expression((square-two) nil nil 127)
  funcall-interactively(eval-expression (square-two) nil nil 127)
  call-interactively(eval-expression nil nil)
  command-execute(eval-expression)

d関数をステップ実行するために使用します。cステップをスキップするために使用します(サブステップをスキップします)。そしていつものようにC-h m、デバッガーについて、他のキーを含めて詳しく説明します。


2
記載されている質問のタイトルedebugではなくdebug
npostavs

@npostavs:誰かがedebugに固有の回答を投稿してくれることを願っています。edebugは使っていないので仕方ない。edebugがそのようなユースケースに使用できない場合(私は少し試してみましたが、有用な解決策が見つからなかった)、代わりに標準を使用することdebugです。しかし、edebugもこれに使用できると思います。
ドリュー、

はい、私は主にに興味がありedebugます。私はedebug-on-entryほとんど成功しないように使ってみました。
Russ Kiselev 2017年

1

ところで、npostavsのソリューションがあなたの例にとってより良いオプションですが、バッククォートを使って手動でコードをビルドする必要がある場合(例:内部defmacro)、あなたは試すことができます:

(defun create-function (number)
  (edebug-\` (lambda () (* ,number ,number))))

うーん、面白いですが、うまく動かせません。わかります(invalid-function square-two)。変更し(defmacro create-function (number) (edebug-` (* ,number ,number)))て機能するコードを生成しますが、それを実行することはできません。
npostavs 2017年

うーん、どういうわけか壊れたと思います。私はそれが機能しているのを見たことがあります(Edebugで何かを修正しようとしているときに数年前にそれにぶつかったときに戻ってきました)が、実際にそれを利用したことはありません。
ステファン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.