我想了解更多關於lisp宏的信息,我想創建一個簡單的defun
宏實現。 我也對所有實現中的lisp源代碼感興趣。在lisp中如何實施defun宏?
3
A
回答
6
這是一個棘手的問題,因爲bootstrapping:defun
做了很多事情(督察,調用了大量的功能),但是定義一個需要工作defun
這些功能。因此,也有在clisp/src/init.lisp的defun
三(3!)定義:在線路
defun定義的非常基本的定義是這樣的:
(defmacro defun (fname lambda-list &rest body)
`(setf (fdefinition ',fname)
(lambda ,lambda-list
(block ,fname ,@body))))
實際上,這是CLISP(第228行)中defun
的第一個定義,除了當時沒有defmacro
並且沒有backquote還有,所以實際的代碼看起來比較醜。
另請參見Is defun or setf preferred for creating function definitions in common lisp and why?其中我討論了defun
s的宏觀展開。
0
可以輕鬆地查看如何您的特定CL的實施,實現defun
運行
(macroexpand '(defun add2 (x) (+ x 2)))
在SBCL
它擴展爲:
(PROGN
(EVAL-WHEN (:COMPILE-TOPLEVEL) (SB-C:%COMPILER-DEFUN 'ADD2 NIL T))
(SB-IMPL::%DEFUN 'ADD2
(SB-INT:NAMED-LAMBDA ADD2
(X)
(BLOCK ADD2 (+ X 2)))
(SB-C:SOURCE-LOCATION)))
T
要看到,實現我會使用特定的源代碼(在Emacs上)M-.
鍵綁定,然後我會寫defun
並回車。然後Emacs將得到源代碼:
(sb!xc:defmacro defun (&environment env name lambda-list &body body)
#!+sb-doc
"Define a function at top level."
[...]
我不打算粘貼整個宏,因爲它是相當長。如果您不在Emacs上,您可以嘗試在repos中搜索,因爲大多數實現都是開源的。
BTW defun
並不特別。你可以用setf
-inf a symbol-function
來實現一個lambda。例如: -
(setf (symbol-function 'ADD3) #'(lambda (x) (+ x 3)))
; => #<FUNCTION (LAMBDA (X)) {1006E94EBB}>
(add3 4)
; => 7
相關問題
- 1. defun和lambda在lisp
- 2. 在Lisp中用defun重寫列表
- 3. Emacs:我如何在defun中用lisp函數替換regexp?
- 4. 如何在LISP中覆蓋(defun eval(expr))函數
- 5. Lisp,不在defun工作的說明
- 6. 在defun使用cond的Lisp評估
- 7. 如何實現Lisp宏系統?
- 8. Alexandria Lisp手冊和實施
- 9. 實施微手冊LISP
- 10. 如何在LISP函數中調用宏?
- 11. 如何在我的LISP中實現一個宏觀系統
- 12. 在Common Lisp中編寫++宏
- 13. 「 @」在LISP宏函數
- 14. 從On Lisp學習宏中的宏
- 15. 瞭解如何實現一次只有lisp宏
- 16. Lisp宏 - 如何正確輸入類型
- 17. 如何構建這個lisp宏?
- 18. 如何實施在線白板設施?
- 19. 如何將宏存儲在Common Lisp [sbcl]中的變量中?
- 20. Lisp:宏與函數
- 21. lisp defclass宏問題
- 22. Lisp宏的問題
- 23. Lisp的宏表達
- 24. defun和defun的百分比
- 25. 如何在Common Lisp的宏參數中創建一個單詞?
- 26. 如何在閱讀器宏中評估Lisp代碼?
- 27. 如何在Common Lisp中使用DO宏編寫MEMBER函數?
- 28. 如何實施Google +
- 29. PushNotifications - 如何實施
- 30. 如何實施RingFiFoBuffer
爲什麼不自己檢查一下,然後問具體問題?你可以學習許多開源的Lisp實現。如果你想了解Lisp宏,我會推薦'On Lisp' - 這本書的免費PDF:http://www.paulgraham.com/onlisp.html –
起初我不知道在哪裏搜索。 – Metonymy