Posts Tagged ‘Lisp’

Co-Routine / Scheme

火曜日, 11月 25th, 2014

以前コルーチンの記事Co-Routine / Pythonを書きましたが、Scheme(Lisp)でやってみました。最近、データ処理には「やはりLispが向いているかも」という気まぐれから、Schemeに再びはまっています。Schemeといえば、call/ccによる「継続」が有名ですが、ならばコルーチンでしょう、ということになりました。しくみがわかりやすいようにシンプルなものにしました。

#lang racket
(define cont #f)
(call/cc (lambda (return) 
           ((lambda (yield)(yield 1)(yield 2)(yield 4)) 
            (lambda (value)
               (call/cc (lambda (c)
                    (set! cont c)
                      (return value)))))))

scheme01

今回使ったこのDrRacketというツールは、初めて使ったのですが、とても高機能で使いやすいです。再びはまったのも、このツールによるところが大です。

http://blog.livedoor.jp/kosugip/archives/692821.html 参考

Lazy K

日曜日, 9月 4th, 2011

関数型プログラム言語のひとつです。
組み込み関数が3つしかないとてもシンプルな構造をもつ言語です。
しかしこれだけでプログラムを組むことは、ちょっと非現実的で、Scheme言語(LISPの一種)から変換された形のものを実行します。

この話になった経緯ですが、最近関数型言語Clojure(Lispの一種)の必要性を感じ勉強していたところ、もう少しさかのぼってLispを勉強しようと思い、Scheme周辺の情報収集をしているときに見つけました。たったこれだけの記号でプログラムを表現できる(関数表現)のが面白く、実際に動かしてみたくなりました。
Lisp言語はとても古い言語なので、長くプログラマをやられている方なら、一度は興味を持たれたことがあると思います。私が興味をもったのは、随分前にMacでLispを使ったアルゴリズムコンポジションを知ったときでした。音楽データもリスト表現できるので、Lispには相性がいいのでしょう、結構ネットでも資料が見つかります。(Common Lisp Musicなど)
そのうち関数型言語が話題になり(Haskell)、またLispが脚光を浴びるとまた勉強したりしましたが、一時興味をもっても使わないとすぐに忘れてしまい、なかなかこの言語が身に付くことはありませんでした。書籍はかなりたまりましたが^^;
そして、今回Clojureです。CPUのマルチコア化に伴い、このような言語レベルで並列性が実現できる関数型言語がさらに必要とされてきた上、JVMで走るということで、急速に(私のまわりだけかもしれませんが)注目を集めています。まだ少ししか勉強していませんが、結構実用的に感じます。
今度は、長続きすればいいのですが・・必要と思ったときしか勉強しない、遅延評価的??

これは趣味にちかいですが、Lazy Kを実際に動かしてみました。

参考ページ
http://e.tir.jp/wiliki?%CB%DD%CC%F5%3A%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B8%C0%B8%ECLazy_K

Schemeは、Ubuntuでmit-schemeをインストール
Lazy-K は上記リンクよりWindows版をインストール

(load “./lazier”) ;Windows版からもってくる
(load “./prelude”) ;ネットから取得
(lazy-def ‘(test x) ‘(cdr x))
(print-as-cc (laze ‘test))

と実行すると、

SI(K(KI))

を出力

これをWindowsで、

lazy -e “SI(K(KI))”

と実行して、キーボードから

1 2 3 4

と入力してリターン
すると

2 3 4

と表示します。

(lazy-def ‘(test x) ‘(x))

に変更すると、

I

なんと一文字だけ出力します。(もっとも短いプログラム)
これは、標準入力をそのまま標準出力にエコーします。
上記リンクには、もっと長いサンプルコードがありますが、S,I,K,(,)しか使っていません。
今回、標準入力を出力しているのでいいですが、文字列とか表現しようと思うと大変そうです。
これだけシンプルなので、数字すら定義されていません。prelude.scmをみると、数字を関数表現しているのが面白いです。