2010年1月24日日曜日

Lisp Quote Backquote (2)

体調が戻ってきたので、Lispいじりを再開。

と思っていたのですが、Lispにたどりつく前の調べもので終わってしまった。

でも、ずっと気になっていたところなので、スッキリ。


;;;; Quote, Unquote and Back quote

;; ところで、クォートとバッククォートって、印刷物で
;; みると、いつもどっちがどっちだかわからなくなって
;; しまう。Infoファイルとかだと、`hoge'のように、バッ
;; ククォートの方が先にくるんですね。だから、前がバッ
;; ククォートで、後がクォート。これ自体、なんかテレ
;; コに命名した方が自然じゃない?という気がする。

;; さらに、印刷のグリフだと後のグリフは、Writing
;; Directionに対して「バック」しているように見える
;; ので、それがバッククォートと思いたくなってしまう。
;; だけど、実はクォートなんですね。少なくとも大抵の
;; Lispの本ではそうです。

;; この違和感がどこから来るのか調べてみよう。

;; 英語の用法をしらべてみると、やっぱり普通は、引用
;; をはじめるところをquoteと言うようだ。そして、引
;; 用のおわりをunquoteと言う。unquoteは日本語の「括
;; 弧閉じ」かな。

;; 例:
;; MacArthur said, quote, I shall return, unquote.

;; quote unquote は日本語の「括弧」、「括弧閉じ」み
;; たいな言葉であり、総称的でもあるので、quote、
;; unquoteと言ったときの具体的な文字はいろいろあり
;; うるわけです。''もあり、""もあり、()もあり、{}も
;; あり、ですね。なので、"Lisp Quote Unquote"は、
;; 「Lisp () 」というのがひとつの解釈ですね。なるほ
;; ど。ついでなので、"Lisp Quote Unquote"の解釈につ
;; いてもう少し探ってみよう。

;; まず、そもそもquote-unquoteというのは、「いわゆ
;; る」という用法があるので、「いわゆるLispについて」
;; というものが別の解釈。

;; もうひとつがBBC-Radioの長寿クイズ番組"Quote
;; ... Unquote"。過去の名言や発言をパネラにお題とし
;; て出して、それが誰が言ったものかを当てたりする番
;; 組のようだ。この番組に因むのが3つ目の解釈。

;; 閑話休題。

;; では、バッククォートって何なのか、どこから来たの
;; か。それはどうやらASCIIコードと印字アプリ(Tex等)
;; がからんでいそうだ。これらを調べる準備として、
;; Unicodeではどうなっているか、確認しておこう。

;; まずUnicodeではQuotationは「同じグリフでも言語に
;; よって用法が違うもの」としている。その結果、ひと
;; つのグリフについて用法をオーバロードさせるという
;; ルールにしている。

;; それを前提として英語ではどうなっているか調べてみ
;; る。ここでは、wide characterは取り扱わない、とい
;; う制限をかけて進めよう。wide characterまで取り扱
;; うと結構なボリュームになるが、こと英語に関して得
;; られる知見は少ないと思うので。

;; まず、英語において推奨、というか、好ましい引用文
;; 字は、次の組み合わせだ。

;; U+2018 引用対象 U+2019

;; フォントがUnicodeに対応していれば、次の行でグリ
;; フを確認できます。

;; ‘ 引用対象 ’

;; 名前はそれぞれ次のよう。

;; ‘ : U+2018 : left single quotation mark
;; ’ : U+2019 : right single quotation mark

;; そうするとLispのquoteで使っているあの文字は何か
;; というと、

;; ' : U+0027 : apostrophe (= apostrophe-quote)

;; なんですね。では、Lispのback quoteで使っているあ
;; の文字は何かというと、

;; ` : U+0060 : grave accent

;; であり、quotation markではなくaccent markなんで
;; すね。ちなみにgrave accentって何ですか、というと、
;; 「抑音アクセント」のことのようです。

;; Unicodeには、どうやらback quoteという概念は無い
;; ようです。さて、ASCIIコードと印字アプリ(Tex等)に
;; 進もう。

;; まず、ASCIIコードにて、'と`は何なのか。

;; まず初版たるASA standard X3.4-1963によると、基本
;; 的には、printable charactersは、コードとグリフの
;; 対応だけがあり、名前は付いていない。ただし、
;; U+0027相当(0x27)については、(APOS)という注釈があ
;; るので、これはapostropheを意図したものなのだろう。
;; そしてなんと、U+0060相当はまだ未定義なんですね。
;; アルファベット小文字も未定義。ASCIIコード自体何
;; 度か改訂されて今のものになったようだ。そのあたり
;; の経緯は、

;; The Evolution of Character Codes, 1874-1968
;; http://www.pobox.com/~enf/ascii/ascii.pdf

;; に詳しい。この文書、とても面白い。一杯やりながら
;; 読みたいたぐい。

;; さて、ANS、ECMA、ISOでごちゃごちゃやって、1967年
;; に今の形にかたまったようだ。それは正式には、ANS
;; (Americal National Standard)ではなく、USAS (USA
;; Standard) として規格化されたらしい。(X3.4-1967)

;; X3.4-1967においては、Lispにおける
;; quoteとbackquoteは、

;; ' : 0x27 : apostrophe
;; ` : 0x60 : (no legend)

;; という状態です。

;; さて、先の歴史文書ではどうだろう。そこでは、
;; 0x27は、apostropheとacute accentがoverloadされて
;; おり、`はgrave accentとのみある。

;; ちなみに、acute accentは、「揚音アクセント」。本
;; 来のグリフは、grave accentと左右対称なものです。

;; これでASCIIコードを確認できた。

;; 次は印字アプリとの関係です。これはWikipediaに詳
;; しい。

;; http://en.wikipedia.org/wiki/Quotation_mark_glyphs

;; 要約すると次のとおり。

;; 昔のPCのフォントは、スクリーン用も印字用も0x27の
;; グリフは垂直ではなく、right single quote markの
;; ように傾いていた。すると引用が、’hoge’ のように
;; なり格好わるい。これをマシにするために、0x60が転
;; 用されたのだ。`hoge’とすると多少見栄えが改善され
;; たということ。

;; これで経緯はわかった。そして、経緯の中では、
;; 0x27をsingle quote markと呼ぶ例をみかけた。(あく
;; までapostropheにoverloadされたものとしてです)
;; 0x60を back quoteと呼ぶ例はみかけなかった。

;; ここからは推測だが、次のような経緯ではないか?

;; ASCIIコードの初版では、0x60 は未定義であり、
;; single quote markとして使えるのは、0x27しかなかっ
;; た。なのでこれを代用した。そしてこれを"Quote"と
;; 呼ぶようになった。しかし、もともと0x27は
;; apostropheなので、垂直ではなく’というように傾い
;; ているフォントが多かった。そんな状況で、0x60が
;; grave accentとして導入された。するとそれをleft
;; single quotation markとして転用するというアイデ
;; アがでた。傾きが逆なので具合がよい。さて、rightの
;; 方を0x27をつかってすでに"Quote"と呼ぶ慣習になっ
;; ていた。そのため新たに加えた0x60は、その逆傾斜である
;; ということで"Back Quote"と呼ぶ慣習となった。

;; ふう。writing directionがleft to rightなのに、な
;; ぜ、leftをback quote、rightをquoteと呼ぶのか?と
;; いうことについては、何となく合点がいった。

;; 違う観点で、もう少しだけ調べよう。

;; Common Lispでは、確か文字コードを指定していない
;; はずだ。その観点で、この話題を調べてみよう。
;; Common LispはCLtL2に限ることにする。

;; まず、CLtL2はASCIIというかISO6937/2というかを意
;; 識して、標準文字を定義している。これを文字レパー
;; トリと言う。しかし文字コードは実装の自由度として
;; おり、指定していない。

;; ところで、ISO6937/2では、全ての文字に文字ラベル
;; と記述(意味または備考と理解すればよさそう)が定義
;; されており、CLtL2もそれに準拠している。前述のと
;; おりCLtL2は文字コードは指定していないので、CLtL2
;; における文字レパートリの定義はグリフ中心となる。
;; ISO6937/2から文字コードを抜いたものと考えればよい。
;; 具体的には次のとおり。

;; SP05 ’ apostrophe
;; SD13 ‘ grave accent

;; せっかくなので、文字ラベルの読み方を確認しよう。

;; S P 0 5
;; | | | |
;; | | | |__ for alphabetic characters:
;; | | | | odd digit = small letter;
;; | | | | even digit = capital letter.
;; | | | |__ If N or S in first position:
;; | | | no special meaning.
;; | | |
;; | | |__ for alphabetic characters:
;; | | | 0 = etter without diacritical mark;
;; | | | 1 to 3 = letter with diacritical mark above it;
;; | | | 4 = letter with diacritical mark below it;
;; | | | 5 and 6 = special form.
;; | | |__ If N or S in first position:
;; | | no special meaning.
;; | |
;; | |__ For alphabetic characters:
;; | | A to Z = the respective letter of the Latin alphabet.
;; | |__ If N in first position:
;; | | D = digit;
;; | | F = fraction;
;; | | S = subscript or superscript.
;; | |__ If S in first position:
;; | A = arithmetic sign;
;; | C = currency sign;
;; | D = diacritical mark;
;; | P = punctuation mark;
;; | M = other symbol (miscellaneous)
;; |
;; |__ For all graphic characters:
;; L = Latin alphabetic character;
;; N = numeric graphic character;
;; S = special graphic character.

;; ちなみに、ISO6937/2では文字コードも定義されてい
;; るので、そのとおりに処理系を実装すれば、

;; SP05 ’ apostrophe => 0x27 '
;; SD13 ‘ grave accent => 0x60 `

;; となる。

;; さて、CLtL2の文字の定義においては、SP05がquoteで
;; あるとか、SD13がback quoteであるという話題はない。

;; それらがquoteであるとかback quoteであると成るの
;; は、「マクロ文字」の定義においてである。

;; ああ、そうなのだ。これは「文字」の定義の話ではなく
;; 「マクロ文字」の定義の話なのだ。
;;「#」を「シャープ」(文字定義)ではなく、「ディスパッチ」
;; と考えて(マクロ文字定義されて)、時にはその
;; ように呼ぶように、「’」を「アポストロフィ」ではなく
;; 「クォート」と考えて(定義されて)、時にはそのよう
;; に呼んだり、「‘」を「グレイブ アクセント」ではなく
;; 「バッククォート」と考えて(定義されて)、時にはそのよう
;; に呼んだりすると理解しておけばよいのだ。

こつこつ、再開。

0 件のコメント: