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初心者にオススメなサイトなどあったら教えてください。
No.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 を呼び出し処理させた結果を表示しコンスでない(アトム)なら、それを表示するという処理をしています。
問題の意味も理解できてなかったんですね僕は;
大変わかりやすく説明して頂いたおかげで
プログラムの意味も理解できました。
有難う御座います。
No.2
- 回答日時:
【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)をおすすめします.
参考URL:http://www.amazon.co.jp/exec/obidos/ASIN/4894714 …
回答有難う御座います。
>(list* が特に引数を2つとるときは,consと同じ働きをする)
list*で実行した所同じ結果がでました。
例などの説明も助かりました。
lispについて調べると英語のサイトばかりなんですよね。
URL参考になります。本もやっぱり英語のばかりで何か良いのないか探していたところだったのでおすすめの書籍見てみます。
No.1
- 回答日時:
【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))
とこういう形にしろという問題なんですよね?
よかったらプログラムの説明もお聞きしたいです・・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数の中は文字列か数値か調べ...
-
perlで以下の記述の意味につい...
-
画面上再読み込みをさせたいの...
-
I2C接続のLCDディスプレイを使う
-
文字列をスカラー変数として認...
-
JSONで文字列が長い時
-
Application.ScreenUpdating = ...
-
VBAでPDFのコピーとリネームを...
-
ランダムリンク(ランダム表示...
-
perl 曜日を入れる
-
バッチファイル 戻り値
-
複数列を持ったリストボックス...
-
ホームページ上にある表に書き...
-
Perlでアルファベットを数...
-
プルダウンのグループ化で、ラ...
-
selectタグ内の特定のoptionの...
-
メールフォームのソースについて
-
sendmailのFROMに日本語を使う
-
セレクトメニューで2つの項目...
-
C言語にて、以下のような配列を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
16進の10進変換について
-
pythonで演算子を変数に代入す...
-
【至急!!!】python言語で本を見...
-
pythonの*
-
c言語 16進数の2進数への変換
-
awkの正規表現での最左最短マッ...
-
数値かどうかの判定方法
-
関数「exists」と「defined」の...
-
シェルで、ランダム関数を変数...
-
I2C接続のLCDディスプレイを使う
-
シェルスクリプトで、空白(ス...
-
perでメールが送信出来ない場合...
-
UWSCのSELECT文の記述方法
-
int(input("○○"))の使い方
-
switch文のエラーについて
-
pythonで改行を含めてfindする方法
-
シェルスクリプト+perl
-
PythonでUTF8の文字列をリスト...
-
少数点以下の桁数について
-
qq!!の意味を教えてください。
おすすめ情報