- ベストアンサー
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初心者にオススメなサイトなどあったら教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1>(1 . (2 . (3 . NIL))) => (dotted-print '(1 2 3)) >とこういう形にしろという問題なんですよね? 全然違います。 リストをドッティドペアとしてプリントする関数を作れという意味で、 dotted-print は、その定義されるであろう関数です。 >(dotted-print '(1 2 3)) => (1 . (2 . (3 . NIL))) は、 dotted-print にクォートされた(1 2 3) というリストを渡すと、 それを (1 . (2 . (3 . NIL))) のような ドットペア表現で出力しますという例です。 #1のプログラムを入力してから (dotted-print '(1 2 3)) のように実行すると (1 . (2 . (3 . NIL))) のように表示されるはずです。 >プログラムの説明 既に、#2でも説明されているし、多分テキストでも説明されていると思いますが、 コンス ( a . b ) は、LISP で基本的な構造です。 x が ( a . b ) の時 (car x) は、 a を取り出し (cdr x) は、 b を取り出します。 プログラムでは、引数として渡されたリストを関数内の一時変数に、car と cdr を取り出し consp (consp は、引数がコンスであるかどうかをテストする述語です)でテストし、コンスであるなら、更にdotted-print を呼び出し処理させた結果を表示しコンスでない(アトム)なら、それを表示するという処理をしています。
その他の回答 (2)
- hpsk
- ベストアンサー率40% (48/119)
【1】「上に並べたある関数」が何なのかわかりませんが,おそらくlist* でしょう. (list* が特に引数を2つとるときは,consと同じ働きをする) 【2】No.1の方のでいいと思います. > 例についても解説していただけると助かります。 たぶん,その問題が載っている本に書いてあると思いますが,Lisp(S式)の構文の定義に忠実に基づいてリストを表現すると. (1 . (2 . (3 . NIL))) になるのですが,これだと欝陶しいので (1 2 3) と書いてもよいことにしているのです.両者は書き方が違うだけで,全く同じ意味です. CL-USER(1): '(1 . (2 . (3 . NIL))) の出力結果を見てみれば実感できるかと思います. > 後lisp初心者にオススメなサイト Common Lispを一から本格的に学べるような日本語のWebページはあまりお目にかからないです. (http://user.ecc.u-tokyo.ac.jp/~t50473/onlispjhtml/ などはかなり有用ですが,中級者以上向けです) 書籍なら,Paul Graham,ANSI Common Lisp スタンダードテキスト(参考URL)をおすすめします.
お礼
回答有難う御座います。 >(list* が特に引数を2つとるときは,consと同じ働きをする) list*で実行した所同じ結果がでました。 例などの説明も助かりました。 lispについて調べると英語のサイトばかりなんですよね。 URL参考になります。本もやっぱり英語のばかりで何か良いのないか探していたところだったのでおすすめの書籍見てみます。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
【1】 「上に並べたある関数」とは、どんな関数がならんでいたんでしょうか? 【2】関数 PRINC を利用し、リストをドッティドペアとしてプリントする関数を定義してみよ (defun dotted-print ( x ) (let ((a (car x))(b (cdr x))) (princ "( " ) (if (consp a) (dooted-print a) (princ a) ) (princ " . " ) (if (consp b) (dotted-print b) (princ b) ) (princ ")" ) )) とか
お礼
回答有難う御座います。 【2】の問題ですが、これは (dotted-print '(1 2 3)) => (1 . (2 . (3 . NIL))) を (1 . (2 . (3 . NIL))) => (dotted-print '(1 2 3)) とこういう形にしろという問題なんですよね? よかったらプログラムの説明もお聞きしたいです・・・。
お礼
問題の意味も理解できてなかったんですね僕は; 大変わかりやすく説明して頂いたおかげで プログラムの意味も理解できました。 有難う御座います。