私はlispマクロについてもっと学びたいと思います。defun
マクロの簡単な実装を作成したいと思います。 私はまた、すべての実装でlispのソースコードに興味があります。defispマクロはlispでどのように実装されていますか?
3
A
答えて
6
これはbootstrappingの、トリッキーな質問です:defun
は(IOWは、多くの機能を呼び出して)多くのことを行いますが、1が動作defun
を必要とするこれらの機能を定義します。したがってclisp/src/init.lispでdefun
の3(!3)の定義があります
で関数定義の非常に基本的な定義は、この可能性があり
(defmacro defun (fname lambda-list &rest body)
`(setf (fdefinition ',fname)
(lambda ,lambda-list
(block ,fname ,@body))))
実際には、この時点でdefmacro
とbackquoteが存在しないことを除いて、まだのCLISP(行228)の最初の定義はdefun
なので、実際のコードはもっと醜いようです。
も参照Is defun or setf preferred for creating function definitions in common lisp and why?defun
のマクロ展開について議論します。
0
あなたが簡単にあなたの特定のCLの実装は、それが拡大しSBCL
で
(macroexpand '(defun add2 (x) (+ x 2)))
を実行することによりdefun
を実装する方法を確認することができます。
(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
と入力してEnterキーを押します。次に、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
-symbol-function
で多くを実装できます。例えば:
(setf (symbol-function 'ADD3) #'(lambda (x) (+ x 3)))
; => #<FUNCTION (LAMBDA (X)) {1006E94EBB}>
(add3 4)
; => 7
関連する問題
- 1. @privateはどのように実装されていますか?
- 2. BigDecimalはどのように実装されていますか?
- 3. HttpSessionはどのように実装されていますか?
- 4. removeEventListenerはどのように実装されていますか?
- 5. INativeElementViewはどのように実装されていますか?
- 6. PTRACE_SINGLESTEPはどのように実装されていますか?
- 7. テンソルフローはどのように実装されていますか?
- 8. \ bはどのように実装されていますか?
- 9. フィルタはどのように実装されていますか?
- 10. MarshalByRefObjectはどのように実装されていますか?
- 11. クロスバリデーションはどのように実装されていますか?
- 12. タスクスケジューリングはどのように実装されていますか?
- 13. os.path.fileはどのように実装されていますか?
- 14. getchar()はどのように実装されていますか?
- 15. モバイルバックグラウンドループはどのように実装されていますか?
- 16. Collection.sortがどのように実装されていますか?
- 17. マクロはどのように定義されていますか?
- 18. Wami Recorderは実際にどのように実装されていますか?
- 19. 機能は実装されていないマクロですか?
- 20. Objective Cではカテゴリはどのように実装されていますか?
- 21. RedisではBRPOPはどのように実装されていますか?
- 22. MPI_SendはどのようにMPI_Characterで実装されていますか? FORTRANで
- 23. vicidialのマニュアルダイヤルはアスタリスクでどのように実装されていますか?
- 24. コルーチンはsmalltalkでどのように実装されていますか?
- 25. Linuxカーネルでpercpuポインタはどのように実装されていますか?
- 26. int()はどのようにPythonで実装されていますか?
- 27. intはどのようにJavaで実装されていますか?
- 28. linuxではclock_gettimeがどのように実装されていますか?
- 29. __subclasses__メソッドはCPythonでどのように実装されていますか?
- 30. SQLデータベースエンジン内でデータベーストリガはどのように実装されていますか?
あなた自身で確認してから具体的な質問をしてみませんか?あなたが勉強できる多くのオープンソースのLisp実装があります。 Lispマクロについて知りたいのであれば、その本の「Lisp上で」無料のPDFをお勧めします。http://www.paulgraham.com/onlisp.html –
最初はどこを検索するのか分かりませんでした。 – Metonymy