Bagaimana cara saya mendeklarasikan variabel yang dapat diabaikan?

10

Bagaimana cara saya menghindari peringatan byte-compiler Unused lexical variabledalam fungsi yang didefinisikan menggunakan makro untuk memperluas defun?

Misalnya, makro defun-rcirc-commanddalam rcirc.el menggunakan targetvariabel yang tidak digunakan oleh beberapa pemanggilan.

Dalam Common Lisp saya dapat menggunakan ignorable deklarasi: (declare (ignorable target)).

Solusi buruk:

  • Tambahkan sesuatu seperti (setq target target)ke semua pengguna defun-rcirc-commandyang tidak menggunakan target: yang membutuhkan banyak modifikasi makro.

  • Awalan variabel yang dapat diabaikan dengan garis bawah - _target- tidak membantu karena _berarti ignore, bukan ignorable, yaitu, ketika digunakan, saya dapatkan variable '_target' not left unused.

sds
sumber
Awalan mereka dengan garis bawah harus melakukannya.
politza
@politza: _ berarti diabaikan, tidak dapat diabaikan
sds
1
Apakah Anda ingin memodifikasi makro untuk menyelesaikan masalah? Anda mungkin bisa menempatkan (ignore VAR)argumen defun sebelum ekspansi, @ body yang mungkin akan membungkam kesalahan.
Jordon Biondo

Jawaban:

13

Cara saya melakukan itu sejauh ini adalah dengan menambahkan panggilan bentuk

(ignore <var>)

Panggilan fungsi ini akan dioptimalkan jauh, tetapi sebelum itu kompiler masih akan menghitungnya sebagai penggunaan, sehingga peringatan "tidak digunakan" tidak akan terpicu.

Stefan
sumber
-1

Melihat kode, tampak bahwa target tidak dimaksudkan untuk menjadi variabel global tetapi diteruskan ke fungsi yang dibuat ketika dipanggil. Jika itu masalahnya, lebih baik untuk membuatnya sebagai simbol lokal ke makro. Contoh sederhana makro yang membuat fungsi yang menerima argumen dan menambahkan 10 ke dalamnya:

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

Panggilan

(xxx hamster)

akan menghasilkan fungsi bernama hamster yang menerima satu argumen.

Maka Anda bisa menelepon

(hamster 5)

dan itu akan kembali 15.

Caranya adalah dengan membuat simbol baru yang akan bertindak sebagai argumen untuk fungsi baru.

EDIT:

Saya selalu melihat bahwa jika Anda merujuk pada simbol yang dihasilkan dalam ekspresi tubuh yang diteruskan, Anda memasukkan nama dalam panggilan seperti:

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

Yang kemudian mengubah panggilan menjadi:

(xxx hamster target (+ target 20))

dimana

(hamster)

yang mengembalikan 30dan

(hamster 20)

kembali 40.

Diakui, ini selalu mengganggu saya ketika saya menulis macro dengan cara ini sampai saya melihat penggunaan di mana muncul parameter yang dinyatakan dan kemudian digunakan.

M Smith
sumber
2
Tubuh fungsi diteruskan ke makro dan harus dapat merujuk target. TKI, saran bagus Anda tidak berlaku dalam kasus khusus ini.
sds