2009年2月27日金曜日

newLISPの特徴、軽くまとめ

去年から少しずつ弄っていたnewLISPですが、 人様に見せるようなものは出来なかったのでとりあえず使ってみて分かったことだけでも書いておきます。 これからnewLISPを使ってみようかと思っている人の参考にでもなれば、と。

リンク

マニュアル・リファレンス

  • newLisp (newLISPのメモリ管理方法(ORO)についての翻訳)

サンプル・ライブラリ

日本語の情報源

今のところほとんど見つかりませんが...

特徴

  • 開発はC言語 (GUI部分はJava)
  • ライセンスはGPLv3
  • 主にスクリプト言語として利用する
    newLISP is a Lisp-like, general-purpose scripting language.
  • newLISP-GS: JavaベースのGUIライブラリが付属
    付属のエディタはこのGUI-Serverを呼び出している
  • プラットフォームは Windows *BSD Linux Solaris OSX …とにかくたくさん。
    Linux/Tru64 UNIX/*BSD/Mac OSX/SunOS/Solaris/AIX/Win32(MinGW)/OS2
  • 64ビット対応
  • IPv4とIPv6の切り替えが可能 (開発中)
  • 実行ファイルは200kバイトくらいとかなり小さい
  • 単体の実行ファイルが作れる - newlisp.exeとソースを結合する方法
  • HTTP/CGIサーバ専用モード - HTTP-only server mode

ライブラリ

とりあえず確認したライブラリ ※当方使ったことないです。OpenGLは面白いかも。
C-Libraries, Modules
  • MySQL SQLite GTK-server OpenGL freeGLUT GNU-GMP OpenSSL zlib FTP Postscript POP3 SMTP

言語の特徴

  • newLISP と CL/Scheme の比較を参照 (訳してみたもの)
  • ラムダ式はリストと同様に扱える。
  • 動的スコープ / 動的束縛
    この辺はEmacsLispに似ている。
  • ドット対が存在しない。
  • 関数の引数は足りなくても余分にあってもよい。足りない引数はnilに束縛される。
    これはnewLISP特有のものではなく、Interlispの特徴でもある。
    Lispの進化 957行目参照
    ((lambda (x y z) (list x y z)) 0 1 2 3 4 5) => (0 1 2)
  • Implicit indexing (暗黙のインデックス機能)
    リストや文字列などのシーケンスにアクセスする機能。
    ("newLISP" 0) => "n"
  • 関数の引数は基本的に値のコピーが渡される
    バージョン10 から一部破壊的な関数に置き換わっている
    マクロも引数を評価しない点では参照渡しとほぼ同等。
  • コンテキスト
    LISP-1(関数と変数の名前空間が共有)であるnewLISPに複数の名前空間を提供する機能
    CommonLispのパッケージの概念と似ているかもしれない
    これを使えばマクロ定義においての外部からの変数束縛を避けることが出来る。
    ハッシュの代用にもなる。
  • 共有ライブラリの呼び出しが可能
    (import "printf" "libc.so.6")
    (printf "%s World" "HELLO")  ;=> "HELLO World"
  • Perl互換正規表現 (PCRE: Perl-Compatible Regular Expressions)
  • Unicode対応 (UTF-8)
  • XMLサポート
  • ネットワークAPI多数 (TCP, UDP)
  • Prolog風パターンマッチ関数が利用できる
    (match '(* 2 ? 4) '(0 1 2 3 4)) ;=> ((0 1) 3)
    (unify '(p X Y a) '(p Y X X)) ;=> ((Y a) (X a))
  • 組み込み関数は350個くらい。
  • 以下は全て同じ文字列を表す。バックスラッシュが少し見やすくなるかも。
    • "C:\\home\\lxuser\\newlisp"
    • {C:\home\lxuser\newlisp}
    • [text]C:\home\lxuser\newlisp[/text]

主に不満な点

  • http://lisperblog.blogspot.com/2008/11/blog-post_18.html
  • 関数名に予約されていて変数に使えない名前がある。これはたまにイラッとくる。 例: fn sym name args
  • エラーが貧弱。(デバッガはあるらしいが)
  • 「リスト遊び」がしにくい。(ドット対がないためconsがほぼlistと同じ)
  • マクロが書きにくい。(名前空間共有、`,@がない、macroexpandがない)
  • シーケンスを扱う関数全てがunicode対応というわけではない。
  • (= nil '()) => nil
  • lambdaの代わりにfnが使えるとか、condのように複数条件分岐が使えるifとか、("foo" 0) => "f"とか、arcの機能がちらほら。歴史的に考えてnewLISPの方が先なんだろうけど。

ChangeLog

  • 2009/02/27 - 初版
  • 2011/02/22 - 内容の整理整頓
  • 2011/09/13 - Twitterのリンクを追加

0 件のコメント:

コメントを投稿