2009年1月28日水曜日

[CL] 0から1000までに含まれる0をカウントする

http://d.hatena.ne.jp/rubikitch/20081120 より

(count #\0 (format nil "~{~D~}" (loop :for i :from 0 :to 1000 :collect i)))
;=> 193

Commom Lisp は文字列を弄ることが出来るから面白い。

今日の無題

ああ…期末試験は近いよ

2009年1月18日日曜日

[PCL]第29回CL勉強会セルフ反省会[CADR]

反省会というより、単なるログです。

  • PCL第4章 特に疑問はないので省略
  • Lispマシンエミュレータの話題 第29回CL勉強会CADR Lispマシンで遊んでみよう篇の準備物 からエミュレータ本体とディスクイメージを落とす 今回はchaosサーバは使わない エミュレータは実行形式で配布されているのでコンパイルの必要なし(ソース同梱) Winバイナリもあるけど、色々不便らしいので今回はLinux版を使う 以下エミュレータ起動までの手順
    [~/lisp/]$ ls
    chaos-cadr.tar.gz
    disk.img.tar.gz
    usim.tar.gz
    [~/lisp/]$ tar fxvz usim.tar.gz
    [~/lisp/]$ tar fxvz disk.img.tar
    [~/lisp/]$ cd usim
    [~/lisp/usim]$ ln -s ../disk.img disk.img
    [~/lisp/usim]$ ./usim
    起動まで50秒弱 [Intel celeron M, 1.40GHz] 起動後に現在の日時を聞かれるので"月/日/年 時:分"のように答える
    ***CADR [Running]***
    Please type the date and time: 1/17/81 22:20
    Time is Saturday the seventeenth of January, 1981; 10:20:00 pm, OK? Yes
    This is band 1 of CADR diskmaker image.
     System     78.48
     Zmail      38.5
     Tape        6.5
     LMFS       21.34
     Symbolics   8.13
     Microcode 841
    Distribution Unknown, with associated machine UNKNOWN.
    _
    後はここからEmacsの*scratch*バッファよろしくS式を書くらしい
    見つけたキーバインド
    F2-f: ファイルシステムエディタ起動
    F2-l: Listener(最初の画面)に戻る
    F2-e: Zmacs起動, (ed)
    F2-m: Zmail起動
    キーボードは101配列、106配列がごっちゃになっていた (なぜ?)
    ---106配列
    1234567890-^\
    qwertyuiop@[
    asdfghjkl;:]
    zxcvbnm,./\
    
    !"#$%&'()~=~|
    QWERTYUIOP`{
    ASDFGHJKL+*}
    ZXCVBNM<>?_
    
    ---Lispマシンエミュレータ
    1234567890-^\
    qwertyuiop@[
    asdfghjkl;:]
    zxcvbnm,./\ (backslash)
    
    !@#$%^&*()_^|
    QWERTYUIOP@{
    ASDFGHJKL::}
    ZXCVBNM<>?|
    見つからなかったキー quote('),doublequote("),backquote(`),plus(+),tilde(~) 解像度が1024x768だと縦幅が足りない… サイズの変更も出来るらしいんだけど、挫折(泣)
Lispマシンエミュレータ起動画面

2009年1月6日火曜日

丑年

2009年の干支は己丑(つちのとうし)。

ウシといえばGNUという発想は安直すぎるだろうか…

今年はもう少し自己主張できるようになりたいです。

2008年12月28日日曜日

2008年12月26日金曜日

'fooと#'fooの違いは環境の違い

QUOTEとFUNCTIONを使い分ける:もう少し詳しい説明 -- 逆引きCommonLisp

をぼんやり見ていて、そういえば FUNCTION と COERCE では環境が違うってうちの CLISP が言ってたのを思い出した。

(funcall '(lambda (x) (1+ x)) 1)
;; => Error
;; *** - FUNCALL: argument (LAMBDA (X) (1+ X)) is not a function.
;;       To get a function in the current environment, write (FUNCTION ...).
;;       To get a function in the global environment, write (COERCE '... 'FUNCTION).

CLHS にもそれらしい記述があったのでメモ。

CLHS: Function COERCE
If the result-type is function, and object is any function name that is fbound but that is globally defined neither as a macro name nor as a special operator, then the result is the functional value of object. If the result-type is function, and object is a lambda expression, then the result is a closure of object in the null lexical environment.

= objectがマクロ、スペシャル・オペレータ以外でグローバルに定義されたfboundな関数名を持っているなら、そのobjectの関数値を返す。 objectがラムダ式なら、空レキシカル環境なobjectのクロージャを返す。

CLHS: Special Operator FUNCTION
The value of function is the functional value of name in the current lexical environment.

= functionは現在のレキシカルな環境を持ったnameの関数値を返す。

この環境を引数に渡せる関数、マクロはいくつかある。 ラムダリストキーワードに &environment を持つものがそれで、例えば setf とか push とか。

(arglist 'setf)
;=> (&WHOLE SYSTEM::WHOLE-FORM &REST SYSTEM::ARGS &ENVIRONMENT SYSTEM::ENV)

macroexpand も環境を引数に渡せるが、こちらはなぜか &optional になっている。

(arglist 'macroexpand)
;=> (FORM &OPTIONAL ENV)

2008年12月19日金曜日

あと一週間

万能プレーヤーである VLC media player の起動アイコンがクリスマス仕様になっている事に気づいた。

Google のトップページが時期によって模様替えされるのは何度か見たけれど、こういう遊びをするソフトウェアって少ないんじゃないかな。