Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2007-12-28

Practical Common Lisp (16)

| 00:21 | Practical Common Lisp (16) - わだばLisperになる を含むブックマーク はてなブックマーク - Practical Common Lisp (16) - わだばLisperになる

引き続きPractical Common Lisp 第4章4. Syntax and Semanticsを読んでメモしてみています。

Truth, Falsehood, and Equality

  • Common Lispを修得に関して重要な真偽値の扱いについて
  • シンボルNILは唯一の偽値であり、それ以外は、全部真とみなされる。
  • 非NILの値を返したい場合、正準的にはシンボルTが使われる
  • NILで唯一ややこしい事項として、アトムでもありリストでもある唯一のオブジェクトであるということが挙げられる。
  • NILは、偽を表わすとともに、空リストも表わす。
  • リーダが()を読み込む時それは、NILとして扱われる。これらは完全に相互に交換可能。
  • 前述したように、NILは定数となっているので、'NILも、'()もNILと同等ということになる。クウォートされていない場合は、シンボルNILが定数NILを参照するものとして評価される。しかし、クウォートされている場合QUOTEスペシャルオペレータは、直接シンボルNILを評価することになっている。
  • TについてもNILと同様のことがいえる。'TもTも同じ。
  • 「同じもの」という言葉は「同じものというのは、どういうことか」が定義されていなければいけないが、Common Lispでは、「同じもの」を判定するためにいくつか用意されているものがある。
  • 「=」は数が同値であるかを判定する。「CHAR=」は文字が同一であるかを判定する。
  • このセクションでは、一般的に2つのLispオブジェクトが渡された場合に、同等のものかを判定する4つの機構を紹介する。段階的にEQ、EQL、EQUAL、EQUALPがある。
  • EQは、Lispオブジェクトが同一のものかどうかを判定する。
    • 残念ながら、数と単体の文字の同一性についてどのように扱うかは処理系の判断に委ねられている。
    • (eq 3 3)は真であっても偽であってもどちらでも良いということ。(eq X X)という式で、Xに数字か単一文字かが来る場合、eqを用いて判定するのはまずい。
    • 特定の処理系では意図した通りに動くかもしれないが、全部の処理系で成り立つとは限らない。また、処理系間の違いだけでなく、同一の処理系であっても、eqの仕様が変更されるのは別段問題はないことに注意。
  • ということから、同じクラスの同一の数字、同一の文字であることを判定するには、eqlを使うことになっている。
    • (eql 1 1)は真となり、(eql 1 1.0)は、整数クラスと、浮動小数点数クラスを比較しているので偽となる。
  • EQとEQLの使い分けについての流派は2つある。
  • 「可能な限りEQを使う派」数と文字を主張比較することにはならないことを確信して使う必要がある。
    • (a)しかし、文脈上で数と文字を比較することにはならないことを主張することができる。
    • (b)EQをつかった方がほんのすこし効率的になる(同一のLispオブジェクトかどうかを判定するだけのため)
  • 「EQL常用派」
    • (a)EQが現われた時にEQが正しく使われているかを確認する必要がないので、コードが明解になる
    • (b)EQとEQLの間の「すこしの効率」の違いは、他のボトルネックの要素と比べると誤差のようなもの
  • この本で示されるコードは、「EQL常用派」コードです。
  • より広い範囲のものの同一性を判定するには、EQUALやEQUALPを使う。
  • EQLよりわずかに判定基準が広く、EQLでは偽となり比較できないものを比較するのに使う。
  • これらの基準は、過去のLispプログラマが実用上便利だなと思って定めた以上のものではないので、必要とあらば、自分自身で判定のための述語を作成して使おう。
  • EQUALにリストが与えられた場合、再帰的にEQUALを適用して内容を調べ、構造と内容物が一緒の場合、真となる。
  • また、文字列の場合は、含まれている文字を逐次比較してが全部同じならば、真となる。後述するビットベクタとパスネームストリングについても同様。
  • これら以外は、EQLに判定を投げる。
  • EQUALPはEQUALよりさらに判定基準がゆるい。
    • 文字列中の大文字と小文字を区別の規準としない。
    • 数字の数としての価値が同じならば、同じものとして扱う。つまり、(equalp 1 1.0)は真。
    • 対応要素がそれぞれEQUALP等価なリスト同士は、リストとしてもEQUALP等価
    • 対応要素がそれぞれEQUALP等価な配列同士も同じ。
    • これら以外は、EQLに判定を投げる。