2017-02-26 13 views
3

私はlispマクロについてもっと学びたいと思います。defunマクロの簡単な実装を作成したいと思います。 私はまた、すべての実装でlispのソースコードに興味があります。defispマクロはlispでどのように実装されていますか?

+5

あなた自身で確認してから具体的な質問をしてみませんか?あなたが勉強できる多くのオープンソースのLisp実装があります。 Lispマクロについて知りたいのであれば、その本の「Lisp上で」無料のPDFをお勧めします。http://www.paulgraham.com/onlisp.html –

+1

最初はどこを検索するのか分かりませんでした。 – Metonymy

答えて

6

これはbootstrappingの、トリッキーな質問です:defunは(IOWは、多くの機能を呼び出して)多くのことを行いますが、1が動作defunを必要とするこれらの機能を定義します。したがってclisp/src/init.lispdefunの3(!3)の定義があります

:ライン

  1. 228
  2. 1789
  3. 1946

で関数定義の非常に基本的な定義は、この可能性があり

(defmacro defun (fname lambda-list &rest body) 
    `(setf (fdefinition ',fname) 
     (lambda ,lambda-list 
      (block ,fname ,@body)))) 

実際には、この時点でdefmacrobackquoteが存在しないことを除いて、まだの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 
関連する問題