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-03-14


CLで学ぶ「プログラミングGauche」 (2)

| 19:12 | CLで学ぶ「プログラミングGauche」 (2) - わだばLisperになる を含むブックマーク はてなブックマーク - CLで学ぶ「プログラミングGauche」 (2) - わだばLisperになる

Gaucheの特徴

今回は2章「Gaucheの特徴」ですが、Gaucheと比較してCommon Lispはどんな感じなのかしらということを書いてみたいと思います。

Gaucheは

  1. 手軽にプログラムを書いて試せるスクリプト言語
  2. 実用規模のプログラムまでスケールする
  3. 他の言語で書かれたアプリケーションに埋め込める

ことに力を入れている、とあります。

それでCommon Lispはどうかというと、UNIX等のOSの上でスクリプトとして手軽に試せる、というのはちょっと苦手です。

頑張ればできないこともありませんが、そこに力は入ってないようです。

ただ、手軽に試せる、ということや、アイディアをさっとスケッチする、ということはSLIMEのような中の環境から逆にOSを操作すれば良い訳で、スクリプト言語でなければ不可能というわけではないと思います。この辺は、Smalltalkに代表されるイメージの中で生活する処理系で共通しているかと思います。換言すれば、現在一般的にスクリプト言語として手軽、というのは、ホストのUNIXと親和性が高いかどうかということで、ホストを含めてイメージとして抱えている言語では、また違ったアプローチになるかと思います。

次に、スケールするかですが、自分は良く知らないのですが数十〜百万行規模のアプリケーションも実稼働しているようなのでスケールはするんじゃないでしょうか。

そして、他のアプリケーションに埋め込み可能かですが、これも最初の項目に関連し、苦手としていると思います。

  • マルチバイトの処理

これはCLでも可能ですが、Gaucheのように環境が整備されていて、かつ、日本のコミュニティが活溌というわけではないので、何か新しいパッケージを試して文字コード特有の問題に遭遇しても、解決するには自力で色々調べたり、直したりする必要に迫られることが多いかと思います。

  • パッケージ、モジュールシステム

Common Lispには標準でパッケージ機能があるので、コードを書く際にも手軽に書き捨てでパッケージを作成して色々試す、ということも広く行われているかと思います。パッケージを作ると名前の衝突等を簡単に回避できるので、この辺もスケーラビリティーも貢献しています。

また、標準ではありませんが、ASDFというパッケージを導入する仕組があり、最近では、ASDFを使って何でも配布することが多くなって来ているようです。

ASDF-INSTALLという、ネットワークインストールに対応した仕組みもあり、DebianのAptのようにモジュールをネットワークインストール可能で非常に便利です。

  • オブジェクトシステム

Gaucheには、CLOSライクなオブジェクトシステムがありますが、CLOSはCommon Lisp Object Systemの略でもありANSI Common Lispで標準になっています。

「実行時メタオブジェクトプロトコルを完全実装したフル動的オブジェクトシステム!」とか、なんだか凄そうなんですが、親切な解説やチュートリアルは(特に日本)あまりなく、残念ながら人口に膾炙している気がしません。

また、CLOS以外にもオブジェクトシステムはあり、AOP等の実装もあります。

  • Cとの連携

C(や他言語)との連携のためのインターフェースもありますが、実装依存で処理系により異なっています。フリーの処理系では、CFFIがメジャーどころかと思われ、殆どCFFIか、UFFIパッケージを使用しているかと思われます。

これらを利用して、OpenGLや、SQLと連携したりするパッケージも多数公開されています。

ArcでL-99 (P35 素因数分解)

| 17:57 | ArcでL-99 (P35 素因数分解) - わだばLisperになる を含むブックマーク はてなブックマーク - ArcでL-99 (P35 素因数分解) - わだばLisperになる

今回は、素因数分解がお題です。

ちょうど去年の今頃、このお題をCommon Lispで解いていたのですが、職場の飲み会で普段は何をして過してるんですか、という質問に、

「いや、ほんと無趣味なんで何もしてないですね。…あ、強いて挙げれば、素因数分解ですかね」

と答えたところ、死ぬ程笑われたことを思い出します。そんなに面白かったかしら…。

私は、数学以前の算数で挫折しているクチなのですが、素朴に書いてみました。

大きめの素数を与えると返事がなくなります。

以前定義したprimeを使用しています。

(prime-factors 600851475143)
;=> (71 839 1471 6857)

(def prime-factors (n)
  ((afn (n i)
     (with (q (trunc (/ n i)) r (mod n i))
       (if (< n 2) list.n
	   (is 0 r) (if (is 1 q) 
			list.i
			(cons i (self q i)))
	   'else (self n (next-prime i)))))
   n 2))

(def next-prime (n)
  ((afn (n)
     (if (prime n)
	 n
	 (self (+ 1 n))))
   (+ n 1)))

CLOSでL-99 (P11 要素をランレングス圧縮する その2)

| 05:41 | CLOSでL-99 (P11 要素をランレングス圧縮する その2) - わだばLisperになる を含むブックマーク はてなブックマーク - CLOSでL-99 (P11 要素をランレングス圧縮する その2) - わだばLisperになる

なんかどんどん脱線して行ってしまう!

(encode-modified '(a a a a b c c a a d e e e e))
;=> ((4 A) (1 B) (2 C) (2 A) (1 D) (4 E)) 

(defgeneric encode-modified (lst)
  (:method ((lst null)) () )
  (:method ((lst cons))
    (let ((pack (pack lst)))
      (encode-modified1 (caar pack) (cdar pack) pack))))

(defgeneric encode-modified1 (head-item head-cdr lst)
  (:method (head-item head-cdr (lst null)) () )
  (:method (head-item (head-cdr null) (lst cons))
    (cons head-item (encode-modified1 (caadr lst) (cdadr lst) (cdr lst))))
  (:method (head-item head-cdr (lst cons))
    (cons `(,(length (cons head-item head-cdr)) ,head-item)
	  (encode-modified1 (caadr lst) (cdadr lst) (cdr lst)))))

QiでL-99 (P11 連続する要素をランレングス圧縮する その2)

| 23:29 | QiでL-99 (P11 連続する要素をランレングス圧縮する その2) - わだばLisperになる を含むブックマーク はてなブックマーク - QiでL-99 (P11 連続する要素をランレングス圧縮する その2) - わだばLisperになる

実は本家サイトのP-99はPrologの全問解答がありますが、L-99は解答が全部揃ってません。

そういう訳で、fixdapにてL-99の解答を作成するというプロジェクトを作成してみたんですが、良かったら投稿してみて下さい!

現在作成したCommon Lisp、Scheme、Arc、Qi等の解答例を少しずつアップしてみています。

(encode-modified [a a a a b c c a a d e e e e])
\=>[[4 a] b [2 c] [2 a] d [4 e]]
\

(define encode-modified
    X -> (encode-modified* (pack X)))

(define encode-modified*
    [ ] -> [ ]
    [H | T] -> [(head H) | (encode-modified* T)] where (= 1 (length H))
    [H | T] -> [[(length H) (head H)] | (encode-modified* T)])

ゲスト



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