Ví dụ,
(defun create-function (number)
`(lambda () (* ,number ,number)))
(defalias 'square-two (create-function 2) "adds two")
(square-two)
Ví dụ,
(defun create-function (number)
`(lambda () (* ,number ,number)))
(defalias 'square-two (create-function 2) "adds two")
(square-two)
Câu trả lời:
Edebug không hỗ trợ mã thiết bị được xây dựng trong thời gian chạy. Nếu bạn cố gắng thực hiện create-function, thì bước sẽ xảy ra khi bạn đánh giá (create-function 2), không phải khi bạn thực hiện square-two.
Edebug không hỗ trợ các lambdabiểu mẫu thiết bị , vì vậy bạn có thể viết lại ví dụ của mình bằng cách sử dụng ràng buộc từ vựng:
;;; -*- lexical-binding: t -*-
(defun get-lexical-function (number)
(lambda () (* number number)))
(defalias 'square-two (get-lexical-function 2) "adds two")
Sau đó, nếu bạn ghi lại get-lexical-function trước khi đánh giá defaliasbiểu mẫu, bạn có thể thực hiện từng bước lambdakhi đánh giá square-two.
Đúng.
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)
Sử dụng dđể bước qua chức năng. Sử dụng cđể bỏ qua một bước (bỏ qua bước phụ). Và như mọi khi, C-h mcho bạn biết thêm về trình gỡ lỗi, bao gồm các khóa khác.
debug. Nhưng tôi tưởng tượng rằng edebug cũng có thể được sử dụng cho việc này.
edebug. Tôi đã thử sử dụng edebug-on-entryđể thành công nhỏ.
BTW, trong khi giải pháp của npostavs là lựa chọn tốt hơn cho ví dụ của bạn, trong những trường hợp bạn thực sự cần xây dựng mã theo cách thủ công với backquote (ví dụ bên trong defmacro), bạn có thể thử:
(defun create-function (number)
(edebug-\` (lambda () (* ,number ,number))))
(invalid-function square-two). Thay đổi để (defmacro create-function (number) (edebug-` (* ,number ,number)))tạo mã làm việc, nhưng tôi vẫn không thể quản lý để bước qua nó.
edebug, khôngdebug.