2017-09-10 11 views
-4

私はちょうどLISPを学び始めて、次の問題を解決しようとしていました: (私はこの疑問を得た時点まで問題を解決しようとしてしまいました)LISPのnilと(nil)の差

オリジナルリスト:((BC)(RP))

このリスト出力時に、次の操作を実行した結果:

  1. CDR - ((RP))
  2. CADR - (RP)
  3. CDADR - (p)
  4. CDDADR - この操作では、答えは(nil)かnilですか? 空リストを示すので、(NIL)にする必要がありますか? 'D'は最初のものを除いてリストからすべての要素を抽出します。または、nilと(nil)の間に全く違いはありません。

ありがとうございます! NIL/(NIL)に関して

+0

あなたはそれを試してみることができます。 –

答えて

3

  • NIL自己評価記号(symbol-value自体であるシンボルのうちの1つ)です。ブール値で動作するすべての関数は、このシンボルをfalseと認識します。シーケンスまたはコンスセルで動作するすべての関数は、このシンボルを空のリストとして認識します。実際にはnilが他のコンテキスト(書式など)で使用されており、nilが意味することができる独自の関数を定義することができます(慣例により、しばしば "空"、 "ゼロ"、 "未定義"です。 ..)。評価する(list)nilを返します。

  • (NIL)は、1つの要素のリスト、NILです。

    (cons nil nil)または(list nil)を評価することによって得ることができます。あなたはこれを読んでいるかのよう

    ((b c)(r p)) 
    

    は...あなたは同じ構造を得る:あなたはそれにlengthを適用する場合は、このフォームを読んだとき、それは1

を返します。

((b . (c . nil)) . ((r . (p . nil)) . nil)) 

...と同じ構造です。と評価されています:次に

(cons ;; CAR 
     (cons ;; CAAR 
      'b 
      ;; CDAR 
      (cons 'c 
        nil)) 
     ;; CDR 
     (cons (cons 'r 
        (cons 'p 
         nil)) 
      nil)) 

、それを覚えて:

(CADR X) = (CAR (CDR X)) 

を...し、それに応じて、各コンスセルに従ってください。たとえば:

(CDADR X) = (CDR (CAR (CDR X))) 

あなたはインサイドアウトから評価し、ルート要素から始めて、それに応じてコンスセルの木に降りますその前の結果、上の各機能を適用します。 つまり、ルート要素から開始し、CDRに降りて、結果のCARを取るなどします。これをやります。結果は(NIL)またはNILではありません。

1

あなたの例が間違っている:

一覧:((b c) (r p))

Operation your example actual result 

CDR  ((r p))   ((r p)) 
CADR  r    (r p) 
CDADR  (nil) or nil (p) 
+0

明確化のためにありがとう、私はいくつかのより多くの材料を越えて私の間違いを認識した、私は質問を修正します。 – crazyCoder

+0

@crazyCoder回答からのフィードバックを受け取った後で問題を解決しないでください([cham​​eleon questions](https://meta.stackexchange.com/questions/43478/exit-strategies-for-chameleon-questions)を避ける)、または少なくともあなたの質問で何かを編集した理由(例えば、「更新:」セクション)については、少なくとも明白である必要があります。それは、他の読者が、答えや質問がさまざまな問題について話しているときに何が起こっているのかを理解するのに役立ちます。その答えがあなたの問題の一部を解決するのに役立ったのであれば、問題はありません。それは混乱するだろう。 – coredump

+0

@coredump確かに、私はStackOverflowを初めて使ったので、私はこのプラットフォーム上でどのように動作するかを知りません。先端に感謝します。次回は心に留めておきます! – crazyCoder