[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

[MD:572]create-fontset-from-request



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