web-dev-qa-db-ja.com

nilでなければLisp

この質問をする必要があり申し訳ありませんが、変数がifであるかどうかをチェックする単純なnilステートメントを実行しようとしています。

(defun test (input)
  (let ((testvar (first input)))
   (if (not nil testvar)
    (do this)
    (do that))))

誰かが私に正しい構文を説明できますか?

9
JT93

nilはブール値falseと同等であるため、明示的に比較する必要はありません。

シンプルな

(if testvar
  (...)
  (...))

仕事をします。 notが必要なのは、反対をチェックする場合のみです。変数がnilではないことを確認したい場合:

(if (not testvar)
  (...)
  (...))

それとは別に、使用する可能性がある null と呼ばれる述語関数もあります。これは基本的に、指定されたリストが空かどうかを確認するためのものですが、空のリストはnilと同等であるため、機能します(リンクされたページの例が示すように):

(null '()) =>  T
(null nil) =>  T
(null t) =>  NIL
(null 1) =>  NIL

とにかく、これは基本的に問題を1層だけ上に移動します;-)

11
Golo Roden

変数がnilか、nilでないかを確認しますか?

非nilの場合:(if v ... ...)

Nilの場合:(if (not v) ... ...)

(CLには)論理的には同じであるが、意図をよりよく示す多くのバリエーションがあります:(if (null v) ... ...)上記の2番目のケースと同じですが、論理的な誤り(つまり、空のリスト)ではなく、 `() ‘を探していることを読者に示す場合があります。そして、他にもたくさんのバリエーションがあります。

1
tfb

jkiiskiは正しかった:

ちょうど(もし(testvarではない)...)または、真のブランチを最初に置いて実行します(testvar ...の場合)

0
JT93