Clozure CL に乗り換えたった。

どもです。
プールへ1時間行ってきました。タイミングが悪く,
実質35分くらいしか入ってられなかったどす。
こないだターザンを立ち読みしていたら,水泳についてちょっこす記述があり,
その中で運動強度によってレベル分けされた表がございまして,
レベル4を楽にこなせる頃には,君の体型は変わっているはずだっ!!
みたいなことが書いてあったので,早速鵜呑み。
とりあえず,レベル1からだなというこで,先週は,25m10本を30秒インターバルで
やってきました。意外に楽にこなせた。ま,ゆっくりクロールなので楽っちゃー楽。
んで,今週になると,すでにターザンの記事の詳細を思い出すことができなかったので,
20秒インターバルで25mを20本くらいやればいいだろうと。
プール入る直前にヴァームをがぶ飲みして,気合いを入れて,挑戦。
んで,やってきたことにはやってきたんですが,おでぶちゃんのワタシにはとてもしんどい。


わたしゃ超初心者なので,泳ぎ始めは壁を弱めに蹴って,さらには,そこで
蹴伸びを少ししてからプルをはじめるのです。
15本目を迎える頃には,「あ,ずっと蹴伸びしていたい。プルしたくない。」
と思うくらいにしんどくなりまして,また,壁際で,20秒といえど,
休憩しているときに,普段よりもゴーグルが曇ること曇ること。
そして暑さを感じまくり。
とりあえず,このレベルだなと。しばらくこのメニューを続けようと思います。

ccl にお乗り換え。

帰省したときに,ccl を入れ,よさそうだったのです。
ほいで,sbcl はちょくちょく落ちる。ま,windows バージョンだから
しゃーないし,使い方もわるいんやろ。
なので,sbcl よりは,Windows をサポートしているだろうと思われる
ccl を入れました。
んで,ちょっこす困ったことがいくつかあったので,そのメモ。

ホームディレクトリについて

Cygwin をまるっとインストールして使わせてもらっているワタシは,
Cygwin の方のホームディレクトリを使いたい。
しかし,デフォルトでは,「Documents and Settings/whitypig」になっている。
ググると,以下のページに1つの解決方法が。サンクス!
aikotobaha.blogspot.com/2011/05/clozure-cl.html


どうやら,USERPROFILE 環境変数を変更すればいけるみたいだが,
害もあるようだ。
んで,grep ったりしてソースを見てみると,
user-homedir-pathname 関数内で,(get-user-home-dir (getuid))
している。
Windows XP 環境では,(getuid) => 0 となった。
よくわからんが,たぶんこのへんだろうというところを,
level-1/linux-files.lisp から抜粋。

(defun get-user-home-dir (userid)
  "Look up and return the defined home directory of the user identified
by uid. This value comes from the OS user database, not from the $HOME
environment variable. Returns NIL if there is no user with the ID uid."
  #+(or windows-target android-target)
  (declare (ignore userid))
  #+windows-target
  (dolist (k '(#||"HOME"||# "USERPROFILE"))
    (with-native-utf-16-cstrs ((key k))
      (let* ((p (#__wgetenv key)))
        (unless (%null-ptr-p p)
          (return (get-foreign-namestring p))))))
  #-windows-target

今のワシでは理解できんが,HOME も USERPROFILE もみてそう?
けど,HOME は Cygwin のホームディレクトリに設定しているので違う?
あの表記,みたことねー。
なにわともあれ,.emacs に以下を追加。
Windows環境変数を直接変更するわけではないはずだから大丈夫でしょう。

(setenv "USERPROFILE" "e:\\cygwin\\home\\whitypig\\")
CL-USER> (user-homedir-pathname)
#P"e:/cygwin/home/whitypig/"

やったね。

追記 (2012/01/23 (Mon) 18:21)

今朝,わからんとか言っていたやつ,わかった。ので,追記。
結論からいうと,「#|...|#」は,コメントだったお。
http://maclisp.info/pitmanual/syntax.html
「#|(Sharp Vertical Bar)」 から引用させてもらいます。

An expression of the form "#|...|#" is a comment. Also, these comments
nest correctly. So "#|...#|...|#...|#" terminates after the second
"|#" rather than the first. Thus the expression

    (TIMES 3.14159 #|This is an approximation to pi|# 2)

is parsed by READ the same as (TIMES 3.14159 2)

Usage of this syntax for comments is rare. Most users still prefer
that comments be clearly marked on each line by a semicolon. Its
introduction into the language was intended primarily to allow
functions to be commented out without changing their indentation.

行中で使用できるというのは,C,C++ で言うところの「/*...*/」みたいなもんかな。


で,

CL-USER> '(#||"HOME"||# "USERPROFILE")
("USERPROFILE")

となると。
そのあとのコードについてもよくわからんけど,
環境変数 USERPROFILE の値を取得してごにょごにょして返すと。
なので,ccl on Windows では,ホームディレクトリを決定するのに,
環境変数 HOME ではなくて,USERPROFILE が使用されるということですかね。

ディレクトリの移動。

これまで,ディレクトリ移動の方法がわからず,
変数 *default-pathname-defaults* に setf していたわけですが,
ホームディレクトリの問題を解決するために
ソースみてたら,もっと簡単な方法がみつかりました。
その名も,cwd 関数。ふつーじゃん。
他にも,truname 関数とか,current-directory 関数とかを知ったよ。

CL-USER> (cwd "~/")
#P"e:/cygwin/home/whitypig/"
CL-USER> (cwd "~/study/euler")
#P"e:/cygwin/home/whitypig/study/euler/"
CL-USER> (current-directory)
#P"e:/cygwin/home/whitypig/study/euler/"


やったぜ!

まとめ

ccl がかわいく感じられてきた。
欲を言います。sbcl の time 関数は cpu サイクルを計ってくれるが,
ccl は計ってくれない,もしくは,ワシがはかり方を知らない。
なので,まとめというか課題は,sbcl の time の代替関数的なもの,
もしくは,方法を見つける,もしくはコメントで教えてモラウ師匠。