2008-01-01から1ヶ月間の記事一覧

OptionParserを試す

30分プログラム、その232。ExtLibのOptParseを試してみる。 なかなかいいね。標準のArgと違って、Unixのロングオプション(--long=XXX)とショートオプション(-l XXX)を同時に設定できるのが気にいった。 オプションの取得がちょっとだけ面倒かもしれない。 ソ…

兄弟の論理クイズ

30分プログラム、その231。兄弟の論理クイズをリストモナドで解いてみる。 5人兄弟が年長順に並んXいます。 それぞれの背中にはOかXのマークが書かれています。自分の背中のマークは見えませんが、自分より前の兄弟の背中は見えます。 1〜5がそれぞれ上から…

ExtLibを使う

30分プログラム、その231。OCamlの便利ライブラリ、ExtLibを使ってみる。 なかなか便利そうな関数が揃ってる。とりあえず、Std.printとStd.input_allは気にいった。そのうち、OptParseを試してみたい。 でも、インストールにそここそ時間がかかったので、今…

テトリスっぽい何か

30分プログラム、その230。HaskellのFALでテトリスを作ろうとした。 Macだとうまいことイベントがとれなくて、操作ができなかったので途中で飽きらめた。一応、ブロックが落ちてきて積み上げるとこまではできている。 ソースコード import Fal import Shape …

howm投稿スクリプトのgit対応

30分プログラム、その229。howm投稿スクリプトのgit対応 今までは、howmメモをSubversionで管理して、それをcronではてなに投稿してた。でも、最近SubversionからGitに切り替えたので、それに合せて投稿スクリプトも修正した。 といっても、svn upしていた部…

ファイル名で圧縮

30分プログラム、その228。画期的なDBなるものを聞いたので、似たものをシェルスクリプトで作ってみる。 高速検索性を最優先とするために、OSの基本機能であるファイル名検索に目を付け、 そこで検索対象となるファイルに含まれるデータそのものを全て「ファ…

第5章 練習問題 2(b)-

2リフト制御システム (b) 制御装置を以下のように改造し、一度に移動するようにすればいい。 fun {Controller Init} Tid = {Timer} Cid = {NewPortObject Init fun {$ state(Motor F Lid) Msg} case Motor of running then case Msg of stoptimer then {Send…

リフトとフラット

ガウディ本(asin:4798113468)に リフトがフラットに住む人々にとって有用なのは、エレベータがアパートに住む人々にとって有用なのと同じである。 と書いてあるんだけど、何かのネタなんだろうか? そもそもフラットって何?

データフロー変数

30分プログラム、その227。Mozartのデータフロー変数をOCamlで作ってみる。 最近読んでいるガウディ本(asin:4798113468)で使われているMozart/Ozにはデータフロー変数というおもしろい変数がある。 これは未束縛の変数を使おうとしたらそのスレッドは停止し…

DuceScript

http://howdyworld.org/junk/duce.html30分プログラム、その227。CDuceっぽいXML記法をJavascriptで提供する。実際は30分以上かかっていたりする。 CDuceのXML記法がWebページでも使えたらおもしろいなぁ、と思ったのでOreScriptで実現してみた。次のように…

第5章 練習問題 1-2(a)

1つのスレッドを共有する複数のポートオブジェクト インタリーブはロックステップで行なわれる。 まず、初期状態でポート内に2つのメッセージが格納される。 ping(0)|pong(1000)|_そして、Msgループで最初のメッセージ(ping(0))が処理される。ただし、この処…

XMLパーサっぽいの

30分プログラム、その226。XMLパーサっぽい何か。 OCamlDuceなどの[ [] "xyzzy"]という記法をXMLに変換するのが目的。まだ属性を書けない。 Javascript-Parsecとprototype.jsを使っている。 使い方 var parser = new DuceParser('<foo>[ <bar>[] <baz>"xyzzy" ]'); var resu</baz></bar></foo>…

Javascriptのパーサコンビネータを試す

30分プログラム、その225。Javascriptでパーサが書きたくなったのでJavascirpt版Parsecを試してみた。 ドキュメントがなくて苦労しているけど、全部自前で書くのに比べたら楽。 今のところ分った使い方は、 a b のかわりにa.l(b)メソッド do{a; b; c}のかわ…

括弧を省略できるa..b記法

30分プログラム、その224。昨日のa..b記法のバージョンアップ。 (0 .. 10)のように必ず括弧が必須だったが、0 .. 10のように括弧を省略できるようになった。 ただ..の両辺のスペースが省略できないのはしょうがない気がしてきた。パーサレベルでは浮動少数か…

rangeのための略記法

30分プログラム、その223。rangeのための略記法をCamlp4で作ってみた。 1..3とrange 1 3を同じにしたかったのだけれど、(1 .. 3)にしないとできなかった。なにか解決法あるのかなぁ。 使い方 let (@@) f g = f g (* rangeをここで定義する必要がある *) let …

Camlp4を試す

30分プログラム、その222。Camlp4を試してみる。 前やろうとして放置していたので、再チャレンジ。チュートリアルを流し読みしていたら時間が来たので、今日はサンプルだけ。 使い方 $ ocamlc -pp "camlp4o pa_extend.cmo q_MLast.cmo" -I +camlp4 -c repeat…

そういえば

一年に新しい言語を一つ覚えないとなぁ、とか次は並列言語だよなぁ、と思っていた。でも、考えてみれば最近、Ozを書いてるから、もう新しい言語覚えてることに気がついた。

第4章 練習問題 3-19

3 並列フィボナッチ {Fib 30}同士を比較した。単位はミリ秒。並列のほうが遅い。まあ、シングルプロセッサですし。 local S = {Property.get 'time.total'} in {PFib 30 _} {Show '---'} {Show {Property.get 'time.total'}-S} end 直列 - 410 並列 - 4980 …

30分プログラム一覧生成プログラム

30分プログラム、その221。30分プログラム一覧のページを生成するプログラム。ここ数日やってきた生成ツールの最後の部分。 #!/bin/sh mv 30min.yaml 30min.old.yaml perl yaml-collect.pl *-*-*.txt > delta.yaml perl yaml-merge.pl --key=url 30min.old.y…

Javascriptプリプロセッサ

JavascriptでJavascriptプリプロセッサを作れば、Javascriptでマクロが使えるようになるんじゃね、と思ったので作ってみた。テストページ(Firefoxで確認、Operaでは動かない)パーサはNarcissus(Javascript on Javascript)のものを流用したので苦労してない。…

YAMLのマージ

30分プログラム、その220。id:mzp:20080107:collectで作ったYAMLをマージするためのプログラム。 yaml-merge -key=some_key a.yaml b.yamlとすると、a.yamlとb.yamlを併せて出力する。ただし、このときa.yamlとb.yamlに同じエントリが存在した場合は、b.yaml…

ブロックの呼び出し方

30分プログラム、その219。サブルーチンの呼び方を調べてみる。 id:hassylinさんから、 $f->(@_)を使われてますが、 &$fにしない理由とかあれば教えていただけると勉強になります。 というツコッミをうけたので調べてみた。まず、リファレンス経由でサブルー…

uniq-by

30分プログラム、その218。List::MoreUtilsにないuniq_byを実装してみる。 本当はこれを実装した上で、昨日のYAML(id:mzp:20080107:collect)をマージするプログラムを書くつもりだったけど、これを書いただけで時間切れ。続きはまた明日。 使い方 uniq_by { …

第4章 練習問題 1-2

1 スレッドの意味 (a) local B in thread B=true % (1) end thread B=false % (2) end if B then % (3) if文 {Browse yes} %(4) Browse end endのように番号を付ける。3と4は順序を保持する必要がことを考慮にいれると、次のようになる。 1-2-3-4 1-3-2-4 3-…

30分プログラムをYAMLに

30分プログラム、その217。過去の30分プログラムをYAMLでリストアップするプログラム。文字列の比較にeqを使わないといけないことを忘れてて、だいぶ悩んだ。 配列から要素を削除する関数が分からなくてgrepで実現してるけど、これができる関数あるのかなぁ…

YAMLのロードとダンプ

30分プログラム、その216。PerlでYamlを扱ってみる。ずっとPythonばっかりなのもアレなので、今週はPerlの週にするつもり。で、お題として30分プログラムリストの生成プログラムを改造しようと思う。そのためにYAMLを使いたいのでその下準備。 まだ、30分た…

第3章 練習問題 6-10

6 状態不変表明 P(R,Ys) = (Reverse(Xs) = R + Reverse(Ys))ただし、ここで+はAppendを表す。証明は必要かどうかわからないから、省略で。 7 別のappend関数 終了しない。Msの初期値がnilでない場合、常に{Append Ls [Xs]}が呼ばれる。そのため終了しない。 …

第3章 練習問題 1-5

1 実数の絶対値 実数を浮動小数のことと解釈する。すると浮動小数と0を比較することはできない。 fun {Abs X} if X < 0.0 then ~X else X end end 2 立方根 ImproveとGoodを変更した。 fun {CubicRoot X} fun {Iter Guess X} fun {Improve Guess X} (X/(Gues…

複素数計算

30分プログラム、その215。複素数クラスを作ってみる。 複素数の計算が目的なのではなくて、+や-などの演算子をオーバーロードしてみたかっただけ。Pythonにcomplex型があることは知っているけど、他にいい題材が思いつかなかったので。有理数は昔(id:mzp:20…

プログラミング言語Erlang入門

プログラミング言語Erlang入門作者: 柏原正三出版社/メーカー: アスキー発売日: 2007/11/29メディア: 単行本(ソフトカバー)購入: 3人 クリック: 72回この商品を含むブログ (40件) を見る読んだ。今ひとつ。Erlang特有の話はほとんど書いてない。かろうじて…