[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [bep] learning lisp: let



井上です。

Reiko TAKAHASHI <HFC03614@...> writes:

>  さっき配信されたn高橋さんのメール、私のところだと化けてしまいます(ぐす
> っ、Mewを使ってないことがばればれじゃ(^^;;;))。
> BEPの入っていないパソコンでも、この世のお姿で見る方法ってありますか?

これが読めないのはちょっとまずいですね(内容)。
化ける原因ですが、この元のメールがeucで書かれていまして、それを示すヘッ
ダはあるのですが、最後に「BEP情報・・・」とかついている部分はなにも考え
ずにJISでつくはずなので、コードがまぜこぜになっているみたいです。
うちでは最後の「BEP情報」の部分だけ化けました。
WMailだからということではないかも知れません。うちでは読めましたが。

代理になりますが、この下に張り付けておきます。
このメールが化けたらすみません。

------
n高橋です。少し間があいてしまいました。

Reiko TAKAHASHI  (高橋玲子)writes:

> } 文字列は文字をいくつかならべて、ちょうどいい大きさの箱に入れたと考えてく
> } ださい。
> } 「?a」と書くと「a」という1文字を表すのに対して、
> } 「"a"」ではaという1文字が入ったちょうどいい大きさの箱を表します。
> } 「"ab」では?a ?b を順に入れた箱です。
> } このあいだ坂本さんの話題ででてきたconcatなどの関数では引数として文字列を
> } たくさん与えてつなげることができますが、文字を与えることはできません。
> } 文字から文字列への変換は、たとえば
> } (char-to-string ?a)
> } とすると1文字が入った長さ1の文字列"a"になるのでこれを使います。

>  ええと、難しいです……。
> 「文字」と「変数」も、また違うものなんですよね??

違うものです。文字は数値と同様、値(あたい)の一種です。数値に値を代入す
ることができないのと同じように、文字に値を代入することもできません。ま
た Emacs Lisp の「文字」は常に1文字ですが、変数(シンボル)は何文字でも
OKです。「文字」の前には?を付けます。シンボルの前には付けません。

(setq x 1) ; シンボルxに数値1を代入。成功する。
(setq ?x 1) ; 文字xに数値1を代入。エラーになる。
(setq this-is-a-very-long-variable-name 2)
  ; シンボル this-is-a-very-long-variable-name に数値2を代入。成功する。

シンボルと同様、何文字でもいいものに「文字列(string)」があります。ただ
し、「文字列」も値の一種ですので、値を代入することはできません。「文字
列」はダブルクオートでくくります。中に空白を入れることもできます。なお、
「数値」や「文字」と同様、「文字列」を評価すると自分自身になります。

(setq yz "example of string") ; シンボルyzに文字列を代入。成功する。
(setq "abc def" 314) ; 文字列に数値を代入。エラーになる。

「文字列」は「文字」の「配列」です。井上さんの説明を使うなら、「配列」
とは箱を一列に並べたものです。たとえば (setq x "abcde") とするとシンボ
ルxは、
「aという文字が入った箱」と
「bという文字が入った箱」と
「cという文字が入った箱」と
「dという文字が入った箱」と
「eという文字が入った箱」
を一列に並べたものになります。これはあくまでも「文字列」ですから、
abcde という名前のシンボルとは異なります。

(equal "abcde" 'abcde) => nil

equal の意味は読んで字のごとしです。つまり文字列 "abcde" と、シンボル
abcde は別のものです。

また、文字 ?a と文字列 "a" は別のものです。後者は「中にaという文字が入っ
た箱」です。

(equal ?a "a") => nil

「文字列」の箱の中身を知るには aref という関数を使います。書き方は、
(aref 文字列 箱番号) です。「箱番号」は最初をゼロ番目と数えます。実際
の長さより大きい箱番号を指定するとエラーになります。

(equal (aref "abc" 0) ?a) => t
(equal (aref "abc" 0) ?b) => nil
(equal (aref "abc" 100) ?x) => エラー

(setq xyz "abc")
(equal (aref xyz 1) ?b) => t
(equal (aref xyz 1) ?c) => nil
(equal (aref xyz 100) ?x) => エラー

箱の中身を変更するには aset を使います。

(setq xyz "abc")
(aset xyz 0 ?p)
xyz => "pbc"

箱の長さを自動的に伸ばすことはできません。

(setq xyz "abc")
(aset xyz 2 ?q)
xyz => "abq"
(aset xyz 3 ?e) => エラー

さて、一般に計算機の内部では、文字に数値を割り当てて使っています。で、
実は Emacs Lisp は少々さぼっていまして、「文字」と「その文字を表す数値」
を同一視しています。

# XEmacs は「文字」と「数値」を区別します。

「文字」がアルファベットの場合、「文字を表す数値」はその ASCII コード
になります。

(equal ?a 97) => t
(equal ?b 98) => t

さらに、何かを評価した結果が「文字」になる場合、それは一般に数値として
表現されます。ですから *scratch* バッファで (aref "abc" 0) C-j とする
と ?a ではなくて 97 が出力されるはずです。

>  本筋とは関係ないのですが、Lispを知らなかったら「実行」と言いたくなりそ
> うな作業を「評価」というんですね?(ほんとうは値を返してもらうのが「評価」
> なのだけれど、それイコール副作用も起こる実行になるみたいな)。

そうです。

> (setq debug-on-error t)すると、debug-on-errorにt(を評価した値だけどやっ
> ぱりt)が入るんですね?

そうです。で、「エラー起きたときに自動的にデバッガが起動するようになる」
というのが (setq debug-on-error t) の副作用です。

-- 
TAKAHASHI Naoto
ntakahas@...
http://www.m17n.org/ntakahas/

-- 
                    Koichi Inoue, ARGV
                    E-Mail: inoue@...
                    ICQ UIN: 74900690