Tôi đã quen với macro elisp không dùng nữa flet
và tôi được yêu cầu đổi sang cl-flet
. Tuy nhiên, khi thực hiện thay đổi này, một số chương trình elisp của tôi đã ngừng hoạt động và tôi nhận ra lý do là, không giống như flet
, cl-flet
không cho phép các hàm đệ quy. Ví dụ: xác định hàm bên dưới
(defun show-problem-in-action (x)
(cl-flet (
(factorial (n)
(if (= n 0)
1
(* n (factorial (- n 1))) )))
(factorial x) ))
ai được không có lỗi bằng cách gọi
(show-problem-in-action 0)
Đầu ra: 1
bởi vì hàm "cl-flet-định nghĩa" factorial
không tự gọi khi "x = 0". Tuy nhiên
(show-problem-in-action 5)
tạo ra lỗi void-function factorial
.
Mặt khác, thay thế cl-flet
bằng macro không dùng nữa flet
, như bên dưới
(defun no-problem-with-deprecated-macro (x)
(flet (
(factorial (n)
(if (= n 0)
1
(* n (factorial (- n 1))) )))
(factorial x) ))
cho phép gọi đệ quy:
(no-problem-with-deprecated-macro 5)
Đầu ra: 120
Nếu cl-flet
không hoạt động, cái gì sẽ là sự thay thế tốt nhất của tôi để thay thế flet
, vẫn có thể gọi các hàm theo cách đệ quy?
flet
vàcl-flet
không phải là thiếu hỗ trợ cho đệ quy mà là thực tếflet
cung cấp các định nghĩa hàm có phạm vi động, trong khicl-flet
cung cấp các định nghĩa hàm có phạm vi từ vựng. Phạm vi động xảy ra để cung cấp hỗ trợ cho đệ quy nhờ vào việc dựa vào bên trong một sự gián tiếp.