Có thể edebug một lambda được trả về bởi một chức năng?


7

Ví dụ,

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

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

(square-two)

Câu trả lời:


6

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.


2

Đú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.


2
Tiêu đề câu hỏi được đề cập edebug, không debug.
npostavs

@npostavs: Hy vọng ai đó sẽ đăng câu trả lời cụ thể cho edebug. Tôi không sử dụng edebug, vì vậy tôi không thể giúp đỡ ở đó. Nếu edebug không thể được sử dụng cho trường hợp sử dụng như vậy (tôi đã thử một thời gian ngắn, nhưng tôi không tìm thấy giải pháp hữu ích nào), một giải pháp thay thế là sử dụng tiêu chuẩn 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.
vẽ

Vâng, tôi chủ yếu quan tâm đến edebug. Tôi đã thử sử dụng edebug-on-entryđể thành công nhỏ.
Russ Kiselev

1

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))))

Hmm, thật thú vị, nhưng tôi không thể làm cho nó hoạt động được. Tôi nhận được (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ó.
npostavs

Hmm ... tôi đoán nó bị hỏng bằng cách nào đó, sau đó. Tôi biết tôi đã thấy nó hoạt động (trở lại khi tôi va vào nó vài năm trước trong khi cố gắng sửa một cái gì đó trong Edebug), nhưng tôi chưa bao giờ thực sự sử dụng nó.
Stefan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.