問題タブ [on-lisp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
macros - OnLispからSchemeでマクロを学ぶ
私は本当にSchemeマクロを学びたいです。「OnLisp」の内容を一瞥したところ、多くの章がLispマクロに専念してきました。しかし、私は一般的なlispを知りません。これを使用してSchemeマクロを学習できますか?
lisp - 奇妙な Lisp 引用シナリオ - Graham's On Lisp、37 ページ
Graham の本「On Lisp」を読んでいるのですが、37 ページにある次の例を理解できません。
誰かがここで何が起こっているのか理解していますか? これは、引用が何をするかについての私のメンタルモデルをひどく台無しにしています.
lisp - On Lisp の奇妙な引用リストの例
からのこの一節On Lisp
は本当に紛らわしいです - などの引用符で囲まれたリストを返すと、実際に関数が将来'(oh my)
どのように動作するかを実際に変更する方法が明確ではありません: 返されたリストは関数でゼロから再度生成されますか?呼ばれた?
戻り値に引用符付きリストが組み込まれるように exclaim を定義すると、
その後、戻り値の破壊的な変更
関数内のリストを変更できます。
このような問題に対する明確な証拠を作成するには、次のように記述します。
exclaim
結果に単語を追加するための最後の呼び出しはどのくらい正確goodness
ですか? 関数は外部変数を参照していないので、関数の動作をnconc
実際に変更するための別の呼び出しはどのように行われたのでしょうか?exclaim
lisp - Common Lisp でのマクロによる継続 -- OnLisp での実装について
On Lisp では、p. 267 で、Paul Graham は、マクロを渡す継続の実装を提供します。
t2
次のコードでは、 treeの各リーフのツリーをトラバースし、この実装を使用しています。特に、 のリーフが(最初の要素) から(2 番目の要素) に変更された後、 が呼び出されt1
たときに何が起こるのか疑問に思っています。が呼び出されると、単純に からラムダ関数がポップされ、そのラムダ関数が再度呼び出されます。しかし、この呼び出しは最も外側の のスコープ外で行われ、バインディングを担当していました。では、アウターによって導入されたバインディングはどのようにスコープ内にあるのでしょうか?restart
t1
A
B
restart
*saved*
dft-node
(cdr tree)
=bind
=bind
*cont*
*cont*
=bind
最後の形式は次のように展開されます
これにより、 が生成され(a 1)
ます。Graham によると、以降の への呼び出しはなどをまでrestart
生成し、その後の呼び出しでは、 などを 最終的に まで生成する必要があります。(a 2)
(a 5)
(b 1)
(b 2)
(g 5)
の後、確立され(a 1)
た のバインディングはもはや適切ではありません。これらの値への後続の呼び出しはどのように行われますか? のスコープは、への別の呼び出しにまだ適用されていますか? ここで何が起こっているのですか?*cont*
let
restart
let
restart
tree - これは本当に幅優先検索ですか
OnLisp の P.303 に幅優先探索の疑似コードがありますので、以下に示します。以下のグラフでは、最初にノード 1 を処理し、次にノード 2、3、および 4 をキューに入れ、繰り返し自分自身を再度呼び出します。次に、キューの先頭にあるノード 4 に進みます。これにより、ノード 7 と 8 がキューの先頭に配置されます。
最後に、それが通過したパスは、深さ優先検索である 1->4->7-11->12->8->3->2->5->9->10->6 になります。私はここで間違っていますか?