[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]
[MD:572]create-fontset-from-request
- X-ml-count: 572
- Subject: [MD:572]create-fontset-from-request
- From: Miyashita Hisashi(宮下 尚:HIMI) <himi@xxxxxxxxxxxxxxxxxxxxxxxxx>
- Date: 11 Mar 1998 09:26:20 +0900
- X-mailer: Semi-gnus 6.0.4 (based on Quassia Gnus v0.23)
Yoshiki Hayashi <penny@xxxxxxxxxxxxxxxx> writes:
> mw32misc.elの552行目に、
> (setcdr curle fontname)
> というものがあるのですが、これは何をしているのでしょうか。
> ここでcurleの内容を変更しても、その後の行では使われていないようですし、
> whileループの最初で、(setq curle (car curll))によって、
> バインドされ直してしまうので、意味がないように思われます。
> Typoでしょうか。
Lispは関数型言語のくせに副作用を持つ言語です。
(この性質のため嫌いな人もいらっしゃる)
(って、副作用を持たない言語なんてそうはないですが)
この場合はlogfont-listへの副作用を用いています。
とくにsetcar, setcdrはとてつもなく腐った命令で、Listを強制的に
置き換える、非常にやな命令です。(って、多用している人はどこのどいつ?)
## むかし、LISPのList反転(reverse、実体はnreverse)にreplaca, replacdを
## 使って書いたら...
だけど、こういうスピードが要求されるところでは、贅沢は言っていられません。
consとか、appendとか、list関数を使って新しいリストを作るなんてことはせず、
すでにあるものを置き換えていきます。
ふつー、まともなLispの場合は、(mapcar使ったほうがいいと思いますが)
(let* ((logfont-list (logfont-list-from-request
required recommended))
(curll logfont-list)
curle
logfont fontname charset
new-fontset-list)
(while (setq curle (car curll))
(setq logfont (cdr curle)
charset (car curle)
fontname (concat name "-" (symbol-name charset)))
(set-font-from-logfont fontname logfont charset 0)
(setq new-fontset-list (cons (cons charset fontname) new-fontset-list))
(setq curll (cdr curll)))
(new-fontset name new-fontset-list))
って、書くのでしょう。
だけど、これやると、logfont-listのCONSセルがlet* formから出ると
全部無駄になって(unboundになって)、GCが発生します。:-P
logfont-listのメモリセルは割り当てたまま、使ってしまえ、という
汚い構造が、(setcdr curle fontname)に現れているのです。
まあ、どうせletの中だけの話だし、それほど汚い構造は外に出て行きませんしね。
(とはいえど、ここから関数を呼び出すと
Emacs LispのDynamic Extentのために外に漏れないわけではありません。
とはいえど、ほとんど問題ないと思いますが)
> ## いつも、どのメーリングリストにメールを流そうか迷ってしまいます。
> ## これは、meadow-developでよろしいのでしょうか。
よろしいのではないでしょうか?
from himi