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 |

2008-09-12

EusLispを試してみよう!

| 14:26 | EusLispを試してみよう! - わだばLisperになる を含むブックマーク はてなブックマーク - EusLispを試してみよう! - わだばLisperになる

先日のShibuya.lispの決起集会の後の飲み会で、garaemonさんに、EusLisp(ユースリスプ)というのを教えてもらいました。

EusLispとは、主にロボット制御のためのオジェクト指向LISPとのことです。

詳細は

に書いてあります。

処理系の配布元がリンク切れしているとのことだったのですが、今日garaemonさんのページ:no titleを覗いてみたら

リンク切れしてるが,ftp:// -> http://www.etl.go.jp/とすることでダウンロードできる

とのことだったので、早速no titleのページからダウンロードして試してみました。

自分の、環境は、Ubuntu 8 x86_64です。

コンパイルしようとも思いましたが、色々壁にぶつかりそうだったので、とりあえずコンパイル済みのものを動かしてみました。(要32ビットバイナリが動く環境:ia32-libs)

マニュアルを眺めると色々面白そうな機能があります。

大体のところは、CL系の処理系なようです。

とりあえず馬鹿の一つ覚えで、fib

(defun fib (n)
  (if (< n 2)
      n
      (+ (fib (1- n))
         (fib (- n 2)))))

(fib 10)
;=> 55

CLそのまんまですね(*'-')

コンパイルしてみる

(compile 'fib)

compiling file: eus2060C58.l
gcc -c -Di386 -DLinux -w -DGCC  -fpic  -I/u/mc/prog-ubuntu/Desktop/EusLisp/eus/include -O eus2060C58.c; ld -shared -o eus2060C58.so eus2060C58.o
;; binloading ./eus2060C58.o into #<package #X8199f4c USER>
BINLOAD cannot dlopen: ./eus2060C58.o: wrong ELF class: ELFCLASS64
;; binloading /u/mc/prog-ubuntu/Desktop/EusLisp/eus/eus2060C58.o into #<package #X8199f4c USER>
BINLOAD cannot dlopen: /u/mc/prog-ubuntu/Desktop/EusLisp/eus/eus2060C58.o: wrong ELF class: ELFCLASS64
;=> 環境が64bitのためかエラー

という風にCに変換してgccでコンパイルされる様子。これは32bit環境なら行けそうです。

オジェクト指向なプログラミング

EusLispはCLOS系ではなくて、どうも元祖FlavorsのようなSmalltalk的なメッセージパッシングスタイルみたいで、Flavorsのようにsendという構文がありました。

適当なクラス作成
(defclass foo 
  :slots (x))
これまた適当にメソッド作成
(defmethod foo 
  (:foo ()
   (print "foo!"))
  (:bar ()
   (print "bar!")))

面白いのは、defmethodで複数のセレクタを定義できるところで、なんというか、CLOSのdefgenericとFlavorsのdefmethodを足して2で割った感じです(*'-')

(send (make-instance foo) :foo)
;=> "foo!"
(send (make-instance foo) :bar)
;=> "bar!"

みたいに動作します。

これは面白いかも!

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20080912