不思議なLisp引用のシナリオ-グラハムのLispのページ37
-
25-09-2019 - |
質問
いうグラムの著書"をLisp"と理解できな以下の例ではページ37:
If we define exclaim so that its return value incorporates a quoted list, (defun exclaim (expression) (append expression ’(oh my))) > (exclaim ’(lions and tigers and bears)) (LIONS AND TIGERS AND BEARS OH MY) > (nconc * ’(goodness)) (LIONS AND TIGERS AND BEARS OH MY GOODNESS) could alter the list within the function: > (exclaim ’(fixnums and bignums and floats)) (FIXNUMS AND BIGNUMS AND FLOATS OH MY GOODNESS) To make exclaim proof against such problems, it should be written: (defun exclaim (expression) (append expression (list ’oh ’my)))
は誰でも何が行われているのかが理解するのか。これは真剣にビス止めとは私のモデルを引用します。
解決
nconc
は、その尾を変更することにより変化させる最初の引数こと破壊的動作です。この場合、それは一定のリスト'(oh my)
は新しい尾を取得することを意味します。
。それは少し、このようなものだ。
; Hidden variable inside exclaim
oh_my = oh → my → nil
(exclaim '(lions and tigers and bears)) =
lions → and → tigers → and → bears → oh_my
(nconc * '(goodness)) destructively appends goodness to the last result:
lions → and → tigers → and → bears → oh → my → goodness → nil
so now, oh_my = oh → my → goodness → nil
'(oh my)
の修正と(list 'oh 'my)
を交換するすべてと雑貨で共有されている定数は、もはやありません。このため。 exclaim
への各呼び出しは、新しいリストを生成する(生活の中でlist
機能の目的は、ブランドの新しいリストを作成することです)。
他のヒント
の観測とメンタルヘルスモニタを引用する欠陥のある優れた一ですが、やが適用されない場合がありようにするメンタルモデルです。
第一に、覚えていることがプログラム実行します。A Lisp環境が必要 読む のプログラムのテキストデータ構造(リストの番号、メールアドレス、各文字データなどの文字列と数字).次のではありません コンパイル これらのデータ構造を用マシンコードまたは何らかの介形式です。最後に、この結果、コードが 評価 (機械コードはもちろん、ということだけでジャンプへの適切なアドレス)
う問題を作成している現在の読み及び評価の段階、(簡単のための評価者の入力はデータ構造に読んでもらいます。
検討形 (QUOTE x)
場所 x 一部のテキスト表現オブジェクトです。このシンボルのリテラルとして (QUOTE ABC)
, リストのリテラルとして (QUOTE (A B C))
, 文字列リテラルとして (QUOTE "abc")
, その他の種類のリテラルです。を読の段階では、リーダの読み込み形式としてリスト(ここでは form1 その最初の要素のシンボル QUOTE
その第二の要素は、このオブジェクト x' そのテキスト表現は x.注意をしているところ具体的にはこのオブジェクト x' 保存 内のリストを表す表現, (ある意味として保存されて 一部のコード自体.
ここでは、評価者の。の評価者の入力が form1, である。その最初の要素の form1, やると判断しシンボルである QUOTE
, を返しますの結果としての評価の要素のリスト.この重要なポイント。の評価を返します第二の要素のリストを評価することができ、そのリーダーで読む最初の実行ステージ(前編!). ことになるすべてです。 いかなくてはいけないので、非常に簡単で、大きく、新たなオブジェクトが作成されたり、既存のものがコピーされます。
そのため、き変更する"の引用リスト"には、修正 このコード自体.自己修復コードは非常に混乱は、このような背景の下で、この場合、動作は未定義です(ためANSI Common Lisp許可証の実装をコードを読み取り専用いたしました。
もちろん、上記は、単に精神的なモデルです。の実装方法は自由である、モデルなど、様々ながんの不実施のCommon Lisp合わせることにより、私の説明ものではありません集ます。もっとも、この基本的な考え方です。
共通Lisp.
はっきり言ってください
'(1 2 3 4)
上記は、 リテラルリスト. 定データ.
(list 1 2 3 4)
リスト機能が電話を返します 新しいリスト その引数として一覧です。
追加工は避けリテラルのリストが表示されます。その効果は標準化されていません。このLispを編集するすべて一定のデータを書き込みのみメモリです。このLispる一定のリストや株式をしていくためには、内なる。
(defun a () '(1 2 3)
(defun b () '(1 2 3))
A Lispコンパイラを一るリストに共通の機能.
変更があった場合には、リストで返される機能
- この変更はできませんので
- ですが変更
- このエラー
- ものですが、これまでのところ変更のリストで返される機能b
の実装には、自由というようなものにしたいんです。このように部屋のための最適化.