Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2009-04-26

Getting Started in *LISP (23)

| 10:46 | Getting Started in *LISP (23) - わだばLisperになる を含むブックマーク はてなブックマーク - Getting Started in *LISP (23) - わだばLisperになる

LingrのCL部屋でスペシャル変数とマルチスレッド問題の話題のお蔭で、すっかり忘れていた*Lispのことを思い出しました。

3ヶ月ほど間が空いてしまいましたが、*Lisp入門の23回目です。

3.6.6 Two Important VP Set Variables

どのVPセットが現在選択されていて、どれがデフォルトのVPセットになっているかを確認したい、ということは良くあることなので、その為の大域変数が用意されているとのこと。

まず、*default-vp-set* は、*cold-bootした時に設定されたVPセットが束縛されている

(*cold-boot :initial-dimensions '(128 128))

*default-vp-set*
;=> #<VP-SET Name: *DEFAULT-VP-SET*, Dimensions (128 128), Geometry-id: 2>

*default-vp-set* は *cold-boot を実行する度に設定されるが、逆にそれ以外の方法では変化しない。

対して、 *current-vp-set* は現在選択されているVPセットの内容に束縛されている。

*current-vp-set*
;=> #<VP-SET Name: *DEFAULT-VP-SET*, Dimensions (128 128), Geometry-id: 2>

(def-vp-set big-square ' (256 256)
  :*defvars ' ((big-square-pvar 1)
               (another-square-pvar (random!! 20))))

;; VPセットをbig-squareに設定
(set-vp-set big-square)

*current-vp-set*
;=> #<VP-SET Name: BIG-SQUARE, Dimensions (256 256), Geometry-id: 3>

ということで上記を利用して現在のVPセットがデフォルトのVPセットかどうかを調べる関数が書ける

(defun default-p ()
  (eq *current-vp-set* *default-vp-set*))

試してみる

(set-vp-set big-square)
;=> #<VP-SET Name: BIG-SQUARE, Dimensions (256 256), Geometry-id: 3>
(default-p)
;=> NIL

(set-vp-set *default-vp-set*)
;=> #<VP-SET Name: *DEFAULT-VP-SET*, Dimensions (128 128), Geometry-id: 2>

(default-p)
;=> T

VPセットは*Lispのツールのうちでも高度なものなので、ここではこれ以上詳細に立ち入らず、後の6.4章で詳細に解説するとのこと。

次回、3.7から再開

2009-04-20

長さ付きリストで勘違い

| 01:02 | 長さ付きリストで勘違い - わだばLisperになる を含むブックマーク はてなブックマーク - 長さ付きリストで勘違い - わだばLisperになる

風邪か何かの所為か具合が悪いので、先日開催された「型レベルプログラミングの会」のUstreamをぼーっと眺めていたのですが、「長さ付きリスト」というのが耳に残りました。

(defun sized-list (list)
  (if (endp list)
      (cons list 0)
      (cons list (length list))))

(defun sized-list-append (&rest sized-lists)
  (if (endp sized-lists)
      (cons () 0)
      (destructuring-bind ((list . len) &rest rest) sized-lists
        (let ((rest (apply #'sized-list-append rest)))
          (cons (append list (car rest))
                (+ len (cdr rest)))))))

(declaim (inline sized-list-length))
(defun sized-list-length (sized-list)
  (cdr sized-list))
(sized-list '(1 2 3 4))
;=> ((1 2 3 4) . 4)

(sized-list-append
 (sized-list (list 1 2 3 4 5))
 (sized-list (list 6 7 8 9 0)))
;=> ((1 2 3 4 5 6 7 8 9 0) . 10)

(sized-list-length
 (sized-list-append
  (sized-list (list 1 2 3 4 5))
  (sized-list (list 6 7 8 9 0))))
;=> 10

こんな感じのを想像したのですが、全然違うようです(笑)

…その前に元ネタを理解していないのですが(´▽`*)

大元のアイディアはCLだとどういう感じになるんでしょう。

2009-04-18

MS-DOSでCommon Lisp

| 16:37 | MS-DOSでCommon Lisp - わだばLisperになる を含むブックマーク はてなブックマーク - MS-DOSでCommon Lisp - わだばLisperになる

delicious等のlispタグにはStar Sapphire Common LISPというCL処理系のマニュアルがちょこちょこ流れてくるのですが、良く眺めたら処理系もダウンロードできることが分かりました。

このStar Sapphire Common LISPはMS-DOS上で動く処理系で、90年年代初頭のMS-DOSプラットフォームでは人気があったらしいです。

ということで、Ubuntu上のdosboxで試してみることにしました。

手順は、

  1. SSCLをダウンロード
  2. 解凍(ファイルをばらまくのでディレクトリを作成してから、そこに解凍)
  3. dosboxを起動し、SSCLのディレクトリにあるlispを実行
  4. 起動!

という流れです。

一緒にEmacs(uemacs)も付いてきて処理系内部から(ed 'foo)等でfooというファイルを作成できたりします(関数定義には飛ばない)。

また、処理系の仕様ですが、CLtL2っぽくもありますが、CLOSが付いてきたりしていて、CLtL1+CLOSというところでしょうか。

といっても、CLtL1に厳密準拠してるわけでもないようで若干謎です。

2009-04-13

Let Over Lambda読書会に行ってきました!

| 00:33 | Let Over Lambda読書会に行ってきました! - わだばLisperになる を含むブックマーク はてなブックマーク - Let Over Lambda読書会に行ってきました! - わだばLisperになる

おととい4/11に開催されたLet Over Lambda 読書会に参加してきました。

Let Over LambdaはOn Lispの方向性をより推し進めた、On Lispの続編を標榜するDoug Hoyte氏のマクロ探究の本です。

今回の読書会は、翻訳された内容の査読を兼ねての開催ということで、3章までの草稿を音読し、参加者に意見を求めるという形式でした。

予定では3章より先まで進む予定とのことだったのですが、色々な意見交換があったのと初回ということもあってか予想より手前の2章まで。

参加する前までは、LOLのような野心的な書籍が本当に本屋さんに並ぶことになるのだろうかと思っていたので、ストレートに伺ってみたのですが、なんと、そんなに遠くない時期に出版される予定とのことです!

これは凄い!!

LOL翻訳が出版された暁には、LL全盛のこの御時世にあえてCLを母国語として選んでいるCLerの皆さんのことですから全員が買ってしまうに違いありません。

2009-04-09

大文字リーダーマクロ

| 22:03 | 大文字リーダーマクロ - わだばLisperになる を含むブックマーク はてなブックマーク - 大文字リーダーマクロ - わだばLisperになる

リーダーマクロは文字に対して付くので大文字のアルファベットに付けるというのもありかなと、ふと思ったのですが、

(set-macro-character #\F
                     (lambda (stream char)
                       (declare (ignore char))
                       `(lambda ,(read stream T nil T)
                          ,(read stream T nil T))))

(mapcar F(x)x 
        '(1 2 3 4))
;=> (1 2 3 4)

(map'vectorF(x y)(* x y)
    '(1 2 3 4)
    '(10 20 30 40))
;=> #(10 40 90 160)

当然ながらmapcarとMAPCARでは解釈が違ってしまうのが難。

追記:

デフォルトのreadtableでは文字は大文字と小文字を区別しないようですので、このエントリーが成り立つのは:preservの場合のようです…

2009-04-08

CLでBASIC風

| 00:27 | CLでBASIC風 - わだばLisperになる を含むブックマーク はてなブックマーク - CLでBASIC風 - わだばLisperになる

Route 477(2009-04-07)

割とCLの人は知ってると思うので、早い者勝ちで書いてみますが、CLだとgotoのタグに普通に数字が使えるので普通に行番号つきのBASICみたいに書けたりします。

(DEFUN MAIN ()
  (PROG (A)
     10 (SETQ A 5)
     20 (IF (= 5 A) (GO 40))
     30 (PRINT "This will never execute")
     40 (PRINT "They were equal!")
     50 (IF (= 6 A) (GO 70))
     60 (PRINT "This will execute 1st...")
     70 :END))

(MAIN)
"They were equal!" 
"This will execute 1st..." 
NIL

ちなみに、CLtLにはgotoのタグやprog/tagbodyの使い方について、推奨しない例が載っていたりしますが、CLtLの例よりひどい実物のコードはみたことがありません(笑)

ちなみに

(prog (a)
 Aに5を代入
 (setq a 5)
 -----------

 Aから5を引く
 (decf a 5)
 ------------

 Aの結果を返す
 (return a)
 -------------)
;=> 0

のような感じのものです。

2009-04-07

Let Over Lambda読書会!

| 23:54 | Let Over Lambda読書会! - わだばLisperになる を含むブックマーク はてなブックマーク - Let Over Lambda読書会! - わだばLisperになる

自称On Lispの続刊。やりすぎマクロ本であるLet Over Lambda和訳の動きがあるのは以前から知っていたのですが、そのLet Over Lambdaの読書会が開催されることになったようです!

これは東京都民なら参加せずにはいられませんね。いわんやCLerをや!

2009-04-05

ABCLをソースからビルドするためのメモ

| 19:17 | ABCLをソースからビルドするためのメモ - わだばLisperになる を含むブックマーク はてなブックマーク - ABCLをソースからビルドするためのメモ - わだばLisperになる

※antを使う方法が一番楽なようです

----

今日、ABCLの0.14.0がリリースされたようです。

リリース頻度が随分高くなっているように思えるのですが、やはり同じJVM上で動くClojureに負けてられないということなのでしょうか(*'-')

それはさておき、毎回ソースからビルドするたびに手順を忘れるのでメモ

$ cd ABCLのソースディレクトリ

customizations.lispを作成

(in-package "BUILD-ABCL")

;; Standard compiler options.
(setq *javac-options* "-g")
(setq *jikes-options* "+D -g")

;; *PLATFORM* will be either :WINDOWS, :DARWIN, :LINUX, or :UNKNOWN.
(case *platform*
  (:windows
   (setq *jdk*           "C:\\Program Files\\Java\\jdk1.5.0_11\\")
   #+(or) (setq *java-compiler* "jikes")
   )
  (:darwin
   (setq *jdk*           "/usr/")
   (setq *java-compiler* "jikes")
   #+(or) (setq *jar*    "jar"))
  ((:linux :unknown)
   (setq *jdk*           "/usr/lib/jvm/java-1.5.0-sun/") ;; jdkの場所
   (setq *jar*           "jar")))

他のCL処理系でビルド

echo "(load \"build-abcl.lisp\")(build-abcl:build-abcl :full t :clean t)"|sbcl

SmallTalk R4.1チャレンジとCLでのクラスの削除

| 01:44 | SmallTalk R4.1チャレンジとCLでのクラスの削除 - わだばLisperになる を含むブックマーク はてなブックマーク - SmallTalk R4.1チャレンジとCLでのクラスの削除 - わだばLisperになる

lequeさんのはてなブログエントリを読んで、面白そうだったのでできそうなところに手を付けてみました。

元のお題の主旨は、要件を満すDSLを作れるかどうかという感じなのですが、適当にCLの仕様内でやってみます。

それでとりあえず、aliasの問題だったら簡単かなと思って挑戦してみたのですが、その過程でCLOSでクラスを削除する方法を知らないことに気付きました。

(setf (find-class 'foo) nil)

で良いんでしょうかねー。

Lispマシン(TI-Explorer/TICLOS)だとdelete-classがあるみたいなんですが、この辺はユーティリティとして各自定義したりするんでしょうか。

クラスのエイリアス

(define-class-alias 'bar 'foo)

(class-aliases 'foo)
;=> (BAR)

(define-class-alias 'baz 'foo)

;; エイリアス確認
(class-aliases 'foo)
;=> (BAZ BAR)

;; barでも、foo
(make-instance 'bar)
;=> #<FOO {100DA44381}>

;; fooに対するメソッドを定義
(defmethod foo-meth ((x foo))
  :foo)

;; barでも、foo
(foo-meth (make-instance 'bar))
;=> :FOO

;; エイリアス解除
(class-unalias 'baz)

;; 確認
(class-aliases 'foo)
;=> (BAR)

定義

(defun define-class-alias (alias orig)
  (pushnew alias (get orig :aliases))
  (setf (find-class alias) (find-class orig)))

(defun class-aliases (name)
  (get name :aliases))

(defun class-unalias (name)
  (symbol-macrolet ((field (get (class-name (find-class name)) :aliases)))
    (setf (find-class name) nil)
    (setf field (remove name field))))