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

defineサポート

defineが使えるようになったぜい。 $ cat example/define.scm (define x 42) (define (inc x) (+ x 1)) (print (inc x)) $ ocamlbuild main.byte -- example/define.scm Finished, 47 targets (47 cached) in 00:00:01. $ avmplus a.abc 43 でも、internal d…

ビューティフルコード読み終わった

ビューティフルコード (THEORY/IN/PRACTICE)作者: Brian Kernighan,Jon Bentley,まつもとゆきひろ,Andy Oram,Greg Wilson,久野禎子,久野靖出版社/メーカー: オライリージャパン発売日: 2008/04/23メディア: 大型本購入: 30人 クリック: 617回この商品を含む…

Problem42

30分プログラム、その315。Problem42 - Project Euler。 三角数のn項は tn = ½n(n+1)で与えられる. 最初の10項は 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...である.単語中のアルファベットを数値に変換した後に和をとる. この和を「単語の値」と呼ぶことにす…

Problem41

30分プログラム、その314。Problem41 - Project Euler。 n桁の数がPandigitalであるとは, 1からnまでの数を各桁に1つずつもつことである. 例えば2143は4桁のPandigital数であり, かつ素数である. n桁のPandigitalな素数の中で最大の数を答えよ. nが大きいPan…

レコードでもliftしたい

こんないくつかの値をまとめて扱うためにレコードを定義した。 type some_record = {x:int list;y:float list} そして、これを操作する関数をいくつか書いた。 let append {x=x1;y=y1} {x=x2;y=y2}= {x=x1@x1; y=y1@y1} こういった関数がいくつかできてくる…

Problem40

30分プログラム、その313。Problem40 - Project Euler。 正の整数を順に連結して得られる以下の10進の無理数を考える: 0.123456789101112131415161718192021...小数点第12位は1である. dnで小数点第n位の数を表す. d1 × d10 × d100 × d1000 × d10000 × d1000…

Problem39

30分プログラム、その312。Problem39 - Project Euler。 辺の長さが{a,b,c}と整数の3つ組である直角三角形を考え, その周囲の長さをpとする. p = 120のときには3つの解が存在する: {20,48,52}, {24,45,51}, {30,40,50} p 数式をがんがん変形したら、かなり高…

Problem38

30分プログラム、その311。Problem38 - ProjectEuler。 192を1, 2, 3で掛けてみよう. 192 × 1 = 192 192 × 2 = 384 192 × 3 = 576積を連結することで1から9のPandigital数 192384576 が得られる. 192384576を 192と(1,2,3)の連結積と呼ぶ. 同じようにして, 9…

引数と返り値サポート

http://github.com/mzp/scheme-abc/commit/ee63e8f23b70c61ab5e0e9f5fbccd5dfc57b2b61 yn$ cat example/lambda.scm (let ((add (lambda (x y) (+ x y)))) (print (add 2 3))) $ ocamlbuild main.byte -- example/lambda.scm Finished, 53 targets (53 cached…

無名関数サポート

http://github.com/mzp/scheme-abc/commit/9e468c756dda1a20290686743f77408f187432b1とうとう関数が使えるようになった。 $ cat example/lambda.scm (let ((f (lambda () (print 42)))) (f)) $ ocamlbuild main.byte -- example/lambda.scm Finished, 53 ta…

OCamlでCpp

たまに、OCamlでも型を無視して字句的な操作をしたいことがある。そういうときはcamp4を使うのが正統な方法だろうけど、そこまで頑張りたくないときはCpp(C PreProcessor)を使うと便利。http://alohakun.blog7.fc2.com/blog-entry-459.htmlみないなネタもあ…

Probem37

30分プログラム、その310。Problem37 - ProjectEuler。 3797は面白い性質を持っている. まずそれ自身が素数であり, 左から右に桁を除いたときに全て素数になっている (3797, 797, 97, 7). 同様に右から左に桁を除いたときも全て素数である (3797, 379, 37, 3…

TwitterにGitHubのコミットログ

http://twitter.com/scheme_abcTwitterにGitHubのコミットログを出すようにしました。

関数関連のABC

関数に関係したABCを淡々と貼るよ。traitも調べないと無意味な予感はしてる。 サブルーチンっぽいやつ function f(){ } f(); 2 newfunction var undefined():* /* disp_id 0*/ 4 getglobalscope 5 swap 6 setslot 1 8 findpropstrict f 10 callproperty f (0…

Problem36

30分プログラム、その309。Problem36 - Project Euler。 585 = 10010010012 (2進) は10進でも2進でも回文数である. 100万未満で10進でも2進でも回文数になるような数の総和を求めよ. (注: 先頭に0を含めて回文にすることは許されない.) 0が条件を満すかどう…

letサポート

http://github.com/mzp/scheme-abc/commit/64fc87159119894bff8b2ada6ea97b488ca2f7f5とうとうletが使えるようになった。レキシカルスコープが使えるのはAS3に対して、アドバンテージになるんじゃね? $ cat example/let.scm (let ((x 42)) (let ((x 10)) (pr…

ActionScript3にブロックスコープはない

ActionScript3にブロックスコープはない。 var x = 0; { var x = 42; } print(x); // 42が出力される。 ちなにみforやwhileもスコープを導入しない。 別にこの仕様についてどうこう言うつもりはないけれど、AVM2でどうやってブロックスコープを実現したらい…

レキシカルスコープの実装が難しい

AVM2でレキシカルスコープを実現したいけれども、中々難しい。そもそもの原因は、ActionScript3の元となっているECMAScript3にレキシカルスコープが存在しないことにある。 とりあえず現状をまとめてみる。 各クラス・インスタンス・関数などは、Traitと呼ば…

Problem35

30分プログラム、その308。Problem35 - Project Euler。 197は巡回素数と呼ばれる. 桁を回転させたときに得られる数 197, 971, 719 が全て素数だからである. 100未満には巡回素数が13個ある: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, および97である. 1…

if文サポート

http://github.com/mzp/scheme-abc/commit/e54efa5c0092f49ae892cb15a14fa67816d89099 if文が使えるようになった。正確にはif式だけれども。 $ cat example/bool.scm (if (< 1 42) (print "big") (print "small")) $ ocamlbuild main.byte -- example/bool.s…

Problem34

30分プログラム、その307。Problem34 - Project Euler。 145は面白い数である. 1! + 4! + 5! = 1 + 24 + 120 = 145となる. 各桁の数の階乗の和が自分自身と一致するような数の総和を求めよ. 注: 1! = 1 と 2! = 2 は総和に含めてはならない. なんか、前々回…

変数関係の命令

AVM2で、どうやって変数を実現するか調査中。とりあえず、スタックの番号と名前の対応表がいる予感。 例 Flex3 SDKのasc.jarで var x=42;をコンパイルすると、 2 pushbyte 42 4 getglobalscope 5 swap 6 setslot 1が得られる。 関連してそうな命令 命令 補足…

Problem33

30分プログラム、その306。Problem33 - ProjectEuler。 49/98は面白い分数である. 「分子・分母の9をキャンセルしたので 49/98 = 4/8 が得られた」と経験を積んでいない数学者が誤って思い込んでしまうかもしれないからである. 我々は 30/50 = 3/5 のような…

boolean operatorに対応

http://github.com/mzp/scheme-abc/tree/master bool値を返す演算子がいくつか使えるようになった。が、リテラルの#tや#fには対応していない中途半端っぷり。#tのパース、面倒そうだなぁ。 $ cat bool.scm (print (> 1 10)) $ ocamlbuild main.byte -- bool.…

if文が難しい

if文への対応が予想以上に難しい。 jumpに、ジャンプするバイトオフセットを命令中に埋め込まないといけない。 でも、命令をバイト列に変換するのは出力直前なので、命令を生成する段階ではバイトオフセットを計算できない。しかも、命令の長さは可変長のも…

ocamlbuildプラグイン

トップディレクトリにmyocamlbuild.mlを置くと、それがOCamlBulidのプラグインとして使える。参考たとえば、ocamlfind用のプラグインを置けば、_tagsファイルに <*.ml> or "prog.byte": pkg_nums, pkg_strのように書けるようになる。すばらしい。公式ページ…

AutoDiscoveryするプラグイン書いた

http://howdyworld.org/opml/?TestURLを入力すると、AutoDiscoveryしてRSSのURLとかをとってくるプラグインを書いた。これで追加が楽になったはず。

命令を追加するのが面倒

scheme-abcで命令やASTをひとつ追加するたびに、バリアントをひとつ増やして、match ... withの節をひとつ増やすのが非常に面倒。Expression Problemだよなぁ。 OCamlのオブジェクトシステムを使えば普通に解決できそうだけど、それはそれでなんかヤダ。

Problem32

30分プログラム、その305。Project Euler - Problem32。 7254は面白い性質を持っている. 39 × 186 = 7254と書け, 掛けられる数/掛ける数/積に1から9の数が1回ずつ出現する. 掛けられる数/掛ける数/積に1から9の数が1回ずつ出現するような積の総和を求めよ. H…

if文関係の命令

AVM2 Overviewだと命令がABC順にならんでて読みづらいので、整理。tamarinのcore/opcodes.hだとオペコード順に並んでて読みやすいよ。 条件分岐 命令 補足 label branchするだろうところに書いておくと、本当にジャンプできるかチェックしてくれる ifnlt not…