Lisp でシンボルが数値になり得るかどうかについて考えたことは一度もなかったので、今日はそれをいじってみました。
> '1
1
> (+ '1 '1)
2
> (+ '1 1)
2
> (define a '1)
> (+ a 1)
2
上記のコードはスキームですが、Common Lisp と Clojure でもほぼ同じようです。 1と引用された1の間に違いはありますか?
Lisp でシンボルが数値になり得るかどうかについて考えたことは一度もなかったので、今日はそれをいじってみました。
> '1
1
> (+ '1 '1)
2
> (+ '1 1)
2
> (define a '1)
> (+ a 1)
2
上記のコードはスキームですが、Common Lisp と Clojure でもほぼ同じようです。 1と引用された1の間に違いはありますか?
Common Lisp では、'1 は (QUOTE 1) の短縮形です。評価されると、 (QUOTE something ) は評価されていない何かの部分を返します 。ただし、評価される 1 と評価されない 1 の間に違いはありません。
したがって、読者には違いがあります: '1 は (QUOTE 1) と読み、1 は 1 と読みます。しかし、評価されると違いはありません。
数値は自己評価オブジェクトです。そのため、たとえばリストの場合のように、引用することを心配する必要はありません。
記号は任意の文字列から作成できます。名前が1文字の記号が必要な場合は、次の1
ように言うことができます。
(intern "1")
これは印刷|1|
され、それを入力する別の方法を提案します:
'|1|
引用符は、式が後で評価されるのを防ぎます。たとえば、次のリストは適切なリストではありません。
(1 2 3)
これは、Lisp が 1 を関数として解釈するためですが、そうではありません。したがって、リストを引用する必要があります。
'(1 2 3)
数値などの非常に単純な式を引用すると、Lisp は事実上その動作を変更しません。
ウィキペディア: Lispを参照してください。
実際、それらは非常に異なっています。'1
ただし、 とまったく同じ(quote 1)
です。(car ''x)
シンボル 'quote' に評価されます。
1
は S 式であり、数値 1 のデータの外部表現です。それ1
が「数値オブジェクト」またはそのオブジェクトに入る S 式であると言うことは、どちらも受け入れられます。1
は実際の数値オブジェクトの外部表現であるとよく言われます。
(quote 1)
は別の S 式であり、最初の要素が記号 'quote' で 2 番目の要素が数字の 1 であるリストの S 式です。これは、関数とは異なり、構文キーワードはオブジェクトとは見なされません。それらは言語に評価されません。
ただし、どちらも同じデータムに評価されるオブジェクト (データ) の外部表現です。外部表現が である数値ですが1
、それらは同じオブジェクト、同じコード、同じデータ、同じものではないことは間違いありません。それらはまったく同じものに評価されます。数値はそれ自体に評価されます。それらが同じであると言うことは、次のように言うことです:
(+ 1 (* 3 3))
と
(if "Strings are true" (* 5 (- 5 3)) "Strings are not true? This must be a bug!")
「同じ」か、そうでないか、どちらも異なるプログラムであり、たまたま同じ値で終了するだけです。Lisp フォームもプログラムでもあり、フォームはデータムであり、プログラムでもあります。覚えておいてください。
また、自己評価データが入力されたときに本当に記号ではないことを示す便利なトリックを教えられました。
(let ((num 4))
(symbol? num) ; ====> evaluates to #f
(symbol? 'num) ; ====> evaluates to #t
(symbol? '4) ; ====> evaluates to #f
(symbol? '#\c) ; #f again, et cetera
(symbol? (car ''x)) ; #t
(symbol? quote) ; error, in most implementations
)
自己評価データは、それ自体を真に評価します。それらは、ある種の「事前定義されたシンボル」ではありません。
指摘されているように、数値はそれ自体に評価されるため、違いはありません。これは、次を使用して確認できますeval
。
(eval 1) ;=> 1
ちなみに、これは数字に限ったことではありません。実際、Common Lisp では、ほとんどのものがそれ自体に評価されます。ただ、数値、文字列、記号、リスト以外が評価されることは非常にまれです。たとえば、次のように動作します。
(eval (make-hash-table)) ;equivalent to just (make-hash-table)
Lisp でquote
、次の式が評価されないようにします。'
の省略形ですquote
。その結果、'1
と同じ(quote 1)
です。
しかし、Lisp では、シンボルを数値にすることはできません。つまり、'abc
はシンボルですが、'123
(評価されて)シンボルではありません。これは Lisp の設計が間違っていると思います。もう 1 つのケースは、ブール式として使用できるだけでなく、使用することもできます#t
。#f
Lisp では、アポストロフィーはシンボルが評価されるのを防ぎます。数値の前にアポストロフィを使用することは禁止されていません。数値はそれ自体を表しているため、必要ありません。ただし、他のリストと同様に、適切な関数呼び出しに自動的に変換されます。インタープリターは、これらの数値がその値と一致すると見なします。