なぜ(atom C)でnilが返ってくるのですか?

このQ&Aのポイント
  • 初めての人のためのLISP[増補改訂版]のP.46の練習問題を解いている際に、(atom C)でnilが返ってくる理由について説明します。
  • LISPでは、(atom C)の結果はCがアトムであればnil以外の値を返します。
  • しかし、Cは(I B M)というリスト構造を持っており、リストはアトムではないため、(atom C)の結果はnilになるのです。
回答を見る
  • ベストアンサー

「初めての人のためのLISP[増補改訂版]」で

「初めての人のためのLISP[増補改訂版]」のP.46の練習問題をやっていくと (setq A nil) nil (setq B '(87 58 90)) (87 58 90) (setq C '(I B M)) (I B M) (null t) nil (null A) t (null (null A)) nil (cadr B) 58 (+ (car B) (caddr B)) 177 (cadr C) B (set (car C) (cdr B)) (58 90) (car C) I (atom C) nil となりますが、 なぜ (atom C) でnilが返ってくるのですか? "C"はアトムではないのですか?

質問者が選んだベストアンサー

  • ベストアンサー
noname#217196
noname#217196
回答No.3

Cは一度(I B M)というリストに、その一連の実行で変わってしまっているようです。直前の(car C)がIを返していますよね。

その他の回答 (2)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

(atom C) が nil になるのは C がアトムではないからですね。 なぜそこでアトムになると考えたのですか?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

atom は関数ですか?

関連するQ&A

  • LISPでatomの数を数える

    XLISPでlistの中のatomの数を数えたいんです。 下のようにlistの中のatomだけを抜き出してリストにすることはできました。 (DEFUN F1(L) (COND((NULL L) NIL) ((LISTP(CAR L))(F1(CDR L))) (T (CONS (CAR L)(F1(CDR L)))) ) ) このコードを実行すると次のようになります。 (F1 '((A B) C D (E F) G)) (C D G) 後はこれをlengthで数えるだけだと思うのですがそのやり方が分かりません。 それとももしかしてSETQで変数を設定して Tのところで値を1つずつ足していくのでしょうか?

  • emacsでcmmon lispのプログラムを作成します。

    emacsでcmmon lispのプログラムを作成します。 my-equal(A, B)= if A is an atom then if B is an atom then (eq A B) else if B is an atom then nil else if (car A)=(car B) then (cdr A)=(cdr B) else nil というのです。自分が考えたのは、 defun my-equal(x, y)= (cond ((atom x) (atom y)) (eq x, y) (atom) (t, nil) ((car x)=(car y) (cdr x)=(cdr y)) (nil)) というのでよろしいのでしょうか? また、4行目(この全文の)の意味がいまいち分かりません。

  • リストを逆順にする関数(LISP)

    「初めての人のためのLISP[増補改訂版]」のP150のリストを逆順に関数がよくわかりません。 以下がその関数です。 (defun nreverse (x) (nrev2 x nil)) (defun nrev2 (x r) (cond ((null x) r) (t (nrev2 (cdr x) x) (rplacd x r) ))) xがnilになるまで再帰を繰り返し、((null x) r) で再帰を戻りますがなぜs (rplacd x r)でリストが逆順になるんでしょうか。例えばxを(a b c)とすると x:(a b c) r:nil ↓ x:(b c) r:(a b c) ↓ x:(c) r:(b c) ↓ x:nil r:(c) ↓ rplacd (c) (b c) ↓ rplacd (b c) (a b c) ↓ rplacd (a b c) nil となるのですが、これじゃあ全然リストは逆順になりませんよね。 誰が教えてください、お願いします。 ちなみにrplacd は第一引数のcdrを第二引数に変換する関数です。

  • LISPの間違いを指摘して欲しいのですが・・・

    (setq a 1) (setq b 2) (setq c 3) (setq d 4) (setq e 5) (setq f 6) (setq g 7) (setq h 8) (setq i 9) (setq j 10) (defun wa(q r s t u v w x y z) (+ q r s t u v w x y z)) (wa a b c d e f g h i j ) 55 1から10までの合計値を求める”LISP”のプログラムを作りたいのですが上記を作ってみましたがうまくいきません。 どこが悪いのでしょうか?

  • Lispにおける最大値関数

    Lispで括弧の入れ子の中身も含めた最大値を求める関数を自分なりに作ったのですが、条件によってはうまくいきません。 なぜだか教えていただけないでしょうか? (defun max1 (n) (cond ((atom n) n) (t (if (null (cdr n)) (max1 (car n)) (progn (let ((local_max (max1 (cdr n)))) (if (> (car n) local_max) (car n) local_max))))))) > (max1 '(1 2 6 (3 4))) 6 > (max1 '(1 2 (6) ((3 4)))) >: (6) is not a REAL

  • LISPで連想配列の操作?

    (setq ary '((A . 1) (B . 2) (C . 3))) で、perlでの $ary{'A'}++; や $ary{'B'}='X' や $ary{'C'}=$ary{'A'}+5; ということをさせたいのですが、LISPではどう書くのでしょうか? (assoc 'A ary) 2 (assoc 'B ary) X (assoc 'C ary) 7 という結果が欲しいです。 また、一度にaryの内容を表示させる Data::DumperのようなものはLISPにあるのでしょうか? 処理系はCommon LISPです。

  • LISP - (BCD) から B だけを取り出したいです。

    学校でLISPを使ってのプログラミングの宿題が出ました。 初めてなので、わからないことだらけなのですが、 (A BCD)からAを取り出すには (CAR '(A BCD)) で取り出せますよね。 (BCD)からBだけ、もしくはCだけを取り出すにはどうすればよいのでしょうか? どうぞよろしくお願いします。

  • Lispの問題

    lispを最近習い始めた初心者です。以下の問題【2】つが解けないので回答をお願いします。 【1】 ;;; CONS CL-USER(1): (cons 'a 'b) (A . B) ; ドッティドペア ;;; (1 2 3) ;;; (1 . 2) 関数 CONS は上に並べたある関数の特別な場合と同じと見ることができる それは何か? 以下の ◇ は何に相当するか? ;;; (cons a b) ≡ (◇ a b) 【2】関数 PRINC を利用し、リストをドッティドペアとしてプリントする関数を定義してみよ です。【2】の問題は (dotted-print '(1 2 3)) => (1 . (2 . (3 . NIL))) が例としてあるのですが、理解できません。 例についても解説していただけると助かります。 【1】,【2】単体の回答でもどうかご教授御願いします。 後lisp初心者にオススメなサイトなどあったら教えてください。

  • Emacs-Lispでの正規表現について

    例えば、以下のようなS式を評価した場合、"11" "12" "13"がヒットすると思います。 (search-forward "1[123]" nil t) しかし、私の環境では"11"や"12"ではなく"1[123]"にヒットしてしまいます。 [ ]や?等のメタキャラクターが機能していないようなのですが、どうすればメタキャラクターを有効化できるのでしょうか? ご教授宜しくお願い致します。 環境 OS:CentOS6.0 Emacs23.1.1 Lisp-interactionモードのscratchバッファに以下の様に書いて、C-jで評価しています。 (search-forward "1[123]" nil t) 12

  • emacs lisp

    OS:ubuntu feisty fawn app:emacs-snapshot (emacs23) アンチエイリアスフォントのためにemacs23を使用しております。 実行したのは以下のとおり。 sudo apt-get install emacs-snapshot emacs-snapshot-el .emacs.el (autoload 'c++-mode "cc-mode" nil t) (add-hook 'c-mode-common-hook (lambda () (setq c-set-style "linux") c-basic-offset 4)) (setq auto-mode-alist (append '(("\\.cpp$" . c++-mode)auto-mode-alist)) cc-modeのバージョンは5.28です。 この設定を施したにもかかわらず、Syntax highlightが動いてくれません。(強調表示) どなたかご教授願えませんでしょうか? よろしくお願いします。

専門家に質問してみよう