2017-03-05 4 views
0

私は現在、数回、LOLのセクション6.7を読んでいますが、私はまだ次のことを心配していません。Pandoricマクロのシンボルをコンパイルするにはどうしたらいいですか?

以前に外部コードに対して閉じられていたバインディングは、それらのバインディングが効率的にコンパイルされ、アクセサー記号が忘れられてしまったとしても、私たちにとっては変わりません。

もし閉じられたシンボルが基本的にクロージャの環境でポインタにコンパイルされると、既にコンパイルされた関数にシンボルを渡すことができますし、関数は何とかシンボルを比較できますか?

私はCLISPにpantest例をいじってきた、と私はpantestaccthisの両方を変更することができるよということがわかります。 pantestをコンパイルして逆アセンブルすることはできますが、すべてのシンボルが環境内に表示されます。アセンブリにコンパイルされたリスプがあれば、私はもっと直感的になるかもしれませんが、コードは複雑すぎて、説明なしではあまりにも難しいでしょう。

+1

私は、「パンドリックレッツ」のことは、彼らが(そしてその評価の順番を)尋ねることなしにできるかどうかということについて多くのことを言っていると思います。しかし確かに、 'dlambda'はすべての変数名を返します。 – acelent

答えて

1

、(私は後で戻ってくるだろうし、後でここでいくつかのより多くの情報を記入)短い(とやや単純化しすぎ)で

をpandoric-聞かせてマクロを取得しようとした場合に対処するために、いくつかの余分なコードに追加しました導入するさまざまな変数のそれぞれを設定することができます。この余分なコードは、コードがコンパイルされた後の変数のシンボルを記憶しますが、その情報を必要とする唯一のコードなので、他のすべてが非常に効率的なポインタ操作にコンパイルされます。

この余分なコードを生成する機能は、それらがpandoricletマクロ自体に設けられているシンボルsymvalに依存するコードを返すので、読みトリッキーされどちらも、pandoriclet-getpandoriclet-setあります。

+0

著者の声明がPandoric Macrosにとって技術的に正しいとは言いませんか?他のレキシカル環境にエクスポートされたシンボルは単なるインデックスまたはポインタ以外のものですか? – Todd

+1

まあ...私は誤解を見ると思います。字句環境は記号を導入せず、変数を導入し、既存の記号をそれらの変数と関連付ける。通常、コンパイラはその変数をそのシンボルで参照した場所をすべて見ることができ、完全にシンボルを最適化することができます。 pandoric-letは、実行時に各変数をシンボルで検索するコードを追加して、レキシカルスコープ外の変数にアクセスできるようにします。 – djeis

+0

※私は思っています*分かります。これらのシンボルは、コンパイル後にクロージャーに実際に(追加されて)そこにあります。あなたはまだ何らかの比較をしなければなりません(私は文字列を比較すると仮定します)。作者が参照しているバインディングはおそらく変数へのポインタであり、余分なコードはコンパイルされていません。 – Todd

2

私はLet Over Lambdaに慣れていません。

小冊子の本Lispは、レキシカルバインディングがどのように非常に効率的な変数参照にコンパイルできるかを説明しています。変数へのすべての既知の参照は限定された範囲にあるので、配列を使用してバインディングを格納し、シンボルを使用してシンボルを使用したり、シンボルのプロパティを使用して値。

関数に渡されるシンボルは単なるシンボルであり、一種のデータです。関数内の他のものと比較することは、特定のスコープ内の字句バインディングに関する情報にアクセスすることと同じではありません。

レキシカルステートにアクセスして修正するためにシンボルを渡して関数の振る舞いをどのように変更できるかを示す教訓的なLisp擬似OOテクニックがありますが、これは任意のルックアップではなく、シンボルに基づく字句情報の

(defun make-incrementor (initial-value) 
    (let ((value initial-value)) 
    (lambda (action) 
     (ecase action 
     (:value 
     value) 
     (:increment 
     (incf value)) 
     (:reset 
     (setf value initial-value)))))) 

> (defvar *inc* (make-incrementor 10)) 
*INC* 

> (funcall *inc* :increment) 
11 

> (funcall *inc* :increment) 
12 

> (funcall *inc* :increment) 
13 

> (funcall *inc* :reset) 
10 

これは、外部アクセスなしで、valueのレキシカルバインディングを操作しています。すべての変更は、同じ語彙的な場所にあるコードを介して行われます。

+0

LOLは小さな小片のLispも参照しています。読書リストに追加する必要があります。ただし、Pandoric Macrosでは、他の字句環境(plambda参照)でまだバインドされていない、あるいは定義されていないシンボルや値を、外部からアクセスすることができます。これは私が理解していないものです。 – Todd

+0

「あなたがそれをやるに十分なことを知ったら、それをやることができないほど十分に知っているだろう」というような音がするかもしれません。 – Xach

+0

私はlispプログラマーではありません。私はこの本を読んで始めたと思う。マクロを使ってDSLを作る方法をちょっと理解したかったからだ。余分なマクロの使用は非常に危険だと考えています。少なくとも、何が起こっているのかを理解することは難しいです。 – Todd

関連する問題