Có cách nào để tạm nhập một vài hàm từ gói vào gói hiện tại, sử dụng các hàm/macro phổ biến tiêu chuẩn không?Lisp thường gặp: Phương pháp tốt nhất để tạm nhập một vài chức năng từ gói
Tôi không thể tìm thấy và phải tự cuộn. Tôi không muốn mã hóa bất cứ điều gì, hoặc giới thiệu một cấu trúc ngôn ngữ khác, nếu tiêu chuẩn đã cung cấp chức năng như vậy.
(defmacro with-functions (functions the-package &body body)
"Allows functions in the-package to be visible only for body.
Does this by creating local lexical function bindings that redirect calls
to functions defined in the-package"
`(labels
,(mapcar (lambda (x) `(,x (&rest args)
(apply (find-symbol ,(format nil "~:@(~a~)" x)
,the-package)
args)))
functions)
,@body))
Ví dụ sử dụng:
(defclass-default test-class()
((a 5 "doc")
(b 4 "doc")))
#<STANDARD-CLASS TEST-CLASS>
CL-USER>
(with-functions (class-direct-slots slot-definition-name) 'sb-mop
(with-functions (slot-definition-initform) 'sb-mop
(slot-definition-initform
(car (class-direct-slots (find-class 'test-class))))))
5
CL-USER>
EDIT: Thành lập một số gợi ý Rainer để vĩ mô.
Tôi quyết định giữ khả năng tra cứu thời gian chạy, tại thời điểm tra cứu thời gian chạy để tìm hàm trong gói.
Tôi đã cố gắng viết macro nhập có sử dụng tính năng nhập bóng và không phổ biến, nhưng tôi không thể làm cho nó hoạt động. Tôi đã có vấn đề với người đọc nói rằng các chức năng nhập khẩu đã không tồn tại được (tại thời gian đọc) trước khi mã nhập khẩu các chức năng đã được đánh giá.
Tôi nghĩ việc làm việc với tính năng nhập bóng và không truy cập là cách tốt hơn, vì điều này sẽ sạch hơn, nhanh hơn (không có khả năng tra cứu thời gian chạy) và làm việc với các chức năng và biểu tượng trong gói.
Tôi sẽ rất quan tâm để xem liệu ai đó có thể mã hóa macro nhập bằng cách sử dụng tính năng nhập không liên tục và nhập bóng.
này không hoạt động với các hàm từ vựng, vì APPLY không thể gọi chúng bằng các ký hiệu như tên. –
Tôi không nghĩ rằng điều này là có thể với một vĩ mô, bởi vì các biểu tượng được giải quyết bởi người đọc trước khi macro được mở rộng, nhưng tôi có thể sai Tôi chưa hiểu đầy đủ về cách thức hoạt động của trình đọc. – Daimrod
@Daimrod Có thể xây dựng một macro như vậy, nhưng nó rất khó (và, có lẽ, không thể chuyển đổi), bởi vì bạn sẽ phải xử lý xung đột tên, phát sinh từ chiến lược phân giải ký hiệu ban đầu. –