• ベストアンサー

lispでQUOTEの意味

lispを使ってプログラムをしているのですが、 (caar '('A))をエラーになると予想しながら実行したら >(caar '('A)) >QUOTE となりました。 なぜエラーにならなかったのですか? また、QUOTEはどういう意味ですか? よろしくお願いします。

noname#210749
noname#210749

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

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

この辺は Lisp の基本. Lisp では 'なんとか と入力したら, それは自動的に (QUOTE なんとか) の形になります. それが何故かと聞かれたら「デフォルトでは ' がそうなるように設定されている」から, としか言いようがない. ちなみに QUOTE は「引数をそのまま返す」スペシャルフォーム. 「また」以降は, Lisp における「評価」を理解していれば出てこないはずの質問です. まず, Lisp は「ユーザーからの入力を読み込んで評価し, その結果を出力する」という動作 (read-eval-print ループ) を繰り返します. 「'Aを実行すると実行結果はA」というのは 1. 'A と入力すると 2. 自動的に (QUOTE A) となり 3. それを評価したら A になるので 4. 得られた結果である A を表示する という動作の結果です. また, 「(car 'A)を実行するとエラー」も 1. (car 'A) と入力すると 2. 自動的に (car (QUOTE A)) となり 3. それを評価するんだけどまず引数の (QUOTE A) が評価されて A になり 4. この A に対して car を適用する 5. はずなんだけど car はリストに対してしか適用できないのでエラー ということです.

noname#210749
質問者

お礼

回答ありがとうございます。 Lispでは、 自動的に’Aが(quote A)になることがよくわかりました。

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

'A => (QUOTE A) です。 そこから (CAAR '('A)) =>(CAR 'A) =>(CAR (QUOTE A)) =>QUOTE ということでは無いでしょうか。

noname#210749
質問者

お礼

理解することができました。 ありがとうございました。

noname#210749
質問者

補足

回答ありがとうございます。 ’A => (QUOTE A) とリストになるのは何故ですか? また、 'Aを実行すると実行結果はAですし、 (car 'A)を実行するとエラーでした。 なので、 carのときは'Aは(QUOTE A)に変換されていません。 なぜ、 caarのときは'Aが(QUOTE A)に変換されるのですか?

関連するQ&A

  • quote recap

    「quote recap」という語句は、日本語にするとどういう意味なのでしょうか? 「AはBのreplicateであって、Cのquote recapではない」という文章で使われていました。

  • LISPプログラムをexeにしたい

    UbuntuでLISPプログラムを書いています。 eclというのを使ってコンパイルすることでスタンドアロンで実行できるファイルはできました。 でもこれはLinux上で実行できるものでWindowsでは使えません。 LISPで書いたプログラムをexeファイルにしてWindows上で使う良い方法はあるでしょうか? もしWindows用のソフトを使えば簡単だと言うならWindowsを使った方法でも構いません。

  • lispのロードコマンド

    初心者的な質問ですいません。入門書やWebで調べたのですが見つからなかったです。 私は現在Lispの実行環境にCLISPを使っています。ですがCLISPではなくどの処理系でいいのですが、コマンドラインに直接プログラムを書くのではなく、ファイルに書いてあるプログラムをロードして実行してくれるようなコマンドはありませんか? 本にはインデントがついた複数行のプログラムがあるのですが、私のほうではそういったプログラムを書くことが出来ません。よろしくお願いします。

  • Emacs Lisp: consセルと引用符?

    お世話になります。 Emacs Lispについて勉強しています 今は、リスト、consセルについて勉強しています。 以下、拙い質問になるかと思いますが、よろしくお願いします。 Lisp Interactionモードのバッファに、 '(1 2 3) というリストを書いて行末でC-jを押下すると (1 2 3) という式を返します。 しかし、 (1 2 3) という式を書いて行末でC-jを押下すると Debugger entered--Lisp error: (invalid-function 1) というエラーになります。 これは、1が関数、2と3が引数として評価されるからですね。 さて、リストではなく「consセル」を作るとします。 (1 . 2) と書いてC-jを押下すると、やはり Debugger entered--Lisp error: (invalid-function 1) というエラーになります。 '(1 . 2) であれば (1 . 2) と、正しくconsセルが出来ます。 '(1 . nil) であれば (1) というリストを返します。 これは、cdr部がnilであるconsセルはリストになるからですね。 では、3と、「1とnilからなるリスト」のconsセルを作って、結果的に(3 1)というリストにしようとします。 '(3 . '(1 . nil)) この場合は、予想に反して (3 quote (1)) となります。 '(3 . (1 . nil)) であれば、 (3 1) となります。一方、 (3 . (1 . nil)) とすると、 Debugger entered--Lisp error: (invalid-function 3) となります。 まとめると、 3と、「1とnilからなるリスト」のconsセルを作って、結果的に(3 1)というリストにしようとした場合は、 '(3 . (1 . nil)) のように外側のconsセルはクォートし、内側のconsセルはクォートしない、ということになりますね。 このクォートの振る舞いの違いはなぜでしょうか。 よろしくお願いします。

  • LISPで例外を発生させるには?

    LISPで例外を発生させるにはどうしたらよいのでしょうか? もしくは、プログラムを強制終了させたいです。 エラー発生時に警告を出して止めるのですが、後から捕捉できる形式にできたらよりベターです。 VBのraise Cでいう exit; です。

  • Lisp

    Lisp 今リリカルLispをやっているのですが、 詰まってしまって答えがないので困っています。 問題は (s n)を評価すると1+2+・・・+nが返るように関数をsiを定義する(ただしsは次のように定義されている define (s n) (si n 0) ) という問題です。 一応自分なりに考えたのが (define si (lambda (n x) (if (= n 1) (x) (si (- n 1) (+ n x))))) なんですが無限ループのようになるのかこれを実行すると固まって落ちてしまいます。 ご指摘よろしくお願いします。

  • Your quote is readyって どういう意味?

    迷惑メールなのですが、 Your quote is ready というのが来ました。 ウイルスだといけないので削除しましたが、 どういう意味なのか、ちょっと気になりました。 教えて下さい。

  • lispでの文字読み込み

    lispでの文字読み込み 以下のようなテキストをcommon lispで読み込んでいます。 --a.txt-- あああ いいい ううう ええええ --------- このような感じで。 (let (in str) (with-open-file (in "a.txt" :direction :input) (setf str (read-as-string in nil)) ) ) このときに、いいいの下の空行を読み込むにはどうしたらよいでしょうか? 読み込むというか、空行があることが検出できればいいんですが。

  • Emacs Lisp: 関数に引数が渡せない?

    お世話になります。 ----------------------------------------- ; -*- lisp-interaction -*- ; このファイルはtest.elisというファイル名で、そのファイルを開いたバッファで実行 (buffer-name) ;;; ミニバッファに以下のように表示される ;;; "test.elis" (buffer-name "test.elis") ;;; ★引数を与えるとそのバッファ名を返すはず ;;; エラーになる ;;; Debugger entered--Lisp error: (wrong-type-argument bufferp "test.elis") (get-buffer "test.elis") ;;; ミニバッファに以下のように表示される ;;; #<buffer test.elis> (buffer-file-name) ;;; ミニバッファに以下のように表示される ;;; "/home/userName/test.elis" (buffer-file-name "test.elis") ;;; ★引数を与えるとそのバッファのファイル名を返すはず ;;; エラーになる ;;; Debugger entered--Lisp error: (wrong-type-argument bufferp "test.elis") ----------------------------------------- Emacs Lispの勉強として、上のようなファイルを開いて、各関数の括弧綴じ)の後ろでC-x C-eとタイプして実行し、挙動を調べています。 ★をつけたbuffer-nameおよびbuffer-file-name関数は、それぞれ引数を渡したバッファ名、および、そのバッファのファイル名が返ると思われるのですが、実際には上記のようにエラーになります。 これはどうしてでしょうか。 Emacsは23.4.1を使っています。 よろしくお願いします。

  • Lispのリストの破壊

    Lispではリストの破壊を行う関数と非破壊的関数がありますがどのようなときにそれらを使い分ければいいのでしょうか? それぞれについてプログラムを行う上でどうゆう利点、欠点があるか知りたいです。

専門家に質問してみよう