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

Re: [bep] learning lisp: let



 r高橋です。

Reply TAKAHASHI Naoto <ntakahas@...>'s message:

} また、文字 ?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) => エラー

 私にとっていちばんの謎だったのは、「シンボル」と「文字列」があるのに、
なぜさらに「文字」が必要なんじゃ?ということでした。
でも、いろいろ説明していただいて、なんとなくわかった気がします。
「文字列」というのは、一つずつ文字の入った透明な箱(がつながったもの)の
ようなもので、箱があって初めて、別の箱とつながったり離れたり(もしかした
らほかにもいろいろ)できる。
文字自体ではなく、箱がつながっているからこそ、真ん中の文字だけを他の文字
と入れ替えたり、そういうこともできる……んですね?
「文字」が便利な点としては、たとえば1個の文字を取り出して、それがなんな
のかをチェックしたいような場合、「文字」として扱うとチェックにASCIIコード
が使えたり、比較のときにもなにかと便利だったりするのでしょうか?
(ASCIIコードについては、点字のNABCC等の話で聞いたことがあります。アルフ
ァベットや数字やコントロールコードにふつうの数字が割り当てられているコー
ド体系(?)ですよね?)

} 箱の中身を変更するには aset を使います。
} 
} (setq xyz "abc")
} (aset xyz 0 ?p)
} xyz => "pbc"
} 
} 箱の長さを自動的に伸ばすことはできません。
} 
} (setq xyz "abc")
} (aset xyz 2 ?q)
} xyz => "abq"
} (aset xyz 3 ?e) => エラー

 自動的に縮めるのはどうですか?
たとえば、(aref ...)で文字列の中身をチェックして、改行コードだったら削除
する……とかはできるでしょうか?

} さて、一般に計算機の内部では、文字に数値を割り当てて使っています。で、
} 実は Emacs Lisp は少々さぼっていまして、「文字」と「その文字を表す数値」
} を同一視しています。
} 
} # XEmacs は「文字」と「数値」を区別します。
} 
} 「文字」がアルファベットの場合、「文字を表す数値」はその ASCII コード
} になります。

 ただの数字なのか、文字を表した数字なのかは、どうやって区別されるのでし
ょう?

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

(equal 98 98) も t になりますか?


**-***-***-***-***-***-***-***-***-***-***-***-**
           Reiko TAKAHASHI  (高橋玲子)
         E-mail:  HFC03614@...
         ICQ UIN: 85924121  (Twinkle)
**-***-***-***-***-***-***-***-***-***-***-***-**