2

調子はどう?

`(1 ,(+ 1 1) (- 4 1) 4) ; '(1 2 (- 4 1) 4)

マイナス記号( "-")は演算子として扱われません(ただし、記号として扱われます;'-の代わりに#'---正しいですか?)(この部分は理解できると思います。)

しかし、なぜ、左から3番目の括弧が実際に'(-> (list...と評価されるのですか(つまり、上記の'-のようなリテラルだけでなく、リスト/式の区切り文字ですか?)インタプリタは終了を「先読み」しますか?区切り文字または単に「OK、これはリストである必要があります。右側に区切り文字がない場合、式は無効であり、それは私の問題ではありません。」と単純に言いますか?

紛らわしい質問でごめんなさい。要約すると、私の質問は、インタプリタが上記のリストをどのように正しく評価するかということだと思います。(また、用語を自由に修正してください。)

4

2 に答える 2

4
`(1 ,(+ 1 1) (- 4 1) 4)

バッククォートは読み取りマクロです。READTIMEで式を変換します。

これを行う:

 (read-from-string "`(1 ,(+ 1 1) (- 4 1) 4)")

これは、実装固有のフォームとして読み取られます。これに似たもの:

 (list* 1 (+ 1 1) '((- 4 1) 4))

CL標準では、バッククォートの解析対象は指定されていません。

したがって、上記の変換はREADERによって行われます。

次に、通常のルールを使用して評価が行われます。特にない。

LIST*最初の引数を取り、リストである最後の引数の前にそれらをconsesします。

于 2012-07-22T15:32:10.280 に答える
2

私はあなたが混乱を引き起こしているとあなたが考えていることを想像しようとしています。問題は次のとおりだと思います。

バッククォートが物事を引用している場合、括弧は単なるテキストではなく、リストを意味するのはなぜですか?

それがあなたが求めているものであるなら、その答え(大まかに言って、rainerのような人々は私よりもLispについて多くのことを知っています)は、引用はあなたが思っているほど単純ではありません。コードがlispによって読み取られるとき、それは「リーダー」と呼ばれるものによって処理されます。これにより、コードが構文ツリー(プログラムを含むツリーを形成する一連のリスト)に変換されます。

引用は、読者への次のような指示にすぎません。

`(a、b)を(list'ab)として扱います

カンマは次のように機能します

上記を無視してください-あなたが通常することをしてください

それが役立つかどうかはわかりません。私がレイナーと矛盾しているなら、彼(私はそれが男性の名前だと思いますか?)が勝ちます。私はあなたの頭の中にもっと入り込もうとしています。

ああ-もう1つ。引用は物事を「テキスト」にしません。単語をアトム(および括弧リスト)にします。したがって、「このテキストを作成する」ほど単純ではありません。

于 2012-07-22T17:45:57.847 に答える