Saya baru mengenal Lisp dan saya membaca Let Over Lambda karya Doug Hoyte dan dia menyajikan makro nif
Paul Graham di Bab 3. Saya bermain-main dengan itu dan membuat dua makro ini:
(defmacro niffy (expr pos zero neg)
`(cond ((plusp ,expr) ,pos)
((zerop ,expr) ,zero)
(t ,neg)))
(defmacro niffy2 (expr pos zero neg)
`(let ((x ,expr))
(cond ((plusp x) ,pos)
((zerop x) ,zero
(t ,neg)))))
Ketika saya melakukan (macroexpand '(niffy2 10 "positive" "zero" "negative"))
, saya mendapatkan apa yang saya harapkan: (LET ((X 10)) (COND ((PLUSP X) "positive") ((ZEROP X) "zero" (T "negative"))))
Tetapi ketika saya melakukan (macroexpand '(niffy 10 "positive" "zero" "negative"))
saya baru saja mendapatkan formulir evaluasi "positive"
. Yang membingungkan saya karena di niffy
, cond
di-backquoted, jadi saya pikir itu berarti tidak akan dievaluasi. Mengevaluasi niffy
dan niffy2
tanpa perluasan makro, keduanya berfungsi persis seperti yang saya harapkan, mengembalikan "positif", "nol", dan "negatif" masing-masing untuk nilai positif, nol, dan negatif.