Ý của tôi là "trình bao bọc hàm" trong suốt "là một hàm, hãy gọi nó wrapper
, trả về kết quả từ việc chuyển tất cả đối số của nó sang một số hàm khác, hãy gọi nó wrappee
.
Làm thế nào điều này được thực hiện trong Emacs Lisp?
NB: Hàm lý tưởng wrapper
là bất khả tri về wrappee
chữ ký của hàm; tức là nó không biết gì về số lượng, vị trí, tên, v.v. của wrappee
các đối số; nó chỉ chuyển tất cả các đối số của nó theo wrappee
, giống như là wrappee
lần đầu tiên được gọi. (Tuy nhiên, không cần phải làm phiền với ngăn xếp cuộc gọi để thay thế cuộc gọi wrapper
bằng cuộc gọi đến wrappee
.)
Tôi đăng một phần câu trả lời cho câu hỏi của tôi:
(defun wrapper (&rest args) (apply 'wrappee args))
Điều này chỉ hoạt động khi wrappee
là không tương tác. Rõ ràng, cách các chức năng tương tác có được các đối số của chúng đại diện cho một "kênh" khác với những gì được bao phủ bởi (&rest args)
câu thần chú. Những gì tôi vẫn cần, do đó, là một equally- wrappee
đối -agnostic của (&rest args)
chữ ký cho trường hợp wrappee
là một tương tác chức năng.
(Câu hỏi này được thúc đẩy bởi một vấn đề được mô tả trong câu hỏi trước đó .)
Trong trường hợp cần làm rõ thêm những gì tôi yêu cầu, dưới đây là một vài ví dụ, hiển thị tương đương Python và JavaScript của những gì tôi đang theo dõi.
Trong Python, một vài cách tiêu chuẩn để thực hiện trình bao bọc như vậy được hiển thị bên dưới:
def wrapper(*args, **kwargs):
return wrappee(*args, **kwargs)
# or
wrapper = lambda *args, **kwargs: wrappee(*args, **kwargs)
(Ở đây *args
là viết tắt của "tất cả các đối số vị trí" và **kwargs
là viết tắt của "tất cả các đối số từ khóa".)
Tương đương JavaScript sẽ giống như thế này:
function wrapper () { return wrappee.apply(this, arguments); }
// or
wrapper = function () { return wrappee.apply(this, arguments); }
Đối với bản ghi, tôi không đồng ý rằng câu hỏi này là một bản sao của Cách áp dụng mapcar cho một hàm có nhiều đối số . Tôi không thể giải thích được tại sao, vì hai câu hỏi trông rất khác nhau đối với tôi. Nó giống như được hỏi "giải thích tại sao một quả táo không nên được coi là tương đương với một quả cam". Câu hỏi đơn thuần là rất điên rồ, đến nỗi người ta nghi ngờ người ta có thể đưa ra một câu trả lời sẽ thỏa mãn người hỏi nó.
advice
công cụ đủ vấn đề mà tôi muốn tránh xa nó. Trên thực tế, động lực cho câu hỏi này là cố gắng tìm giải pháp cho một vấn đề khó hiểu khác mà tôi có với chức năng được
interactive
thông số kỹ thuật.