Tôi có một tập hợp các chức năng có tên là "ip", "ngày", "url", v.v.Định nghĩa chức năng chương trình: Cách loại bỏ "eval" ở đây?
Với những điều này, tôi muốn tạo một tập hợp các hàm khác "ip-is", "date-is" v.v ...
Cuối cùng tôi có giải pháp sau, thats làm việc tốt, nhưng sử dụng "eval".
(loop for name in '(ip date url code bytes referer user-agent) do
(let ((c-name (intern (concatenate 'string (symbol-name name) "-IS"))))
(eval `(defun ,c-name (c)
#'(lambda (l) (equal (,name l) c))))))
Ai đó có thể giúp tôi, cách loại bỏ "bad evil"? Điều quan trọng đối với chương trình của tôi là tên hàm được cung cấp dưới dạng danh sách. Vì vậy, một cuộc gọi đến một số marcro
(define-predicate ip)
(define-predicate date)
(define-predicate url)
, vv
sẽ không phù hợp với nhu cầu của tôi. Tôi không có vấn đề thực sự với "eval", nhưng tôi đọc rất thường xuyên, rằng eval được coi là phong cách xấu và nên tránh nếu có thể.
Cảm ơn bạn đã nâng cao!
Chắc chắn các trường hợp phù hợp với các macro. Sử dụng 'eval' là sự lựa chọn đúng là một trường hợp rất hiếm. –
@Elias, chỉ là một câu hỏi về những gì bạn đã viết: có vẻ như tôi không thể đánh giá macro tại thời điểm tải vì chúng được sử dụng tại thời gian biên dịch để tạo mã. – tuscland