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-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))))