Apa gunanya kutipan dengan argumen dan koma tunggal? (kutipan, arg)
15
(quote x)membuat x tidak dievaluasi, tetapi menambahkan ,di depan xdi quotedalamnya membuatnya dievaluasi. Apa itu titik menggunakan kutipan dengan satu argumen dengan koma di depannya, seperti: (quote ,x)?
Koma digunakan dalam konteks daftar backquoted (alias quasiquoted), yang memungkinkan Anda untuk mengevaluasi beberapa bagian dari daftar secara selektif. Lihat juga utas ini untuk contoh penggunaan untuk backquoting.
Beberapa contoh sederhana:
(setq a "a's value" b "b's value" c "c's value")
'(a b c) ; => (a b c)
`(,a b ,c) ; => ("a's value" b "c's value")
Koma yang Anda maksudkan berada dalam definisi makro yang, pada gilirannya, menggunakan kutipan balik progn:
Ackey, jadi kutipan di depan prognberarti Anda harus meletakkan koma di depan hal-hal yang ingin Anda evaluasi, tidak peduli seberapa jauh bersarang? (Ada di ,cmddalam daftar lain, bukan di dalam (progn).)
The Unfun Cat
Ini sepertinya kesempatan bagus untuk mengujinya! Coba evaluasi (setq a "a's value" b "b's value" c "c's value")dan evaluasi `(a '(,b c)).
Dan
Newb lain: untuk mengevaluasi menambahkan teks ke buffer awal Anda, kemudian tempatkan kursor Anda di akhir baris, lalu tekan Cxe.
The Unfun Cat
11
Itu karena itu di dalam makro. Makro harus mengembalikan formulir Lisp, yang kemudian dievaluasi.
progn
berarti Anda harus meletakkan koma di depan hal-hal yang ingin Anda evaluasi, tidak peduli seberapa jauh bersarang? (Ada di,cmd
dalam daftar lain, bukan di dalam(progn)
.)(setq a "a's value" b "b's value" c "c's value")
dan evaluasi`(a '(,b c))
.Itu karena itu di dalam makro. Makro harus mengembalikan formulir Lisp, yang kemudian dievaluasi.
Misalnya, melihat permohonan pertama makro ini:
Kami membutuhkan ekspansi untuk memuat:
itulah yang
(quote ,cmd)
mencapai. Jika makro akan menggunakan datarancmd
sebagai gantinya, itu akan disimpan secara harfiah dan ekspansi akan:yang merupakan kesalahan, karena
cmd
tidak didefinisikan di lingkungan tempat makro dipanggil.sumber