Tôi muốn tìm hiểu nội bộ của Lisp, vì vậy tôi muốn xem mọi thứ được triển khai như thế nào.Mở rộng một biểu mẫu macro hoàn toàn
Ví dụ,
(macroexpand '(loop for i upto 10 collect i))
mang lại cho tôi (trong SBCL)
(BLOCK NIL
(LET ((I 0))
(DECLARE (TYPE (AND NUMBER REAL) I))
(SB-LOOP::WITH-LOOP-LIST-COLLECTION-HEAD (#:LOOP-LIST-HEAD-1026
#:LOOP-LIST-TAIL-1027)
(SB-LOOP::LOOP-BODY NIL
(NIL NIL (WHEN (> I '10) (GO SB-LOOP::END-LOOP)) NIL)
((SB-LOOP::LOOP-COLLECT-RPLACD
(#:LOOP-LIST-HEAD-1026 #:LOOP-LIST-TAIL-1027)
(LIST I)))
(NIL (SB-LOOP::LOOP-REALLY-DESETQ I (1+ I))
(WHEN (> I '10) (GO SB-LOOP::END-LOOP)) NIL)
((RETURN-FROM NIL
(SB-LOOP::LOOP-COLLECT-ANSWER
#:LOOP-LIST-HEAD-1026)))))))
Nhưng LOOP-BODY, VỚI-LOOP-LIST-THU-HEAD, vv vẫn là macro. Làm thế nào tôi có thể mở rộng một biểu mẫu macro hoàn toàn?
Khi tính di động là một mối quan tâm, hãy thử Johnnmlin's macroexpand-dammit, nó hoạt động bên ngoài SBCL và thực hiện điều tương tự (mặc dù định nghĩa macrolet dường như được thay thế bằng progn là không cần thiết). –