Archive for 2013年2月|Monthly archive page

Puppy Linux に newLISP をインストールする...または libffi の導入

 Puppy Linux は 4.X.X 系の日本語版を使っていましたが、5.X.X 系も日本が版が出ています。古い機種は 4.X.X 系と相性がいいですが、新しいハードウェアには 5.X.X 系の方が良さそうです。
 そこで、5.X.X 系を使ってみることに、、、ついでに懸案だった libffi の導入にも取り組みました。

1.Puppy Linux の導入
 http://openlab.jp/puppylinux/ から Lupu-528JP本体と開発環境を lupu_devx_528jp.sfs ダウンロードして、インストールする。インスト-ル方法は、http://openlab.jp/puppylinux/ を参照してください。

2.libffiをインストールする。
 http://sourceware.org/libffi/ から libffi-3.0.12.tar.gz をダウンロードして適当なフォルダーに展開。
 例えば、


/usr/local/source/

 あたりに。
 展開されたディレクトリ(/usr/local/source/libffi-3.0.12)に入り、


./configure

 して


make

 する。成功したら、


make install

 してから、ffi.hとffitarget.hを /usr/include にコピーする。
 (4.X.X 系でインストールでしても newLISP を make できなかったのは、これに気づかなかったから、、、)

3.newLISPをインストールする
 http://www.newlisp.org/ から newlisp-10.4.6.tgz をダウンロードして適当なフォルダーに展開
 例えば、


/usr/local/source/

 あたりに。
 展開されたディレクトリ(/usr/local/source/newlisp-10.4.6)に入り、


make

 する。
 これは、


make -f makefile_linux_utf8_ffi

 と同じ。
 ffilib をインストールしていないなら、


make -f makefile_linux_utf8

 を実行する。
 makeに成功したら、


make install

 する。

 これで完了です。ここで気づかれた方もいるかもしれませんが、コンパイル・オプションを変更していません。それでも、make できるのです!
 改めて、makefile_linux_utf8_ffi の中をのぞくと、


default: $(OBJS)
$(CC) $(OBJS) -m32 -g -lm -ldl -lreadline -lffi -o newlisp # for UBUNTU Debian
# $(CC) $(OBJS) -m32 -g -lm -ldl -lreadline -ltermcap -o newlisp # slackware
# $(CC) $(OBJS) -m32 -g -lm -ldl -lreadline -lncurses -o newlisp # other Linux Dist
# $(CC) $(OBJS) -m32 -g -lm -ldl -o newlisp # without readline support
strip newlisp

 5.X.X 系は 4.X.X 系とカーネルが違うから?
 まっ、動くんだから問題はありません(笑)。この実行ファイルが 4.X.X 系で動くことはないでしょうけど、、、
 さて、よく見るとコメントアウトされた行に libffi を含める -lffi がありません。たぶん忘れたのでしょうね。


default: $(OBJS)
$(CC) $(OBJS) -m32 -g -lm -ldl -lreadline -lffi -o newlisp # for UBUNTU Debian
# $(CC) $(OBJS) -m32 -g -lm -ldl -lreadline -ltermcap -lffi -o newlisp # slackware
# $(CC) $(OBJS) -m32 -g -lm -ldl -lreadline -lncurses -lffi -o newlisp # other Linux Dist
# $(CC) $(OBJS) -m32 -g -lm -ldl -lffi -o newlisp # without readline support
strip newlisp

 とすべきところでしょう。

 以上、如何でしょうか?
 あっ、JAVA のダウンロードとインストール方法は http://java.com/ja/download/ でどうぞ。

file? を使う...または、開発版v.10.4.6の紹介

 newLISP の file? はファイルの有無をチェックしますが、ディレクトリに対しても true を返します。

newLISP v.10.4.5 on Win32 IPv4/6 libffi, execute 'newlisp -h' for options.

> (file? "newlisp.exe")
true
> (file? "newlisp.exe" true)
"newlisp.exe"
> (file? "modules")
true
> (file? "modules" true)
modules
> (file? ".")
true
> (file? "." true)
"."
> 

 第二引数に true を指定するとファイル名を返してくれます。当然、ディレクトリ名もそのまま返します。
 しかし、開発版の v.10.4.6 からは、第二引数に true を指定するとファイル名だけを返します。

newLISP v.10.4.6 on Win32 IPv4/6 libffi, execute 'newlisp -h' for options.

> (file? "newlisp.exe")
true
> (file? "newlisp.exe" true)
"newlisp.exe"
> (file? "modules")
true
> (file? "modules" true)
nil
> (file? ".")
true
> (file? "." true)
nil
> 

 こんな感じ。だから、v.10.4.6 の file? を使えば、ディレクトリ下のファイル名だけを取り出すことができます。

> (clean nil? (map (hayashi file? true) (directory)))
("CodePatterns.html" "COPYING" "guiserver.jar" "guiserver.lsp" "manual_frame-jp.
html"
 "manual_frame.html" "md5-checksums.txt" "newLISP-10.4.6-Release.html" "newlisp-
edit.lsp"
 "newlisp-win.ico" "newlisp.dll" "newlisp.exe" "newLISPdoc.html" "newlisp_index-
jp.html"
 "newlisp_index.html" "newlisp_manual-jp.html" "newlisp_manual.html" "uninstall.
exe")
> 

 ここで、

(hayashi file? true)

 の hayashi は拙作のマクロ(newlisp-utility.lspに定義してあります)、

(lambda (x) (file? x true))

 と等価です。
 さて、v.10.4.6 では、JSON データ用の関数 json-parsejson-error が新設され、Android 版のmakeファイルがあったりします。開発版とはいえ、試してみる価値はありそうです(笑)。
 こちらに、日本語併記のマニュアル(newlisp_manual-10406.zip)があります。興味のある方はどうぞ。

 以上、如何でしょうか?