2011-07-28 1 views
4

Lispの、短所と(数。数)の違い

(cons 2 3) 

とLispで

'(2 . 3) 

の違いは何ですか?

+0

それは2番目の式のピリオドかコンマですか? –

+0

@David:回答ピックを変更することができるかどうか疑問に思った。私はダンリーが私のものよりも良いのが好きです。 –

答えて

1

'(2 . 3)は点線のペアです。

(cons 2 3)もドット付きペアを作成します。だから、これらは同じものに評価されるべきです。

したがって、1つはドットペアのリテラルであり、もう1つはドットペアを作成します。

+0

実際には 'cons'はsetf可能な場所を生成し、' quote'は修正してはいけない定数値を生成する点で違いがあります。 – thodg

10

REPLで同じ値に評価されていても、まったく同じではありません。短所細胞を破壊変性されたこれらの例を考慮してください。これに比べ

TEST> (defun literal-cons() 
     (let ((cons '(1 . 2))) 
      (incf (cdr cons)) 
      cons)) 
LITERAL-CONS 
TEST> (literal-cons) 
(1 . 3) 
TEST> (literal-cons) 
(1 . 4) 
TEST> (literal-cons) 
(1 . 5) 

:最初のバージョンで

TEST> (defun non-literal-cons() 
     (let ((cons (cons 1 2))) 
      (incf (cdr cons)) 
      cons)) 
NON-LITERAL-CONS 
TEST> (non-literal-cons) 
(1 . 3) 
TEST> (non-literal-cons) 
(1 . 3) 

は、この、このように(コード自体にliteralコンス・セルを変更します自己修正コードです)。 2番目のバージョンでは、コンスセルはリテラルではありません。コードが呼び出されるたびに生成され、この新しいコンスセルのみが変更されます。

TEST> (function-lambda-expression #'literal-cons) 
(LAMBDA NIL 
    (DECLARE (CCL::GLOBAL-FUNCTION-NAME LITERAL-CONS)) 
    (BLOCK LITERAL-CONS (LET ((CONS '(1 . 5))) (INCF (CDR CONS)) CONS))) ;; notice the '(1 . 5) 
NIL 
LITERAL-CONS 

破壊的な操作を使用すると微妙なバグが発生する可能性があるため、コード内のこのようなリテラルオブジェクトには注意が必要です。これはコンスセルから構築されたリストリテラル('(1 2 3)(list 1 2 3))にも影響します。 HyperSpecから

リテラルADJ。 (オブジェクトの)直接プログラムで参照されるよりもむしろ です。つまり、データとして 見積もりフォームに表示されます。オブジェクトが自己評価オブジェクトの場合は、引用符なしのデータとして と表示されます。 ``のフォーム(短所 "1" '( "2"))、式 "1"( "2")、および "2" はリテラルオブジェクトである。'」

+1

あなたの 'literal-cons'関数の振る舞いは、あなたの実装に特有でなければなりません。 SBCLでは、結果はあなたの '非リテラルコンス 'として得られます。これは私がそれについて新しい質問を開いたほど興味があります:http://stackoverflow.com/questions/20342793/is-this-an-implementation-specific-behavior – johnbakers

+0

@OpenLearner Right;リテラルデータを変更した結果は、標準によって定義されていません。なんでも起こる可能性がある。私はこの答えに示されている例はよくあると思いますが、SBCLはここで面白い何かをしているようです... –

0

(1 . 2)でありますconsセルのs式の構文。コンスセルはcarとして1、cdrとして2を持ちます。

'(1 . 2)先頭に引用符をつけたものは、(quote (1 . 2))の短い表記です。 quoteは、評価者に囲まれたフォームを評価しない(!)ように指示し、そのまま返すように指示します。この引用されたフォームの値はフォーム自体に過ぎません。 quote:評価しないでください。 Common Lispでは、これは定数のリテラルデータと考えることができます。

(cons 1 2)はLispの前で機能consを持つフォームと二つの引数です:私たちは、このフォームを評価した場合は1と2、機能consを定義することにより、引数1と2 cons戻り、新たなコンスセルで呼び出されますその引数はcarcdrです。したがって、(cons 1 2)は、評価するたびに新しいコンスセルを返します。

2

両方とも同様の構造を持つオブジェクトです。つまり、両方ともコンスセルであり、CARの位置に2つ、CDRの位置に3つあります。

主な違いは、 '(2.3)は定数であり、(cons 2 3)は新しいコンスセルを生成するということです。

(defun a() 
    (let ((v (cons 2 3))) 
    (incf (car v)) 
    v) 

(defun b() 
    (let ((v '(2 . 3))) 
    (incf (car v)) 
    v) 

かなりの数の実装が返されます「(3 3)」(4 3)などのように:あなたは以下のとおり2(類似見て)機能を取る場合は、これらの間の区別が明らかになるはずですあなたは電話をし続けます。b。

0

これらは同じではなく、同じです。

simbol quote( ')は「これを評価することなくこのリストを作成する」という関数です。 例: '(* 2 2);

関連するペアを作成し、これだけを作成します。 例:リストを作成するために、リストを作成します(* 2 2) (list(* 2 2) (1 2 3 4));作成する(a 1 2 3 4)

作成した2つの関数( ')の前にリストを作成するだけであり、cons関数は "itens"という名前の関連するペアを作成するだけなので、 は引用符('あなたがその機能に与えたもの。

関連する問題