1

今日、LISP の学習を始めたばかりなので、まったくの初心者です。しかし、私は他の言語での経験があります。最後の要素がないことを除いて、リストをそのまま返す関数を作成しようとしました。

もっと簡単な方法があると確信しているので、とにかくこの関数を書き直すつもりですが、私のバージョンでは非常に珍しい出力が生成されました。記録のために、私は CLISP 環境を使用しています。

(defun my-butlast (L)
    (if (null (rest L))
      nil
      (if (eq nil (my-butlast (rest L)))
         (first L)
         (cons (first L) (my-butlast (rest L)))
      )
    )
)

(my-butlast '(1 2 3 4 5))

これにより、出力が生成されました(1 2 3 . 4)

それで私の質問は、ポイントはどこから来たのですか?

また、実行しようとする(length (my-butlast '(1 2 3 4)))と、不可解なエラーが表示されます。適切なリストは 4 で終わってはいけません。これはどういう意味ですか?

4

2 に答える 2

6

.consはでcdrはないの表現で使用されNILます。例えば

(cons 1 2)

として表示されます

(1 . 2)

実行した場合、関数で何が起こるかを検討してください

(my-butlast '(1 2))

テスト(eq nil (my-butlast (rest L))は true になるため、 が返されます(first L)。これは単なる番号1であり、 を含むリストではない1ことに注意してください。次のように変更する必要があります。

(if (eq nil (my-butlast (rest L)))
    (list (first L))
    (cons (first L) (my-butlast (rest L)))
)

ちなみに、 と書く方が慣用的(null (my-butlast (rest L)))です。

于 2013-08-15T05:41:56.657 に答える
1

あなたの基本的なケースを信じてやってみてください(私がLispを書いてからしばらく経ちました):

(list (first L))

(最初の L) はリストを返さず、ある要素から別の要素へのコンスは、見ている構造を作成します。基本的に、リンクされたリストは [3|->] [4|0] ではなく [3|4] で終わっています。

于 2013-08-15T05:39:51.813 に答える