Ich möchte mehr über Lisp Makros lernen, und ich möchte eine einfache Implementierung des Makros defun
erstellen. Ich bin auch an Lisp Quellcode in allen Implementierungen interessiert.Wie wird das Defun-Makro in Lisp implementiert?
Antwort
Dies ist eine schwierige Frage, weil die bootstrapping: defun
eine Menge Dinge tut (IOW, ruft eine Vielzahl von Funktionen), aber diese Funktionen zu definieren, ein eine Arbeits defun
muss. So gibt es drei (3!) Definitionen von defun
in clisp/src/init.lisp: bei Linien
Die grundlegende Definition von defun dies sein könnte:
(defmacro defun (fname lambda-list &rest body)
`(setf (fdefinition ',fname)
(lambda ,lambda-list
(block ,fname ,@body))))
In der Tat ist dies die erste Definition von defun
in CLISP (Zeile 228), mit der Ausnahme, dass es defmacro
und backquote zu diesem Zeitpunkt noch gibt, so dass der eigentliche Code viel hässlicher aussieht.
Siehe auch Is defun or setf preferred for creating function definitions in common lisp and why?, wo ich Makroexpansion von defun
s diskutieren.
Sie können ganz einfach überprüfen, wie Ihre spezielle Implementierung CL, implementiert defun
von
(macroexpand '(defun add2 (x) (+ x 2)))
Auf SBCL
läuft es expandiert nach:
(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
Um die besondere Quellcode zu sehen, dass die ich umgesetzt würden verwenden (auf Emacs) die M-.
Schlüsselbindung und dann werde ich defun
schreiben und Enter drücken. Dann wird Emacs auf den Quellcode erhalten:
(sb!xc:defmacro defun (&environment env name lambda-list &body body)
#!+sb-doc
"Define a function at top level."
[...]
Ich bin nicht die ganze Makro gehen einzufügen, wie es ist ziemlich lang. Wenn Sie nicht auf Emacs sind, können Sie versuchen, in den Repos zu suchen, da die meisten Implementierungen Open Source sind.
BTW defun
ist nicht so besonders. Sie können viel davon mit setf
-in einem symbol-function
zu einem Lambda implementieren. Z.B .:
(setf (symbol-function 'ADD3) #'(lambda (x) (+ x 3)))
; => #<FUNCTION (LAMBDA (X)) {1006E94EBB}>
(add3 4)
; => 7
- 1. Wie wird das Spezifikationsmuster implementiert?
- 2. Wie wird das Einrasten in CollapsingToolbarLayout implementiert?
- 3. Wie wird das Vererbungskonzept in Javascript implementiert?
- 4. Wie wird @private implementiert?
- 5. Wie wird `class.name` implementiert
- 6. Wie wird Serializable implementiert?
- 7. Wie wird set() implementiert?
- 8. Wie wird das nicht-virtuelle Interface-Muster in C++ implementiert?
- 9. Wie wird das Postfach (Nachrichtenwarteschlange) in Scala Actors implementiert?
- 10. Wie wird das Sliding Panel in UWP implementiert?
- 11. Wie wird "werden" in Sprachen implementiert, die das Akteursmodell unterstützen?
- 12. Wie wird das Formular in einem Registerkartenfeld implementiert?
- 13. Wie wird das Sperren in einem Multiprozesssystem implementiert?
- 14. Wie wird das Sperren in einer Serverfarm implementiert?
- 15. Wie wird OpenID implementiert?
- 16. Wie wird __RTC_CheckEsp implementiert?
- 17. Wie wird pthread_join implementiert?
- 18. Wie generisches Objekt in Java implementiert wird, implementiert eine Schnittstelle
- 19. Wie wird die Abhängigkeitseigenschaft implementiert?
- 20. Wie wird Chat normalerweise implementiert?
- 21. Wie wird die Laufzeitlizenzierung implementiert?
- 22. Wie wird Azure Storage implementiert?
- 23. Wie wird inkrementelles Laden in MasterDetailsView implementiert?
- 24. Wie wird Pinch-Zoom in Android implementiert?
- 25. Wie wird das neue Google Logo (Moving Balls) implementiert?
- 26. Wie wird das Gentelella Bootstrap Admin Theme implementiert?
- 27. Wie wird Ratio in Haskell implementiert?
- 28. Wie wird das PHP-Array auf C-Ebene implementiert?
- 29. Wie wird die Großschreibung in nHibernate implementiert?
- 30. Wie wird das richtige horizontale Scrollbare Custom EditField implementiert?
Warum überprüfen Sie es nicht selbst und stellen Sie dann spezifische Fragen? Es gibt viele Open-Source-Lisp-Implementierungen, die Sie studieren können. Wenn Sie etwas über Lisp Makros erfahren möchten, würde ich 'On Lisp' empfehlen - kostenloses PDF des Buches: http://www.paulgraham.com/onlisp.html –
Zuerst wusste ich nicht, wo ich suchen sollte. – Metonymy