Làm thế nào để tôi khai báo một biến không thể biết được?


10

Làm cách nào để tránh các cảnh báo của trình biên dịch byte Unused lexical variabletrong các hàm được xác định bằng cách sử dụng macro mở rộng defun?

Ví dụ, macro defun-rcirc-commandtrong rcirc.el sử dụng targetbiến không được sử dụng bởi một số lệnh.

Trong Common Lisp tôi có thể sử dụng ignorable khai báo : (declare (ignorable target)).

Giải pháp xấu:

  • Thêm một cái gì đó giống như (setq target target)cho tất cả những người dùng defun-rcirc-commandkhông sử dụng target: yêu cầu sửa đổi nhiều yêu cầu macro.

  • Tiền tố biến có thể bỏ qua với dấu gạch dưới - _target- không giúp ích gì vì _có nghĩa là ignore, không ignorable, nghĩa là khi nó được sử dụng, tôi nhận được variable '_target' not left unused.


Tiền tố chúng với một dấu gạch dưới nên làm điều đó.
Politza

@politza: _ có nghĩa là bỏ qua, không thể bỏ qua
sds

1
Bạn có muốn sửa đổi macro để giải quyết vấn đề? Bạn có thể chỉ cần đặt một (ignore VAR)đối số cho tất cả các đối số defun trước khi mở rộng, @ body có thể sẽ làm im lặng các lỗi.
Jordon Biondo

Câu trả lời:


13

Cách tôi đã làm cho đến nay là thêm một cuộc gọi của hình dạng

(ignore <var>)

Cuộc gọi chức năng này sẽ được tối ưu hóa đi, nhưng trước đó trình biên dịch vẫn sẽ tính nó là sử dụng, vì vậy cảnh báo "không sử dụng" sẽ không được kích hoạt.


-1

Nhìn vào mã, có vẻ như mục tiêu không có ý định là một biến toàn cục mà được chuyển đến hàm được tạo khi nó được gọi. Nếu đó là trường hợp, tốt hơn là tạo nó như là một biểu tượng cục bộ cho macro. Một ví dụ đơn giản về một macro tạo ra một hàm chấp nhận một đối số và thêm 10 vào nó:

(defmacro xxx (name)  
  ""
  (let ((target (make-symbol "target")))
  `(defun ,name (,target) (+ 10 ,target))))

Gọi điện thoại

(xxx hamster)

sẽ dẫn đến một hàm có tên là hamster chấp nhận một đối số.

Sau đó bạn có thể gọi

(hamster 5)

và nó sẽ trở lại 15.

Bí quyết là tạo một biểu tượng mới sẽ đóng vai trò là đối số cho hàm mới.

BIÊN TẬP:

Tôi đã luôn thấy rằng nếu bạn đang đề cập đến biểu tượng được tạo trong biểu thức cơ thể được truyền, bạn bao gồm tên trong cuộc gọi như:

(defmacro xxx (name t2 &rest body)  
  ""
  (let ((t2-arg (make-symbol "target")))
  `(defun ,name (&optional ,t2-arg) 
     (let ((,t2 (or ,t2-arg 10)))
       ,@body))))

Sau đó chuyển các cuộc gọi thành:

(xxx hamster target (+ target 20))

Ở đâu

(hamster)

trả về 30

(hamster 20)

trả lại 40.

Phải thừa nhận rằng, điều này luôn làm tôi khó chịu khi tôi viết macro theo cách này cho đến khi tôi nhìn vào cách sử dụng mà nó xuất hiện một tham số được khai báo và sử dụng sau này.


2
Phần thân của hàm được truyền cho macro và nó phải có thể tham chiếu target. IOW, đề xuất tuyệt vời của bạn không được áp dụng trong trường hợp cụ thể này.
sds
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.